【问题标题】:Print regex string found with grep打印用 grep 找到的正则表达式字符串
【发布时间】:2021-04-19 05:57:00
【问题描述】:

我有这个疯狂的长命令转换(bash)脚本,它输出一个带有对象的小表以及一些与之相关的其他数据。我想单出对象的名称以将其用作变量以进一步运行更多命令。

它输出如下内容:

ID          PATH       NAME           VERSION             UPGRADE STATUS
vm-13034    /abc/def   somethingelse  vX.X.X-XXX-XXXXXXX  Up to date

我感兴趣的值是 ID,它始终是 vm-#####。使用在线工具,我想出了正则表达式^vm-\d{5,}$, bc,数字在增加)。所以我认为vosxls | grep -E ^vm-\d{5,}$(vosxls 是长命令的脚本名称)可以工作,但它什么也不返回。我尝试使用-w-egrep -e "vm-\d{5,}" <(vosxls) 和更多添加和删除封闭的^$ 字符,当它会引发错误时,将字符串括在软引号和硬引号中或什么都不用无论如何都行。

其他没有出错的东西,什么都没有返回。

我阅读了一些关于 Perl 的示例和类似的东西,但我没有这样做,并且通常尽可能保持基本,这样我就可以在另一个系统中运行它而不会出现问题。我从最基本的东西(无论如何我都知道)中转移的最多的是egrep,如果我没记错的话,我相信它与grep -e相同。

如何打印字符串?是因为我已经在使用脚本,它会以某种方式影响 grep 的工作方式吗?该脚本没有变量,它只是一种简写方式,以避免输入很多难记的语法+值。

谢谢。

【问题讨论】:

  • cut -f1 -d' ' 也许。可能其他东西更好。

标签: bash grep pipe


【解决方案1】:

可以这么简单

vosxls | grep -Eo "^vm-\d{5,}"

指定 -o 允许您仅返回与正则表达式匹配的任何内容。

-o, --only-matching
    Prints only the matching part of the lines.

【讨论】:

    【解决方案2】:

    可能类似于vosxlx | sed -n 's/\(vm.*\ \)\(\/.*\)/\1/p'

    或者vosxlx | awk '/vm/ {print $1}'

    【讨论】:

    • 谢谢,@taylor-g 工作得很好,也是最简单的,但我一直想了解 sedawk 有一段时间了,但我一直忘记。我想这和任何时候一样好。再次感谢!
    【解决方案3】:
    foo | perl -ne 'print $1 if /^(vm-\d+)/'
    

    您的 grep 版本可能没有扩展的正则表达式支持:

    $:/mnt/c/Users/sukuj$ cat /tmp/s.txt
    ID          PATH       NAME           VERSION             UPGRADE STATUS
    vm-13034    /abc/def   somethingelse  vX.X.X-XXX-XXXXXXX  Up to date
    vm-23034    /abc/def   somethingelse  vX.X.X-XXX-XXXXXXX  Up to date
    
    $:/mnt/c/Users/sukuj$ grep -oE 'vm-[0-9]+' /tmp/s.txt
    vm-13034
    vm-23034
    
    $:/mnt/c/Users/sukuj$ grep -oE 'vm-[0-9]{5,}' /tmp/s.txt
    vm-13034
    vm-23034
    
    $:/mnt/c/Users/sukuj$ grep -V
    grep (GNU grep) 3.4
    Copyright (C) 2020 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Written by Mike Haertel and others; see
    <https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
    suku@DESKTOP-GID8MQV:/mnt/c/Users/sukuj$
    

    【讨论】:

      【解决方案4】:

      您不能将\d 与grep 的-E 选项一起使用来表示数字。 -P-Po 将起作用。但是,如果您已经知道需要输出 last 行的 first 字段,则不需要 grep。一个

      vosxlx | tail -n 1 | cut -d ' ' -f 1 
      

      也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多