grep-从字符串中获取单词

时间:2018-11-12 14:09:18

标签: grep

我有一堆字符串必须从-

中获取“ 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'

但是必须有更好的方法

4 个答案:

答案 0 :(得分:1)

这就是我要使用的:

... | grep -E 'port_num=.+' | sed 's/^.*port_num=\([^;]*\).*$/\1/'

无论在-o上使用grep还是不运行,-P的可用性取决于您使用的grep的版本。 (例如,我的grep没有它)。我并不是说依赖-P的其他答案都没有好处-对我来说,它们看起来不错。但是grep -P的可移植性较差。

恕我直言,将grepsed进行管道连接允许每个实用程序执行其专门研究的工作-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