【问题标题】:ubuntu grep - how to concatenate parts of substringubuntu grep - 如何连接子字符串的各个部分
【发布时间】:2018-02-02 10:25:50
【问题描述】:

我正在执行下面的 grep 语句

grep 'duration: [[:digit:]]\{4,\}' file_name.log | grep 'execute' | grep -o 'duration: [[:digit:]]\{4,\}.*' | grep -o '[[:digit:]]\{4,\}.*' | sort -g -r

它给了我这样的结果

26398.170 毫秒执行:SELECT ... bla-bla ...

987687.234 毫秒执行:SELECT ... bla-bla ...

我正在想办法做到这一点

26398 执行:SELECT ... bla-bla ...

987687 执行:SELECT ... bla-bla ...

类似grep -o '[[:digit:]]\{4,\}' + 'execute.*'

【问题讨论】:

  • 会建议从 file_name.log 本身添加一些示例行到问题中。我觉得该任务更适合 sed/awk 而不是 grep ...所以需要原始行才能工作与
  • 能不能在最后一个grep之后用sed,比如sed 's/\.[[:digit:]]\+ ms//g'
  • 顺便说一句,您的问题或答案中没有任何内容是特定于 Ubuntu 的。 Ubuntu 使用 GNU grep,就像几乎所有其他 Linux 平台以及许多其他平台一样。

标签: linux ubuntu grep pattern-matching concatenation


【解决方案1】:

grep 无法重新排序其输入,它只能提取匹配项或包含匹配项的行。

我建议使用 Awk,这也消除了长管道:

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 在输入行中查找与正则表达式匹配的子字符串的开始和结束,并填充变量RSTARTRLENGTH,以便您可以提取与substr() 匹配的字符串。我们在空格上拆分该字符串并提取第二个标记,这是匹配的数字部分,并将其截断为它的整数部分。 substr($0, RSTART+RLENGTH) 将字符串的其余部分从匹配的末尾拉到行尾。

如果您不擅长 awk 但擅长正则表达式,则可以使用更简单的 sed 脚本:

sed -n '/execute/!d;/.*duration: \([0-9]\{4,\}\)\.[0-9]* ms /!d;s//\1/p' file_name.log |
sort -g -r

【讨论】:

  • 谢谢。只是想澄清一下,awk 和 sed 使用一组文件作为文件掩码还是使用单个文件?实际上我有 awk '/execute/ && match($0, /duration: [0-9]{4,}\.[0-9]* ms /) { split (substr($0, RSTART, RLENGTH), d) ;打印 int(d[2]), substr($0, RSTART+RLENGTH) }' /logs/2018-01-*.log |排序 -g -r > /var/log/JanuaryScript
  • 像大多数带有文件名参数的 Unix 命令一样,您可以放置​​任意数量的文件,如果您不放置任何文件,该命令将读取标准输入。 catgrepsedawk,还有很多很多其他人都是这样的。 (一个常见的异常是tr,它根本不接受文件名参数。)如果“掩码”是指通配符,它​​会在任何命令运行之前由 shell 扩展为匹配文件的列表。跨度>
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 2011-06-27
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多