打印也匹配图案的唯一线条

时间:2013-05-01 05:42:32

标签: bash awk

鉴于此foo.txt

/bin/bar:
        KERNELBASE => /sbin/KERNELBASE (0x77670000)
        intl-8 => /usr/bin/intl-8 (0x6f970000)
        iconv-2 => /usr/bin/iconv-2 (0x6f980000)
        pcre-0 => /usr/bin/pcre-0 (0x6f780000)
        gcc_s-1 => /usr/bin/gcc_s-1 (0x6fdd0000)
/bin/baz:
        KERNELBASE => /sbin/KERNELBASE (0x77670000)
        intl-8 => /usr/bin/intl-8 (0x6f970000)
        iconv-2 => /usr/bin/iconv-2 (0x6f980000)

我想要这个输出

/usr/bin/intl-8
/usr/bin/iconv-2
/usr/bin/pcre-0
/usr/bin/gcc_s-1

也就是说,我想采用包含/usr的唯一行,然后打印正确的字段。目前我正在使用管道

grep /usr foo.txt | sort -u | cut -d' ' -f3

但是这可以通过oneline awk命令完成吗?一世 came across 这个例子

awk '!a[$0]++'

但我看不到如何仅使用/usr行来使用它。

2 个答案:

答案 0 :(得分:2)

 awk '/\usr/ && ! a[$0]++{print $3}' foo.txt

答案 1 :(得分:0)

awk中的模式匹配是它的一大优势。您的示例对简单情况使用了一些快捷方式,但awk '!a[$0]++'的等效命令是awk '($0 in a) {a[$0]; print}',这很容易导致添加其他模式。同时仅打印第三个字段会产生:

awk '/\/usr/ && !($0 in a) {a[$0]; print $3}'