我有这两个文件:-
[root@localhost base_filters]# cat aix_old
joe
amadeus
image
bill
juliet
charlie
romeo
ftp
[root@localhost base_filters]# cut -d: -f1 passwd2
henry
amadeus
image
bill
julie
jennifer
charlie
romeo
harry
我试图找出两个文件之间的差异;所以我使用以下命令:-
[root@localhost base_filters]# cut -d: -f1 passwd2 | sort | diff `sort aix_old` -
但出现以下错误:
diff: extra operand `charlie'
diff: Try `diff --help' for more information.
我知道我可以使用另一个临时文件来对内容进行排序,aix_old
但我不需要另一个临时文件;所以尝试使用命令替换。
任何想法,我可能做错了什么。
答案1
对于 ksh、zsh 或 bash,使用进程替换:
diff <(cut -d: -f1 passwd2 | sort) <(sort aix_old)
给出:
4,5c4
< harry
< henry
---
> ftp
7,8c6,7
< jennifer
< julie
---
> joe
> juliet
diff -y <(cut -d: -f1 passwd2 | sort) <(sort aix_old)
给出:
amadeus amadeus
bill bill
charlie charlie
harry | ftp
henry <
image image
jennifer | joe
julie | juliet
romeo romeo
来自进程替换维基:http://en.wikipedia.org/wiki/Process_substitution
Unix diff 命令通常接受要比较的两个文件的名称,或一个文件名和标准输入。进程替换允许您直接比较两个程序的输出:
$ diff <(排序文件1) <(排序文件2)
该
<(command)
表达式告诉命令解释器运行命令并使其输出显示为文件。该命令可以是任意复杂的 shell 命令。
同样使用亚什的进程重定向(在具有 的系统上/dev/fd/n
):
diff /dev/fd/3 3<(cut -d: -f1 passwd2 | sort) /dev/fd/4 4<(sort aix_old)
或者使用任何类似 Bourne 的 shell 会更麻烦(在带有 的系统上/dev/fd/n
):
cut -d: -f1 passwd2 | sort | {
sort aix_old 3<&- | diff /dev/fd/3 -
} 3<&0