我从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但是这个命令没有给出任何输出。我怎样才能得到预期的输出?
发布于 2021-06-14 09:53:24
您的命令没有输出,因为第二个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/)将尝试匹配您要寻找的格式并捕获它们(括号" capture“模式),这样我们就可以用两个匹配的部分(\1 \2)替换所有内容。
请注意,这将找到12个数字的最后一段,所以如果您有多个这样的集合,它就会失败。我们可以给您一个更具体的解决方案,但您必须提供更详细的文件,什么是可变的,什么永远不会改变。
https://askubuntu.com/questions/1345771
复制相似问题