1 つのコマンドで複数入力 [閉じる]

1 つのコマンドで複数入力 [閉じる]

私は次のようなものがあります:

Error_code=1; num=5;
Error_code=2; num=7;
Error_code=3; num=9;
Error_code=1; num=2;
Error_code=2; num=5;

。 。 。

エラーコードも多いですね(約100個)。ファイル名が次のとおりであるとします。performance.log

コマンドを使用するには?エラーコードは毎回異なります。私は次のようなものがあります:

grep -i "error_code=$x;" performance.log | \
   awk -F";" '{print $2}' > $x_error_code.txt

したがって、毎回変数はxエラーコードに基づいて定義された新しい値であり、エラーコードが完了するとスクリプトは完了します。

答え1

スクリプトawkはすべてを行うことができます。これは、次のように純粋なB​​ourneシェルスクリプトを使用して行うこともできます。

grep -E -o '[[:digit:]]+; num=[^;]+' performance.log \
| while IFS="; " read n num; do
    echo "$num" >> "${n}_error_code.txt"
done

この部分は「行から部分grep文字列」を抽出します。 while ループは後者を読み書きします。EEE; num=NNNError_code=EEE; num=NNN;EEEnum=NNNEEE_error_code.txt

1つの特定のエラーコード(下のEEE)にのみ興味がある場合は、コマンドを次のgrepように変更できます。

grep -E -o '\<EEE; num=[^;]+' performance.log | while ...

小さなエラーコードセット(以下EEE1 ... EEEn)に興味がある場合は、コマンドをgrep次のように変更できます。

grep -E -o '\<(EEE1|EEE2|...|EEEn); num=[^;]+' performance.log | while ...

答え2

sed -n "/Error_code=$x/s/^[^ ]* //p" > $x_error_code.txt

答え3

私は単にawkを使ってこれを行います。

ファイルを調べて、エラータイプごとに1つのファイルを生成します。

$ ex="";awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k] >k"error_code.txt"}' performance.log

一部のエラーを「除外」するには、それに応じてシェル変数exの値を調整できますex="2|3"(例:2または3を除く)。

テスト:

$ echo "$c"
Error_code=1; num=5;
Error_code=2; num=7;
Error_code=3; num=9;
Error_code=1; num=2;
Error_code=22; num=5;

$ ex="";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}'
 num=5
 num=2 1

 num=7 2

 num=9 3

 num=5 22

$ ex="22|1";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}'

 num=7 2

 num=9 3

一方、特定のパターンを除外せずに一致させたい場合は、次のことができます。

$ inc="1";awk -F"[;=]" -v inc=$inc '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k~inc || inc=="") print a[k] >k"error_code.txt"}' performance.log 

inc印刷したいエラーコードをvarに含めるか、すべてのエラーを含めるには空白のままにします。 ( inc="")

関連情報