如何使用Grep从Bash中的字符串中提取文本

时间:2014-12-31 23:14:41

标签: regex bash grep cut

我一直在使用Grep with Cut从日志文件中收集信息,但是当行中的字数变化时,我无法提取字符串,例如;

该行可能是

[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)

字符串末尾的距离和时间(当它们改变值时)始终位于相同的位置,“日期/时间”和单词“Host:”始终位于字符串的开头。

这里有人能指出我需要使用的正确方向吗?

我尝试使用谷歌搜索而没有找到任何东西,但我不确定我在寻找什么。

由于

2 个答案:

答案 0 :(得分:1)

如果我理解正确的问题,这个实际上并不难。 regEx中的以下简单grep将仅返回每行的请求部分。

示例

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

<强> FILE.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),这将是最后捕获的东西。它也不需要任何管道或输出重定向。

思考就个人而言,当我在shell中工作并且必须像上面那样进行任何字符串操作时,我直接进入regEx,因为它是所有shell命令使用的在内部返回结果。例如,grep全局搜索正则表达式并打印。 RegEx是一个非常宝贵的工具,只需要几分钟的时间来学习它的基础知识。

答案 1 :(得分:1)

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

有趣的部分是最后一个grep

  • -P使用perl regex
  • -o仅输出匹配的部分
  • \K类似于后面的内容,但支持动态长度
  • .*\)符合您需要的部分