我想提取 tool2v1 tool2v2 的值。 我的输出应该是 1.5.2.c8.5.2.r1981122221118 32.5.0.abc.r20123433554

我写了以下 awk ,但它没有给出正确的结果。

awk -F: '/^tool2v1/ {print $2}' file1
awk -F: '/^tool2v2/ {print $2}' file1
    
1 个评论
awk -F':' '$1~/tool2v[12]/ {print $2}' file1
linux
bash
shell
all_techie
all_techie
发布于 2018-01-29
4 个回答
Chen Shabi
Chen Shabi
发布于 2018-01-29
已采纳
0 人赞同

grep -E也能完成这项工作。

grep -E "tool2v[12]" file1 |sed 's/^.*://'
    
Benjamin W.
Benjamin W.
发布于 2018-01-29
0 人赞同

如果你有一个支持Perl兼容的正则表达式的grep,如GNU grep,你可以使用一个可变大小的look-behind。

$ grep -Po '^tool2v[12]:\K.*' infile
1.5.2.c8.5.2.r1981122221118
32.5.0.abc.r20123433554

-o选项是只保留匹配项,而不是整个匹配行;\K相当于 "该行必须与左边的事物相匹配,但不要把它们包括在匹配中"。

你也可以使用一个正常的look-behind。

$ grep -Po '(?<=^tool2v[12]:).*' infile
1.5.2.c8.5.2.r1981122221118
32.5.0.abc.r20123433554

最后,要修正你的awk,这几乎是正确的(正如评论中指出的)。

$ awk -F: '/^tool2v[12]/ { print $2 }' infile
1.5.2.c8.5.2.r1981122221118
32.5.0.abc.r20123433554
    
sorak
sorak
发布于 2018-01-29
0 人赞同

你可以用grep过滤。

grep '\(tool2v1\|tool2v2\)'

然后用sed删除:之前的部分。

sed 's/^.*://'

这个sed操作意味着。

^ - match from beginning of string
.* - all characters
up to and including the :

......并将这一匹配的内容替换为空白。

格式为sed 's/<MATCH>/<REPLACE>/'

整个指挥部。

grep '\(tool2v1\|tool2v2\)' file1|sed 's/^.*://'

Result:

1.5.2.c8.5.2.r1981122221118
32.5.0.abc.r20123433554
    
0.sh
0.sh
发布于 2018-01-29
0 人赞同

这个问题已经有了答案,但你也可以用纯bash来实现所需的结果。

#!/usr/bin/env bash
while read line;do
  if [[ "$line" =~ ^tool2v* ]];then
      echo "${line#*:}"