AWKを使用して特定の文字列の前にある角かっこ間の値を抽出する方法

AWKを使用して特定の文字列の前にある角かっこ間の値を抽出する方法

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

関連情報