首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将grep命令和sed命令组合在同一个文本文件上,并将其输出到另一个文件?

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

Ask Ubuntu用户
提问于 2021-06-14 09:38:18
回答 1查看 617关注 0票数 0

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

代码语言:javascript
复制
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

我的预期产出:

代码语言:javascript
复制
2021-06-12 21:59:41  213550040214 

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

代码语言:javascript
复制
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

但是这个命令没有给出任何输出。我怎样才能得到预期的输出?

EN

回答 1

Ask Ubuntu用户

发布于 2021-06-14 09:53:24

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

代码语言:javascript
复制
grep -Eo "[0-9]{12}" 

这将准确地查找12个连续数字,但从来没有12个连续数字,因为第一个grep只输出日期和时间,因此行的其余部分已经丢失。

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

代码语言:javascript
复制
$ awk 'NF>10{print $1,$2,$11}' file
2021-06-12 20:59:41.118 213550040214

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

代码语言:javascript
复制
$ 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个数字的最后一段,所以如果您有多个这样的集合,它就会失败。我们可以给您一个更具体的解决方案,但您必须提供更详细的文件,什么是可变的,什么永远不会改变。

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1345771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档