鉴于此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
行来使用它。
答案 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}'