awkから条件付きメッセージリダイレクト

awkから条件付きメッセージリダイレクト

私のサーバーからログファイルへの接続を確認するときに、私のカスタムメッセージをリダイレクトしたいと思います。条件を解放するには終了1を使用します。しかし、条件をより詳細にしてログファイルにリダイレクトするにはどうすればよいですか?

awkメッセージをリダイレクトによく合うように内部に実装するにはどうすればよいですか?

awk { ... "Connectivity to ${rda} failed, exiting" >> ${log} ... } then

私のスクリプトは次のとおりです。

#/bin/bash
rda="www.google.com"                       
log="/var/log/connectivity.log"

if nc -zw1 ${rda} 22 && echo |openssl s_client -connect ${rda}:22 2>&1 |awk '
    handshake && $1 == "Verification" { if ($2=="OK") exit;exit 1; }
    $1 $2 == "SSLhandshake" { handshake = 1 }'
then
    echo -e "Connectivity works" >> ${log}
    exit 0
fi

私のawkバージョンは次のとおりです。

# awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits: max NF             32767 sprintf buffer      2040

答え1

print次のファイルを使用できます。awk

print "data" >"somefile.log"

または

filename="somefile.log"
print "data" >filename

を使用すると、>最初のファイルのファイルが切り捨てられますprintが、スクリプトが終了するか明示的にファイルを開くまで、ファイルは開いたままになりますclose()。ファイルが開かれると(最初のファイル以降print >)、後続の呼び出しはprint >切り捨てることなくファイルに追加されます。

既存のファイルに追加するにはprint >>

コマンドラインでログファイル名を使用する例:

... | awk -v out="$log" { print "this is a message" >>out }

または、

... | out=$log awk { print "this is a message" >>ENVIRON["out"] }

上記のコードは(おそらく)既存のファイル(パス名がシェル変数にあります)に追加されますlog。 2番目の例では環境変数 out$log書き込むファイルパス(コマンドラインで設定awk

答え2

すでに説明したように、この設定を使用してファイルを書き込んで書き続けることができます。

awk '{ print "hello, world" >>"file.log" }'

パズルの別の部分は、複雑な参照を使用せずにシェル変数を取得する方法です$logawkこの-vフラグを使用すると、変数を定義できますawk。この場合、これをシェル変数の値に設定します$log

awk -v logfile="$log" { print "Appending to", logfile, "here" >>logfile }'

(亜種(少なくともおよび)が組み込みとして使用され、上書きが許可されていないlog="$log"ため使用しません。)awkmawkgawklog

答え3

すべてのロギングを単一のawkスクリプトにまとめることができます。スクリプトを調整してみてください。

awk -v rda="${rda}"'

handshake &&
$1 == "Verification"    {if ($2=="OK")  {print "Connectivity works"
                                         exit
                                        }
                         print "Connectivity to " rda " failed, exiting"
                         exit 1
                        }

$1 $2 == "SSLhandshake" {handshake = 1
                        }
' >> "${log}"

一般出力とエラー出力を区別するには、/dev/stderr内部でエラーをリダイレクトしてくださいawk

関連情報