【问题标题】:grep from beginning of found word to end of wordgrep 从找到的单词的开头到单词的结尾
【发布时间】:2013-07-12 18:55:21
【问题描述】:

我正在尝试 grep 输出未知文本和每行目录的命令的输出。下面是我的意思的一个例子:

.MHuj.5.. /var/log/messages

文本和目录可能因时间或系统而异。我想做的只是能够将目录grep出来并将其发送到变量。

我环顾四周,但不知道如何 grep 到单词的末尾。我知道我可以开始搜索短语寻找“/”,但我不知道如何告诉 grep 在单词末尾停止,或者它是否会将下一个“/”视为新单词。列出的目录可能会改变,所以我不能假设每次都会列出相同数量的目录。在某些情况下,会列出多行,并且每行都会在其输出中包含一个目录列表。感谢您提供的任何帮助!

【问题讨论】:

    标签: grep


    【解决方案1】:

    如果您的目录路径没有空格,那么您可以这样做:

    $ echo '.MHuj.5.. /var/log/messages' | awk '{print $NF}'
    /var/log/messages
    

    【讨论】:

    • 我将命令的输出通过管道传输到 awk '{print $NF}' 并成功找到了目录。它还在输出中添加了一个新的空白行。有没有一种方法可以在不将新行附加到输出底部的情况下获取 awk 命令的输出?谢谢!
    • @user2569472 试试awk '$NF~/\//{print $NF}'
    • @djf 我认为是 14 秒之类的! :)
    • @JS웃 我的老英语老师会说:伟大的思想都一样; )
    【解决方案2】:

    从单个示例中我们是否可以概括这一点尚不清楚,例如斜线的第一次出现标志着您要提取的数据的开始。如果成立,请尝试

    grep -o '/.*' file
    

    要获取最后一个空格之后的所有内容,请尝试

    grep -o '[^ ]*$' file
    

    如需更高级的模式匹配和提取,请查看sed、Awk、Perl 或 Python。

    【讨论】:

      【解决方案3】:

      您的线路可以描述为:

      ^\S+\s+(\S+)$
      

      假设空格是随机文本和目录之间的分隔符。它只是将空白与非空白分开并捕获第二部分。

      或者您可能想查看单词边界字符类:\b

      【讨论】:

      • Basic POSIX grep 不支持这些 Perl 模式,但如果您有 grep -P,您将拥有更多的权力。
      • 我试过了,但是没有用。命令运行,但没有输出。
      【解决方案4】:

      我知道你说过要使用 grep,但我不得不提一下,这是使用 awk 轻松完成的:

      awk '{ print $NF }' input.txt
      

      这是假设空格是分隔符并且路径不包含任何空格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多