【问题标题】:using Grep to output a string使用 Grep 输出字符串
【发布时间】:2021-07-10 22:29:46
【问题描述】:

运行命令时,我得到一个输出图表的输出:

+---------+------------------------------------------------------+
| Key     | Value                                                |
+---------+------------------------------------------------------+
| Address | longstringofcharacters |
+---------+------------------------------------------------------+
| Name    | word1-word2-word3                              |
+---------+------------------------------------------------------+

我可以使用 grep Name 来获取包含单词 Name 的行。

我用什么 grep 只输出 word1-word2-word3 的字符串?

我尝试过grep '*-*-*',但这不起作用。

【问题讨论】:

    标签: string grep wildcard


    【解决方案1】:

    使用 GNU grep,您可以使用基于 PCRE 正则表达式的解决方案,例如

    grep -oP '^\h*\|\h*Name\h*\|\h*\K\S+' file
    

    请参阅online demoregex demo

    • -o - 仅输出匹配
    • P - 启用 PCRE 正则表达式引擎
    • ^ - 字符串开头
    • \h*\|\h* - 一个 | 字符,包含可选的水平空格
    • Name - 一句话Name
    • \h*\|\h* - 一个 | 字符,包含可选的水平空格
    • \K - 匹配重置运算符,丢弃到目前为止匹配的文本
    • \S+ - 一个或多个非空白字符。

    使用 GNU awk:

    awk -F'[|[:space:]]+' '$2 == "Name"{print $3}' file
    

    将字段分隔符设置为匹配一个或多个| 字符或空格的[|[:space:]]+ 正则表达式,检查组2 是否等于Name 并获取字段3。

    任何awk(如果你需要提取像nonwhitespaces(-nonwhitespaces)+这样的字符串):

    awk 'match($0, /[^ -]+(-[^ -]+)+/) { print substr($0, RSTART, RLENGTH) }' file
    

    this online demo

    【讨论】:

    • 谢谢,这是一个完美的答案。已经开始运行了!
    【解决方案2】:

    使用 awk 的简单解决方案是:

    awk '/Name/{ print $4 }'
    

    /Name/ 部分是如何 awk “greps”。 { print $4 } 位表示打印第四个空格分隔的单词。

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多