한 행에서 한 항목을 가져와서 다른 행의 항목과 결합합니다.

한 행에서 한 항목을 가져와서 다른 행의 항목과 결합합니다.

나는 다음을 가지고 있습니다 :

2018-11-10 23:57:21 [COMMAND]: sar -u 10 5

AIX host 1 7    11/10/18

System configuration: lcpu=64  mode=Capped

23:57:21    %usr    %sys    %wio   %idle   physc
23:57:31      10       7       0      83   16.00
23:57:41       9       6       0      85   16.00
23:57:51       9       6       0      85   16.00
23:58:01       9       7       0      84   16.00
23:58:11      10       6       0      84   16.00

Average        9       6       0      84   16.00

2018-11-10 23:58:21 [COMMAND]: sar -u 10 5

AIX host 1 7    11/10/18

System configuration: lcpu=64  mode=Capped

23:58:21    %usr    %sys    %wio   %idle   physc
23:58:31      10       8       0      82   15.99
23:58:41       9       6       0      85   16.00
23:58:51       9       6       0      85   16.00
23:59:01       9       6       0      84   16.00
23:59:11      10       6       0      83   16.00

Average       10       6       0      84   16.00

평균 시간을 구해야 합니다 %idle.

2018-11-10 23:57:21|84
2018-11-10 23:58:21|84

답변1

입력 파일을 있는 그대로 보려면 awk아래와 같은 간단한 명령으로 충분합니다.

awk '/sar/{ time=$1" "$2; next }/Average/{ print time"|"$5 }' file

답변2

몇 가지 옵션이 있습니다:

  • awk

    $ awk '/COMMAND/{printf "%s %s", $1,$2}/Average/{print "|"$5}' file 
    2018-11-10 23:57:21|84
    2018-11-10 23:58:21|84
    
  • perl

    $ perl -ale '$k="$F[0] $F[1]" if /COMMAND/; print "$k|$F[4]" if /Average/' file 
    2018-11-10 23:57:21|84
    2018-11-10 23:58:21|84
    

답변3

다음 한 줄의 Perl 코드가 트릭을 수행해야 합니다.

perl -lne'$d=$1 if /^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/;
if(/^Average\s+\S+\s+\S+\s+\S+\s+(\S+)/) {print "$d|$1";}'

(가독성을 높이기 위해 두 줄로 썼습니다.) 단, 입력을 해줘야 합니다. 파일 이름은 끝, <file_name시작, 끝 또는 파이프에 있습니다. 작동 방식은 다음과 같습니다.

  1. 처음에 날짜와 시간이 있는 줄을 찾아 기억해 보세요.
  2. 다음 줄로 이동 Average하여 기억된 날짜 및 시간 더하기 기호 |와 빈 열 구분 기호를 가정하여 다섯 번째 열에서 가져온 평균을 인쇄합니다.
  3. 포인트 1을 반복합니다.

관련 정보