使用AWK和PATTERN提取信息

时间:2016-10-21 13:19:43

标签: bash awk

我的文件中包含与此处显示的部分类似的信息:

 ***Message size:   100000 *** best  /  avg  / worst (MB/sec)
       task pair:    0 -    1:    7423.55 / 6960.54 / 46.69
       OVERALL AVERAGES:          7423.55 / 6960.54 / 46.69  
 ***Message size:    200000 *** best  /  avg  / worst (MB/sec)
       task pair:    0 -    1:    7423.55 / 6960.54 / 46.69
       OVERALL AVERAGES:          7423.55 / 6960.54 / 46.69

我希望使用与awk相关的Message size提取确定的信息,例如,如果我想从我将获得的avg行中提取OVERALL AVERAGES信息:

100000   6960.54
200000   6960.54

我可以轻松获取该文件的所有Message sizes或所有avg

awk '/size:/  { print $3}' filename
awk '/size:/  {for(i=2; i<=2; i++) {getline;  print $8}}' filename

但我希望找到一种以类似的列方式一起获取所有信息的方法。

4 个答案:

答案 0 :(得分:1)

只需将邮件大小放入变量ms

awk '/***Message size:/{ms=$3} ms && /OVERALL AVERAGES:/{print ms,$5; ms=""}' file

答案 1 :(得分:1)

在sed的帮助下:

sed  -n '/ size:/{N;s/.* size: *\([0-9]*\)[^\n]*\n/\1/p}' input_file | \
     awk '{print $1, $9}'

答案 2 :(得分:1)

你可以使用它;

awk '/size:/  { printf $3};/OVERALL/  { print "\t" $5}'

实施例

user@host $ awk '/size:/  { printf $3};/OVERALL/  { print "\t" $5}' test
100000  6960.54
200000  6960.54

答案 3 :(得分:1)

如果Perl是一个选项:

perl -ane 'if (/size:/){print $F[2]} elsif(/OVERALL/){print "\t$F[4]\n"}' text

输出:

100000  6960.54
200000  6960.54

使用以下命令行选项:

  • -n循环输入文件的每一行
  • -a autosplit模式 - 将输入行拆分为@F数组
  • -e执行perl代码

@F是每行中的单词数组,从$F[0]开始编制索引 $F[2]@F中的第三个元素 $F[4]@F

中的第五个元素