Regex 如何使用Grep从Bash中的字符串中提取文本
我一直在使用Grep with Cut从日志文件中收集信息,但是当行中的字数发生变化时,我提取字符串时遇到问题,例如 线路可能是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
[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仅输出匹配部分
与look behind类似,但支持动态长度\K
匹配您需要的零件*\)
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.*\)'