我从 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 个数字的延伸,因此如果您有多个这样的集合,它将失败。我们可以为您提供更具体的解决方案,但您必须向我们提供有关您的文件的更多详细信息,包括哪些是可变的以及哪些是永远不会改变的。