【问题标题】:How to extract text from a string in Bash using Grep如何使用 Grep 从 Bash 中的字符串中提取文本
【发布时间】:2015-01-01 22:38:02
【问题描述】:

我一直在使用 Grep 和 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:”始终位于字符串的开头。

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

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

谢谢

【问题讨论】:

  • 这有帮助吗? grep Host: $FILE | tail -1 | grep -Po '.*Host: \K.*\)'
  • @Kent - 效果很好,非常感谢。我将确保我了解它是如何以及为什么起作用的。再次感谢您
  • 好的,我添加了答案并附有简要说明。

标签: regex bash grep cut


【解决方案1】:
grep Host: $FILE | tail -1 | grep -Po '.*Host: \K.*\)'

有趣的是最后一个grep

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

【讨论】:

  • 或者grep -Po 'Host: \K.*\)' $FILE | tail -1
【解决方案2】:

如果我正确理解了这个问题,这实际上并不难。 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)

REGEX100

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

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

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2013-06-21
    • 2011-01-02
    • 1970-01-01
    • 2017-01-05
    • 2015-06-19
    • 2013-05-29
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多