我有一堆字符串必须从-
中获取“ port_num”"76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0"
该单词可能在字符串中的不同位置,并且长度可能不同,但是它始终在其前面加上';'来表示'port_num ='。之后...
我只想要这个位-'switch01'
当前我使用-
| grep -Eo 'port_num=.+' | cut -d"=" -f2 | cut -d";" -f1'
但是必须有更好的方法
答案 0 :(得分:1)
这就是我要使用的:
... | grep -E 'port_num=.+' | sed 's/^.*port_num=\([^;]*\).*$/\1/'
无论在-o
上使用grep
还是不运行,-P
的可用性取决于您使用的grep
的版本。 (例如,我的grep
没有它)。我并不是说依赖-P
的其他答案都没有好处-对我来说,它们看起来不错。但是grep -P
的可移植性较差。
恕我直言,将grep
与sed
进行管道连接允许每个实用程序执行其专门研究的工作-grep
用于选择行,sed
用于修改行。>
答案 1 :(得分:1)
如果运行以下命令,则可以尝试grep -oP '(?<=port_num=).+(?=;)'
:
echo "76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0" \
| grep -oP '(?<=port_num=).+(?=;)'
结果将是:
switch01
更新后的答案:grep -oP '(?<=port_num=)[^;]+(?=;)'
答案 2 :(得分:1)
... | grep -Po 'port_num.+(?=;)'
这使用grep
的Perl兼容正则表达式(PCRE)语法。 (?=;)
是一个前瞻性断言,用于查找与“;”匹配的项。但不将其包含在匹配的输出中。
这将产生: port_num = switch01
正如@Vladimir Kovpak指出的那样,如果要从此输出中排除“ port_num =“字符串,请添加一个后向断言:
... | grep -Po '(?<=port_num).+(?=;)'
答案 3 :(得分:1)
这可以通过简单的sed
命令来完成:
s="76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0"
sed 's/.*port_num=\([^;]*\);.*/\1/' <<< "$s"
switch01