我有以下内容:
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
开头或结尾,或者管道即可。工作原理是这样的:
- 找到开头有日期和时间的行并记住它。
- 转到
Average
开头为 的行,然后打印记住的日期和时间加上符号|
以及从假设空白列分隔的第五列中获取的平均值。 - 第 1 点重复。