データストリームの文字列をフィルタリングして画面に出力するためのシェルスクリプト

データストリームの文字列をフィルタリングして画面に出力するためのシェルスクリプト

ログファイルを簡単に追跡し、単一フィールドの出力を画面に印刷しようとしています。

私の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$1creq_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 } } }'

いいえechotail変更されたawkスクリプトのみが適用されます。しかし、上記のコマンドを使用すると、grepはるかに簡単です。

おすすめ記事