2014-03-12 2 views
8

나는 파일 n 줄을 반복하고 어떤 i between 1 and n - 1에 대해서도 line(n - 1) - line(n)을 얻을 필요가있다.연속적인 라인 사이의 리눅스 차이점

[email protected]:/var/www# cat cron.log | grep "/dev/vda" 
/dev/vda   20418M 14799M  4595M 77%/
/dev/vda   20418M 14822M  4572M 77%/
/dev/vda   20418M 14846M  4548M 77%/
/dev/vda   20418M 14867M  4527M 77%/
/dev/vda   20418M 14888M  4506M 77%/
/dev/vda   20418M 14910M  4484M 77%/
/dev/vda   20418M 14935M  4459M 78%/
/dev/vda   20418M 14953M  4441M 78%/
/dev/vda   20418M 14974M  4420M 78%/
/dev/vda   20418M 15017M  4377M 78%/
/dev/vda   20418M 15038M  4356M 78%/
[email protected]:/var/www# cat cron.log | grep "/dev/vda" | cut -b 36-42 | tr -d " M" 
4595 
4572 
4548 
4527 
4506 
4484 
4459 
4441 
4420 
4377 
4356 

/dev/vda... 라인 cron.log 파일에 df -BM으로 시간당 로그인과 선 사이의 차이가 시간당 디스크 사용량을 표시합니다 : 여기

그리고

소스 파일입니다.

그래서, 예상 출력 될 것입니다 :

23 (4595 - 4572) 
24 (4572 - 4548) 
... 
43 (4420 - 4377) 
21 (4377 - 4356) 

나는 () 사이에있는 텍스트가 필요하지 않습니다, 난 단지 설명을 보려면 여기를 넣어. 내가 제대로을 가지고있는 경우

답변

11

는 잘 모르겠지만, 다음 awk 스크립트가 작동해야합니다

awk '{if(NR>1){print _n-$4};_n=$4}' your.file 

출력 :

23 
24 
21 
21 
22 
25 
18 
21 
43 
21 

당신은에서 다른 프로그램이 필요하지 않습니다 파이프. 바로 :

awk '/\/dev\/vda/ {if(c++>0){print _n-$4};_n=$4}' src/checkout-plugin/a.txt 

으로 충분합니다. awk 스크립트의 시작에서 정규식은 패턴과 일치하는 행에만 다음 블록을 적용하도록 awk에 지시합니다. 부작용은 NR을 더 이상 사용하여 계산이 시작되는 "두 번째 줄"을 감지 할 수 없다는 것입니다. 그 목적을 위해 손님 카운터 c을 소개했습니다.

또한 awk은 숫자 계산에이 열이 사용되었으므로 M을 제거합니다.

+2

멋진 답변입니다. '/ dev/vda'로 시작하는 줄을 선택하는 패턴을 추가하는 방법을 OP와 함께 고려해 볼 수도 있습니다. 그래서 awk/^ \/dev \/vda/.... 'OriginalLogFile을 실행할 수 있습니다. grep first. –

+0

@MarkSetchell 물론 파이프의 다른 프로그램은 필요하지 않습니다. 내 업데이트를 확인하십시오. – hek2mgl

+0

당신은 내 표를 얻습니다 :-) –