文字列を行に分割し、並べ替えて一意化comm
し、分析に使用します。( BashFAQ #36を参照)。
LoadModule
例として、 2 つの 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)
...短いファイルの両方または両方で見つかった行を抑制し、3番目のファイルで見つかったモジュール名を提供して、次の出力を生成します。
bar
baz
より興味深いユースケースを念頭に置いてこの質問を見ている人々にとって、残念ながら、GNU sort の-z
フラグは NUL 区切り文字を処理できますが (改行を含む文字列の比較を可能にするため)、comm
できません。ただし、comm
次の例のように、NUL 区切り文字をサポートするシェルで独自の実装を作成できます。
#!/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