使用awk解析定界字符串并获取匹配的字符串

时间:2019-01-03 06:18:31

标签: unix awk sed

我有一个定界的字符串变量,如下所述。我想grep一个匹配的字符串。我在Internet上找到了一些可能的解决方案,但可悲的是,它们没有给我我所期望的结果。你能建议或纠正我吗?

Input: 123,src_12,234,456
       1,23,34,src_23,4,56,7
       src_14,12
       12,3,5,src_5
Output: src_12
        src_23
        src_14
        src_5

逻辑:我需要获取具有“ src_”的字符串。它并不总是列表中的第二项。位置可能会改变。可变长度,定界。

7 个答案:

答案 0 :(得分:1)

使用简单的awk解决方案:

awk 'match($0,/src_[0-9]+/){print substr($0,RSTART,RLENGTH)}'  Input_file

awk '{sub(/.*src/,"src");sub(/\,.*/,"")} 1' Input_file

答案 1 :(得分:1)

使用bash:

while IFS="," read -a array; do
  for element in "${array[@]}"; do
    [[ $element =~ ^src_ ]] && echo "$element"
  done
done <<< "$variable"

输出:

src_12
src_23
src_14
src_5

答案 2 :(得分:1)

使用tr

$ cat srinath.txt2
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5
src_6,src_7,16,18

$ A=$(cat srinath.txt2)

$ tr ',' '\n' <<< "$A" | grep ^src
src_12
src_23
src_14
src_5
src_6
src_7

答案 3 :(得分:0)

使用Perl

$ cat srinath.txt
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5

$ perl -nle ' /(src_\d+)/ and print $1 ' srinath.txt
src_12
src_23
src_14
src_5

如果同一行中有多个src_,则在下面使用

$ cat srinath.txt2
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5
src_6,src_7,16,18

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } ' srinath.txt2
src_12
src_23
src_14
src_5
src_6
src_7

如果在变量中,则

$ A=$(cat srinath.txt2)

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } '  <<< "$A"
src_12
src_23
src_14
src_5
src_6
src_7

$ export A="123,src_12,234,456,1,23,34,src_23,4,56,7,src_14,12,12,3,5,src_5,src_6,src_7,16,18"

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } '  <<< "$A"
src_12
src_23
src_14
src_5
src_6
src_7

$ perl -le ' $_=$ENV{A}; while( /(src_\d+)/g ) { print $1 } '
src_12
src_23
src_14
src_5
src_6
src_7

答案 4 :(得分:0)

这可能对您有用(GNU sed):

sed '/\n/!s/src_[^,]*/\n&\n/g;/^src_/P;D' file

用换行符括住所有候选字符串,然后使用sed命令PD缩小每一行,仅打印前缀为src_的候选字符串。

答案 5 :(得分:0)

一个简单的grep仅返回(-o)个匹配的单词(-w

$ grep -wo 'src_[^,]*' file
src_12
src_23
src_14
src_5

答案 6 :(得分:0)

寻找^src_xxx,,src_xxx,,src_xxx$,并且只打印不包含,的匹配项。

sed -rn 's/.*(,|^)(src_[^,]*)(,|$).*/\2/p'