Unix Bash - 打印匹配模式的字段值

时间:2015-02-19 03:26:50

标签: bash unix awk grep

说我在文件中有这个,(FIX消息)

35=D|11=ABC|52=123456|33=AA|44=BB|17=CC
35=D|33=ABC|11=123456|44=ZZ|17=EE|66=YY

我想grep并仅打印11=17=之后的值,输出如下。

ABC|CC
123456|EE

我如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

每当输入中有name = value对时,我发现它有助于清晰,未来的增强等,以创建一个name2value数组,然后使用它来按名称打印值:

$ cat tst.awk
BEGIN { FS="[|=]"; OFS="|" }
{
    delete n2v
    for (i=1; i<=NF; i+=2) {
        n2v[$i] = $(i+1)
    }
    print n2v[11], n2v[17]
}
$ awk -f tst.awk file
ABC|CC
123456|EE

答案 1 :(得分:0)

通过sed,

$ sed 's/.*\b11=\([^|]*\).*\b17=\([^\|]*\).*/\1|\2/g' file
ABC|CC
123456|EE

通过grep和paste。

$ grep -oP '\b11=\K[^|]*|\b17=\K[^|]*' file | paste -d'|' - -
ABC|CC
123456|EE

答案 2 :(得分:0)

这是另一个awk

awk -F"11=|17=" '{for (i=2;i<NF;i++) {split($i,a,"|");printf "%s|",a[1]}split($i,a,"|");print a[1]}' file
ABC|CC
123456|EE