私が取得したドメインのリストが1行ずつ表示されています。
for domain in $(nginx -qT | grep -E "^[[:space:]]*server_name" | grep -Ev "^[[:space:]]*#" | sed 's/^[ \t]*//' | sed 's/server_name //g' | tr -d \; | grep -Ev "^_$" | sort | uniq); do echo $domain; done
Nginx設定で。
明確で明確な:
for domain in $(
nginx -qT |
grep -E "^[[:space:]]*server_name" |
grep -Ev "^[[:space:]]*#" |
sed 's/^[ \t]*//' |
sed 's/server_name //g' |
tr -d \; |
grep -Ev "^_$" |
sort |
uniq
); do
echo $domain;
done
また、私のディレクトリにはいくつかの/etc/nginx/conf.d/
設定ファイルがありますdomain.conf
。
2番目のリストのプロファイルで説明されている最初のリストからドメインを抽出したいと思います。
2つのリストに含まれるドメインのみを維持しながら、2つのリストをマージして最終リストから一意のドメインを抽出するにはどうすればよいですか?
私の2番目のリスト
for directory in $(grep -ir "include" /etc/nginx/nginx.conf | grep -Ev "^[[:space:]]*#" | grep -v "fastcgi_params\|mime.types" | sed 's/;//g' | grep -o "/.*"); do ls $directory; done
リストがファイルではなく変数の値を保持するように、Bashスクリプトでこのエントリを使用したいと思います。また、コマンドを試しましたが、comm
変数のために機能しません。
答え1
あなたはそれを使用することができますプロセスの交換特性は次のとおりですbash
。
プロセス置換を使用すると、ファイル名を使用してプロセスの入力または出力を参照できます。形を取る
<(list)
または
>(list)
プロセスリスト入力または出力はファイル名で表示され、非同期で実行されます。ファイル名は拡張の結果として現在のコマンドに引数として渡されます。 [...]
<(list)
この形式を使用する場合は、引数として渡されたファイルを読み取ってリストの出力を取得する必要があります。
したがって、2つの変数がある場合は、その内容を並べ替えてプロセス全体でコマンドに渡すことができますcomm
。
comm -12 <(sort <<< "$VAR1" ) <(sort <<< "$VAR2")
たとえば、0から12の間で2と3に分かれたすべての数字を探したいとします。
$ VAR1=$(seq 0 2 12)
$ VAR2=$(seq 0 3 12)
$ comm -12 <(sort <<< "$VAR1" ) <(sort <<< "$VAR2")
0
12
6
答え2
@aviroの答えによると、結果のクエリは次のようになります。
for directory in $(
grep -ir "include" /etc/nginx/nginx.conf |
grep -Ev "^[[:space:]]*#" |
grep -v "fastcgi_params\|mime.types" |
sed 's/;//g' |
grep -o "/.*" |
sed 's/\.conf//g'
);
do
ls $directory |
xargs -n 1 basename |
sed 's/\.conf//g';
done