![一个命令中的多个输入](https://linux22.com/image/108419/%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E8%BE%93%E5%85%A5.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 shell 脚本来完成,如下所示:
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
如果您只对一种特定的错误代码(下面的 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 来完成。
这将扫描文件并为每种错误类型生成一个文件
$ 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
如果你想“排除”一些错误,你可以相应地调整 shell 变量 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=""
)