mycmd
假设您有一个在管道中发送连续流的命令。
您只想打印每个新出现的内容。
你会怎么做?
命令
mycmd | sort -u
是无效的,因为我必须等到 mycmd 完成。
显然可以使用文件,但我确信可能存在更直接的方法。
答案1
sort
不会显示任何内容,因为sort
无法处理没有 EOF(文件结束)的 STDIN 数据流。
sort
mycmd
仅当在某个点结束时才会起作用,然后sort
会看到 EOF,并处理内容。
要获取数据流上的唯一内容,可以使用awk
数组来存储记录数:
mycmd | awk '!seen[$0]++'
seen[$0]
通过获取行的值来检查行是否在数组中seen
。如果行不存在,seen[$0]
则返回0
(false),然后否定 ( !
) 测试变为真,并打印行(默认操作)。++
将值增加 1,因此下次对于任何重复的行,否定测试都将为假。