
awk式を使用して、角かっこ間のすべての値をキャプチャできます。
'NR>1{print $1}' RS='(' FS=')'
しかし、具体的に一致するのに問題があります。行番号ではなく文字列に一致させたい。 awkがこれを行うことができるかどうかはわかりません。
元のファイルの内容は
if ($remote_addr ~ ^(1.2.3.4|5.6.7.8)$) {
set $maintenance off;
}
if ($maintenance = on) {
return 503;
}
さまざまな順序で複数の括弧があります。
1.2.3.4|5.6.7.8
この行からコンテンツを抽出する必要があります。
if ($remote_addr ~ ^
(または含まれている行のみ$remote_addr
)。
答え1
1行で簡単に交換できるので、sedを使って行います。
$ sed -n 's/.*$remote_addr[^(]*(\([^)]*\).*/\1/p' file
1.2.3.4|5.6.7.8
本当にawkを使いたいなら、どんなawkでも使うことができます:
$ awk 'sub(/.*\$remote_addr[^(]*\(/,"") && sub(/).*/,"")' file
1.2.3.4|5.6.7.8
答え2
抽出したい内容を考えてみましょう。内部に角かっこ内のステートメントを使用して、if ($remote_addr ~ ( ... ) )
次のawk
プログラムは以下を実行する必要があります。
awk 'index($0,"$remote_addr"){sub(/^.*\(/,"");sub(/\).+$/,"");print}' inputfile
これは文字列を含む行と一致します$remote_addr
。その行内の行の先頭から最後の行までのすべての項目(
と、)
最初の行から行の終わりまでのすべての項目が削除されます。次に、行の残りの値を印刷します。
答え3
また、これを試すことができますsed
sed -En '/\$remote_addr/ s/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
すべての行に一致し、$remote_addr
一致を抽出します。
パスワードしなければならないまず、明示的な一致なしにパターンを一致させる機能です$remote_addr
。
sed -En 's/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
出力
1.2.3.4|5.6.7.8
答え4
awk '/\$remote_addr/{for(i=1;i<=NF;i++){if($i ~ /\([0-9].*|[0-9].*\)/){print $i}}}' filename|awk -F "(" '{gsub(/\).*/,"",$2);print $2}
出力
1.2.3.4|5.6.7.8