打印使用grep找到的正则表达式字符串



我有一个疯狂的长命令转换-(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的工作方式?该脚本没有变量,它只是一种简写,以避免键入许多难以记住的语法+值。

谢谢。

可以像一样简单

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

指定-o可以只返回与正则表达式匹配的内容。

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

也许是类似vosxlx | sed -n 's/(vm.* )(/.*)/1/p'的东西?

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

foo | perl -ne 'print $1 if /^(vm-d+)/'

您的grep版本可能没有扩展的regex支持:

$:/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$

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

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

也可以。

最新更新