将您的字符串分成几行,对它们进行排序和唯一化,然后comm
用于分析。(参见BashFAQ #36)。
举个例子,我假设您想比较LoadModule
两个 Apache 配置文件之间的指令。
文件1:
...other stuff...
LoadModule foo modules/foo.so
LoadModule bar modules/bar.so
LoadModule baz modules/baz.so
...other stuff...
文件2:
...other stuff...
LoadModule foo modules/foo.so
...other stuff...
所以,要做到这一点:
comm -2 -3 \
<(gawk '/LoadModule/ { print $2 }' file1 | sort -u)
<(gawk '/LoadModule/ { print $2 }' file2 | sort -u)
...将抑制在两个或仅在较短文件中找到的任何行,并为您提供在第三个文件中找到的模块名称,产生以下输出:
bar
baz
对于在考虑更多有趣用例的情况下查看这个问题的人们 - 不幸的是,虽然 GNU 排序的-z
标志可以处理 NUL 分隔符(以允许对包含换行符的字符串进行比较),comm
但不能。但是,您可以在支持 NUL 分隔符的 shell 中编写自己的comm
实现,例如以下示例:
#!/bin/bash
exec 3<"$1" 4<"$2"
IFS='' read -u 4 -d ''; input_two="$REPLY"
while IFS='' read -u 3 -d '' ; do
input_one="$REPLY"
while [[ $input_two < $input_one ]] ; do
IFS='' read -u 4 -d '' || exit 0
input_two="$REPLY"
done
if [[ $input_two = "$input_one" ]] ; then
printf '%s\0' "$input_two"
fi
done