2012-11-16 4 views
0

파일에서 특정 개수를 가져와야합니다. 예에 (, 그것은 하나의 병합의 수를 놓치게되는 결과로그 파일에서 grep을 얻어 개수

2500 rows merged. 
2500 rows merged. 
2500 rows merged. 
2500 rows merged.2500 rows merged. 
2500 rows merged. 
2500 rows merged. 

:

counter_pstn=0 
completed_count_pstn=0 
rec=0 
for rec in `(grep "merged" update_completed*.log | awk '{print $1}' | sed 's/ //g' | cut -d':' -f2)` 
do 
if [ $counter_pstn -eq 0 ] 
then 
completed_count_pstn=$rec 
else 
completed_count_pstn=$(($completed_count_pstn+$rec)) 
fi 
counter_pstn=$(($counter_pstn+1)) 
done 
echo "Completed Orders PSTN Primary " $completed_count_pstn 

그러나 로그 파일이 형식의 데이터가 포함되어 내가 사용하고 그렙 문은 다음과 같다 출력의 4 행). grep을 수정하거나 다른 함수를 사용하여 카운트를 얻으십시오. 2500 번호는 아마도 다른 로그에 대한 것입니다. 그래서 우리는 카운트를 얻기 위해 "병합 된 행"패턴을 사용해야합니다. -o, -w grep 옵션을 시도했지만 작동하지 않습니다. 데이터 위에서

예상 출력 :

17500 

실제 출력을 보여주는 :

15000 

답변

2
perl -p -lne 's/merged./merged.\n/g' your_file|awk '{a+=$1}END{print a}' 
+0

THanks, 이것이 효과가있다. – subodh1989

0

당신 그렙 -V 출력은 무엇인가?

어쨌든, 당신은 그렙없이 작업을 수행 할 수 있습니다 '.'

kent$ echo "2500 rows merged. 
2500 rows merged. 
2500 rows merged. 
2500 rows merged.2500 rows merged. 
2500 rows merged. 
2500 rows merged."|sed 's/merged\./\n/g'|awk '{x+=$1}END{print x}'                           
17500 
+0

이 당신 빌려 출력으로 17500을 보여주고있다 ... 그것은 내에서 15000를 인쇄 becoz : 그 이후 레코드 분리는 indicat 각 레코드의 끝 부분에 원하는 것으로 보인다 (... . 어떻게 그 일이 일어날 수 있는지 이해하지 못한다. 어쨌든 grep -v는 merge part.do를 제외하고 긴 로그 스크립트이다. 여기에 넣길 바란다. – subodh1989

2

그냥 함께 AWK 사용

sed 's/merged\./\n/g' file|awk '{x+=$1}END{print x}' 

테스트

$ cat file 
2500 rows merged. 
2500 rows merged.2500 rows merged. 
2500 rows merged. 

$ awk -v RS='.' '/merged/{sum+=$1} END{print "sum=" sum}' file 
sum=10000 
관련 문제