awk / sed / grep提取具有特定模式的部分行

时间:2015-10-04 19:52:52

标签: awk sed grep

我正在尝试提取文件的明确部分,如下所示:

1443113312 mongo client connection created with mongodb://172.28.128.5:27017
1443113312 [OVERALL], RunTime(ms), 4864.0
1443113313 [READ], Return=0, 485
1443113313 [CLEANUP], 99thPercentileLatency(us), 4487.0
1443113314 [UPDATE], 99thPercentileLatency(us), 27743.0

这是我期待的输出:

mongodb://172.28.128.5 Operations=OVERALL 1443113312
mongodb://172.28.128.5 Operations=READ    1443113313
mongodb://172.28.128.5 Operations=CLEANUP 1443113313
mongodb://172.28.128.5 Operations=UPDATE  1443113314

我真的很感激任何建议。感谢。

3 个答案:

答案 0 :(得分:3)

$ awk -F'[][ \t:]+' '/mongodb/{a=$(NF-2)":"$(NF-1);next} a{printf "%s Operations=%-7s %s\n",a,$2,$1}' file
mongodb://172.28.128.5 Operations=OVERALL 1443113312
mongodb://172.28.128.5 Operations=READ    1443113313
mongodb://172.28.128.5 Operations=CLEANUP 1443113313
mongodb://172.28.128.5 Operations=UPDATE  1443113314

如何运作

  • -F'[][ \t:]+'

    这会将字段分隔符设置为空格,制表符,冒号或方括号([])的任意组合。

  • /mongodb/{a=$(NF-2)":"$(NF-1);next}

    如果该行包含mongodb,那么我们会保存变量a中的第三个和倒数第二个字段。

  • a{printf "%s Operations=%-7s %s\n",a,$2,$1}

    如果已为变量a分配了值,则根据问题打印出重新格式化的当前值。

变异

这会生成mongo字符串但不会生成IP并将操作放入parens:

$ awk -F'[][ \t:]+' '/mongodb/{a=$(NF-2);next} a{printf "%s\tOperations=\"%s\"\t%s\n",a,$2,$1}' file
mongodb Operations="OVERALL"    1443113312
mongodb Operations="READ"       1443113313
mongodb Operations="CLEANUP"    1443113313
mongodb Operations="UPDATE"     1443113314

答案 1 :(得分:1)

Perl救援!

perl -nwe 'if (m=mongo client connection created with (mongodb://[0-9.]+)=) {
               $url = $1;
           } elsif (/^([0-9]+) \[([[:upper:]]+)\]/) {
               print "$url Operations=$2 $1\n";
           }' input-file

说明:-n逐行读取输入。每次遇到“创建”字符串时,URL都会保存在$ url变量中。每次遇到数字(时间戳?)加上方括号中的大写单词时,都会打印带有操作和时间戳的URL。

答案 2 :(得分:1)

这可能适合你(GNU sed& printf):

sed -rn '\|://|h;G;s/^(\S+) \[(\S+)\].* (\S+):.*/printf "%s Operations=%-7s %s" \3 \2 \1/ep' file

这使用GNU sed的e标志来评估模式空间。或者,可以通过将printf命令传递给shell来在单独的过程中完成评估,所以:

sed -rn '\|://|h;G;s/^(\S+) \[(\S+)\].* (\S+):.*/printf "%s Operations=%-7s %s\n" \3 \2 \1/p' | sh