如何将 grep 命令和 sed 命令结合在同一个文本文件上并将输出到另一个文件?

如何将 grep 命令和 sed 命令结合在同一个文本文件上并将输出到另一个文件?

我从 grafana 日志资源管理器复制了以下日志。

2021-06-12 21:59:41 
2021-06-12 20:59:41.118  INFO 1 --- [edElastic-14048] c.o.i.i.s.i.UserManagementServiceImpl    : BUNDLE_PURCHASE_FAILED || 213550040214 |  Failed to Do Simple Bundle Purchase  For Transaction 5001235315807102834, Error JSON decoding error: Cannot deserialize value of type

我的预期输出:

2021-06-12 21:59:41  213550040214 

我使用下面的命令来获得我预期的输出:

grep -Eo "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}" bfailed.txt | grep -Eo "[0-9]{12}" | sed '/[a-zA-Z]/d' > b.txt

但此命令没有任何输出。我怎样才能获得预期的输出?

答案1

您的命令没有输出,因为第二个grep命令不匹配任何内容:

grep -Eo "[0-9]{12}" 

它寻找的是正好 12 个连续的数字,但是你永远不会得到 12 个连续的数字,因为你的第一个grep只打印出日期和时间,所以其余行已经丢失。

如果您的输入确实只是显示的两行,那么您所需要做的就是在至少有 11 个字段的行上打印第 1、第 2 和第 11 个字段:

$ awk 'NF>10{print $1,$2,$11}' file
2021-06-12 20:59:41.118 213550040214

如果您有更多行并且确实需要匹配特定的日期和时间格式,您可以尝试这个:

$ sed -En 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*([0-9]{12}) .*/\1 \2/p' file 
2021-06-12 20:59:41 213550040214

启用-E扩展正则表达式,简化此处的语法,并指示-n默认sed情况下不打印任何内容。然后,替换运算符 ( s/old/new/) 将尝试匹配您要查找的格式并捕获它们(括号“捕获”模式),以便我们可以仅用两个匹配的部分 ( \1 \2) 替换所有内容。

请注意,这将找到最后的12 个数字的延伸,因此如果您有多个这样的集合,它将失败。我们可以为您提供更具体的解决方案,但您必须向我们提供有关您的文件的更多详细信息,包括哪些是可变的以及哪些是永远不会改变的。

相关内容