从一行中获取一件事并将其与另一行中的一件事连接起来

从一行中获取一件事并将其与另一行中的一件事连接起来

我有以下内容:

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 点重复。

相关内容