我正在执行以下grep语句
grep 'duration: [[:digit:]]\{4,\}' file_name.log | grep 'execute' | grep -o 'duration: [[:digit:]]\{4,\}.*' | grep -o '[[:digit:]]\{4,\}.*' | sort -g -r
它给我的结果如
26398.170 ms执行:SELECT ... bla-bla ...
987687.234 ms执行:SELECT ... bla-bla ...
我'我想弄清楚如何制作它
26398执行:SELECT ... bla-bla ...
987687执行:SELECT ... bla-bla ...
类似于grep -o '[[:digit:]]\{4,\}' + 'execute.*'
答案 0 :(得分:1)
KeyError: 'foo'
无法重新排序其输入,它只能提取匹配或包含匹配的行。
我建议使用Awk,这也消除了长管道:
grep
awk '/execute/ && match($0, /duration: [0-9]{4,}\.[0-9]* ms /) {
split (substr($0, RSTART, RLENGTH), d);
print int(d[2]), substr($0, RSTART+RLENGTH) }' file_name.log |
sort -g -r
在输入行中找到与正则表达式匹配的子字符串的开头和结尾,并填充变量match
和RSTART
,这样就可以拉出匹配的字符串与RLENGTH
。我们在空格上拆分该字符串并提取第二个标记,这是匹配的数字部分,并将其截断为其整数部分。 substr()
从匹配结束到结束时拉出剩余的字符串。
如果你对Awk不好但对正则表达式有好处,你可以使用更简单的substr($0, RSTART+RLENGTH)
脚本:
sed