私のサーバーからログファイルへの接続を確認するときに、私のカスタムメッセージをリダイレクトしたいと思います。条件を解放するには終了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" }'
パズルの別の部分は、複雑な参照を使用せずにシェル変数を取得する方法です$log
。awk
この-v
フラグを使用すると、変数を定義できますawk
。この場合、これをシェル変数の値に設定します$log
。
awk -v logfile="$log" { print "Appending to", logfile, "here" >>logfile }'
(亜種(少なくともおよび)が組み込みとして使用され、上書きが許可されていないlog="$log"
ため使用しません。)awk
mawk
gawk
log
答え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
。