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

Regex 如何使用Grep从Bash中的字符串中提取文本,regex,bash,grep,cut,Regex,Bash,Grep,Cut,我一直在使用Grep with Cut从日志文件中收集信息,但是当行中的字数发生变化时,我提取字符串时遇到问题,例如 线路可能是 [2014-12-31 21:00] Host: Word1 (LOCATION) [140.56 km] 38.582 ms 或 或 用我现在的代码 host_=`grep Host: $FILE | tail -1 | cut -d' ' -f4-` 我能得到以下信息 Word1 Word2 (LOCATION) [140.56 km] 38.582 ms

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

线路可能是

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

用我现在的代码

host_=`grep Host: $FILE | tail -1 | cut -d' ' -f4-`
我能得到以下信息

Word1 Word2 (LOCATION) [140.56 km] 38.582 ms
我想做的是只得到单词加上括号中的位置,而不是剩下的信息,这样我就得到了这个

Word1 Word2 (LOCATION)
字符串末尾的距离和时间(当它们更改值时)始终位于同一位置,“日期/时间”和“主机:”始终位于字符串的开头

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

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


谢谢

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

示例

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)

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

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

grep Host: $FILE | tail -1 | grep -Po '.*Host: \K.*\)'
有趣的部分是最后一个
grep

  • -P使用perl正则表达式
  • -o仅输出匹配部分
  • \K
    与look behind类似,但支持动态长度
  • *\)
    匹配您需要的零件

这有帮助吗
grep-Host:$FILE | tail-1 | grep-Po.*主机:\K.\)
@Kent-非常好用,谢谢。我将确保我了解如何以及为什么这样做。再次感谢您,我添加了答案并做了简要解释。或者,
grep-Po'Host:\K.*\”$FILE|tail-1
Word1 (LOCATION)
Word1 Word2 (LOCATION)
Word1 Word2 Word3 (LOCATION)
grep Host: $FILE | tail -1 | grep -Po '.*Host: \K.*\)'