如何从模式中打印第n行?

我正在试图制作一个脚本,以简短格式汇总一个包含以下日志的文件。

日志片段:

$ cat input.txt ffffff 1301 2012-08-29T03:13:33 clr crit Some serious problem cccc dddddd eeeeee bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Some serious problem in system. ffffff 1302 2012-08-29T03:13:33 set min Some serious problem cccc dddddd eeeeee bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Some minor problem in system. 

期望的输出:

 2012-08-29T03:13:33 clr crit Some serious problem in system. 2012-08-29T03:13:33 set min Some minor problem in system. 

我尝试下面的接近:

 $ cat input.txt | grep -iE "set|upd|clr" | awk '{print $3,$4,$5}' >file1 12-08-29T03:13:33 clr crit 12-08-29T03:13:33 set min 

下面的命令从模式“T”给我第五行,但是问题在于所需的文本行,有些情况下是在第五行,有些情况下是在第四行。

 $ awk '/T/ { show[NR+4]++ } show[NR]' input.txt >file2 $ paste file1 file2 

查询:

在某些情况下,它在第五行,在某些情况下,在第四行。 我怎样才能确保find确切的文字。 请让我知道如果可能的话。

解决这个问题的正确方法就是将Awakes Record Separator设置为空字符串,以便awk知道您的输入记录由空行分隔:

 $ awk -v RS= -F'\n' '{split($1,a,/ +/); print a[3],a[4],a[5],$NF}' file 2012-08-29T03:13:33 clr crit Some serious problem in system. 2012-08-29T03:13:33 set min Some minor problem in system. 

这样,如果/将来要打印记录的其他部分,或打印记录数或只打印基于某些关键字段或其他内容的唯一记录,这是绝对微不足道的,因为awk知道并正在记录。

看起来你有一个7行的固定记录大小,所以你可以用awk来做以下事情:

 $ awk 'NR%7==1{printf "%s %s %s ",$3,$4,$5}NR%7==6' file 2012-08-29T03:13:33 clr crit Some serious problem in system. 2012-08-29T03:13:33 set min Some minor problem in system. 

这使用模运算符来打印记录中第一行的第三,第四和第五个字段,并打印整个第六行。

这awk单行应该更加健壮:

 awk '$3 ~ /[0-9]+-[0-9]+-/{printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5; for(i=0; i<5; i++) getline; print OFS $0}' input.txt 2012-08-29T03:13:33 clr crit Some serious problem in system. 2012-08-29T03:13:33 set min Some minor problem in system. 

更新::解决方案没有getline:

 awk '$3 ~ /[0-9]+-[0-9]+-/{s=NR; printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5} NR==s+5{print OFS $0}' input.txt