ログファイルを簡単に追跡し、単一フィールドの出力を画面に印刷しようとしています。
私のLinuxシステムのログファイルは次のとおりです。
2022-10-21 16:00:08;areq_in=0;areq_qavg=0;areq_qmax=0;areq_sent=0;ares_out=0;ares_out_err=0;ares_out_ok=0;ares_qavg=0;ares_qmax=0;ares
_recv=0;ares_tavg=0;ares_tmax=0;creq_out=0;creq_qavg=0;creq_qmax=0;creq_recv=0;cres_in=0;cres_qavg=0;cres_qmax=0;cres_sent=0;lic_rej=0
;lic_use=0;mbr_from=0;mbr_to=0;mreject=0;mreject_conn=0;msys_recv=0;msys_sent=0;
ログの各行は;
区切りフィールドで構成され、ほとんどは「key = value」形式です。
だから私がしたいのは、creq_recv
画面に「キー」名のフィールドを印刷することです。
誰かの修正からこのスクリプトをインポートしましたが、何かが欠けているようです。
#!/bin/bash
creq_recv=$1
my_variable=`tail -f stats_2022102116.log | awk -F: -v creq_recv="$1" '$1 == creq_recv {$1=$1; print}' stats_2022102116.log`
echo "$my_variable"
出力が空なので
[root@priti ]$ ./chk_conn_log.sh
[root@priti ]$
値が何であれ、出力は画面に印刷する必要がありますcreq_recv
。たとえば、次のように
creq_recv=12
creq_recv=34
creq_recv=65
ベストアンサー1
行および/またはPCREまたは拡張正規表現の一致部分のみを印刷するオプションを使用して、grep
必要な操作を実行できます。これにより、「1つ以上の雨;文字」を使用できます。-o
-P
-E
[^;]+
tail -f stats_2022102116.log | grep -oP '(?<=^|;)creq_recv=[^;]+'
または、より安全にするために、次に終わる別のフィールド名を使用することもできますcreq_recv
。
tail -f stats_2022102116.log | grep -oP '(^|;)\Kcreq_recv=[^;]+'
「awk変数の値をスクリプトに渡された最初の引数の値に設定する」という意味でawk
失敗しました。ただし、起動したスクリプトにはパラメータ()がないため空白なので、空白です。-v creq_recv="$1"
creq_recv
./chk_conn_log.sh
$1
creq_recv
とにかく変数が設定されていても動作しません。スクリプトがawk
間違ってtail -f
停止しないと、絶対に終了しないためecho
実行されません。あなたが望むものは次のとおりです。
#!/bin/bash
tail -f stats_2022102116.log |
awk -F';' '{ for(i=1; i<=NF; i++){ if ($i ~ /^creq_recv=/) { print $i } } }'
いいえecho
、tail
変更されたawkスクリプトのみが適用されます。しかし、上記のコマンドを使用すると、grep
はるかに簡単です。