我正在尝试提取文件的明确部分,如下所示:
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
我真的很感激任何建议。感谢。
答案 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