ubuntu grep - 如何连接子串的部分

时间:2018-02-02 10:25:50

标签: linux ubuntu grep pattern-matching concatenation

我正在执行以下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.*'

1 个答案:

答案 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 在输入行中找到与正则表达式匹配的子字符串的开头和结尾,并填充变量matchRSTART,这样就可以拉出匹配的字符串与RLENGTH。我们在空格上拆分该字符串并提取第二个标记,这是匹配的数字部分,并将其截断为其整数部分。 substr()从匹配结束到结束时拉出剩余的字符串。

如果你对Awk不好但对正则表达式有好处,你可以使用更简单的substr($0, RSTART+RLENGTH)脚本:

sed