我一直在使用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:”始终位于字符串的开头。
这里有人能指出我需要使用的正确方向吗?
我尝试使用谷歌搜索而没有找到任何东西,但我不确定我在寻找什么。
由于
答案 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
:
\K
类似于后面的内容,但支持动态长度.*\)
符合您需要的部分