しきい値より大きい値のみを抽出する方法

しきい値より大きい値のみを抽出する方法

私は初めてbashスクリプトに触れました。誰もが次の問題を解決するのに役立ちますか?以下に示す出力を含むログファイルがあります。

logDurationMillis> = 950msで出力ラインを見つけるためにgrepを試しています。

logAlias:Overall,logDurationMillis:382,logTimeStart:2019-07-24_15:30:06.075,logTimeStop:2019-07-24_15:30:06.107
logAlias:Overall,logDurationMillis:388,logTimeStart:2019-07-24_15:30:06.406,logTimeStop:2019-07-24_15:30:06.444
logAlias:Overall,logDurationMillis:545,logTimeStart:2019-07-24_15:30:06.583,logTimeStop:2019-07-24_15:30:06.638
logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660
logAlias:Overall,logDurationMillis:640,logTimeStart:2019-07-24_15:30:07.197,logTimeStop:2019-07-24_15:30:07.237
logAlias:Overall,logDurationMillis:934,logTimeStart:2019-07-24_15:30:07.474,logTimeStop:2019-07-24_15:30:07.508
logAlias:Overall,logDurationMillis:336,logTimeStart:2019-07-24_15:30:07.546,logTimeStop:2019-07-24_15:30:07.582

値は常にカンマで区切られた2番目の列にあります。

答え1

awkを使用してください:

  1. 「logDurationMillis」が2番目の項目であることがわかっている場合:

    awk -F'[:,]' -v limit=950 '$4 >= limit' file
    
  2. そうでなければ

    awk -F'[:,]' -v limit=950 '{
        for (i=1; i<NF; i+=2) 
            if ($i == "logDurationMillis" && $(i+1) >= limit) 
                print
    }' file
    

答え2

ファイル名がと仮定すると、logFileこのコマンドは次のことを行います。

egrep ',logDurationMillis:(9[5-9][0-9]|[1-9][0-9]{3,}),' logFile

答え3

もう一つawk

awk -F':|,' '$4 > 950' file

印刷:

logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660

修正する(OP質問のため:)

次のようにフィールドを再構築できます。

awk -F':|,' '$4 > 950 {print $3 ":" $4 "," $5 ":" $6 ":" $7 ":" $8 }' file

印刷:

logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599

(フィールド3-8を接続するより簡単な方法があるかもしれませんが、他のフィールド区切り文字も再作成する必要があります)

関連情報