![1 つのコマンドで複数入力 [閉じる]](https://linux33.com/image/108419/1%20%E3%81%A4%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A4%87%E6%95%B0%E5%85%A5%E5%8A%9B%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私は次のようなものがあります:
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
はすべてを行うことができます。これは、次のように純粋なBourneシェルスクリプトを使用して行うこともできます。
grep -E -o '[[:digit:]]+; num=[^;]+' performance.log \
| while IFS="; " read n num; do
echo "$num" >> "${n}_error_code.txt"
done
この部分は「行から部分grep
文字列」を抽出します。 while ループは後者を読み書きします。EEE; num=NNN
Error_code=EEE; num=NNN;
EEE
num=NNN
EEE_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=""
)