我一直在使用 Grep 与剪切从日志文件中收集信息,但遇到困难提取字符串,当单词计数中所行的更改,如;

行可以为

[2014-12-31 21:00] Host: Word1 (LOCATION) [140.56 km] 38.582 ms

[2014-12-31 12:00] Host: Word1 Word2 (LOCATION) [76.50 km] 49.508 ms

[2014-12-31 12:00] Host: Word1 Word2 Word3 (LOCATION) [76.50 km] 49.508 ms

使用我当前的代码,

host_=`grep Host: $FILE | tail -1 | cut -d' ' -f4-`

我可以获取以下工具

Word1 Word2 (LOCATION) [140.56 km] 38.582 ms

我想是只获取的词加上方括号并不是剩余的信息中的位置,这样我会得到如下

Word1 Word2 (LOCATION)

距离和时间 (尽管它们会更改的值) 的字符串的末尾都在那个相同的位置和"日期/时间"和词"主机:"都是在字符串的开头。

这里任何人是否可以点我到我需要使用正确的方向?

我有尝试过 googling,找不到任何东西,但我不完全确定我正在寻找的内容。

谢谢

2014-12-31 00:00:00
问题评论:

这帮助了呢?grep Host: $FILE | tail -1 | grep -Po '.*Host: K.*)'

@Kent-的完美的工作,非常感谢。我将确保我了解如何以及为什么它的运行方式。再次感谢您

好吧,我添加了作为答案和简要说明。

回答:

grep Host: $FILE | tail -1 | grep -Po '.*Host: K.*)'

有趣的部分是最后一个grep:

  • -P 使用 perl 正则表达式
  • -o 输出只匹配部分
  • K类似滞后,但支持动态长度
  • .*)符合您需要的部分

也许grep -Po 'Host: K.*)' $FILE | tail -1

这就是实际上不困难时我正在理解问题的权限如何。grep您在下面的简单regEx将返回的每一行只请求的部件。

示例

grep -Po  '((?:w+s?)*(w+))' FILE.TXT

文件。TXT

[2014-12-31 21:00] Host: Word1 (LOCATION) [140.56 km] 38.582 ms
[2014-12-31 12:00] Host: Word1 Word2 (LOCATION) [76.50 km] 49.508 ms
[2014-12-31 12:00] Host: Word1 Word2 Word3 (LOCATION) [76.50 km] 49.508 ms

结果

Word1 (LOCATION)
Word1 Word2 (LOCATION)
Word1 Word2 Word3 (LOCATION)

REGEX100

直到您到达一个(word)将被捕获的最后一件事,它将永远匹配。它也不需要任何管道或重定向输出。

想法个人在我的工作中一个外壳以及应该做任何像您正在执行的字符串操作上面转直的regEx是什么所有 shell 命令内部都使用以返回您的结果。采用例如grep全局搜索的正则表达式和打印正则表达式是一个宝贵的工具,实际上只需要几分钟的时间来学习的基础知识。

请输入您的翻译

How to extract text from a string in Bash using Grep

确认取消