Linux 对数组使用awk
我使用下面的命令来获取每个通道的详细信息。我们可以将以下命令合并为一个命令,而不是使用通道名称的grep。因此,对于所有渠道,它将为每项服务提供完全的成功和失败。为了更清楚,我在下面给出了预期输出 $2是通道$11是服务类型,$12是S(成功)或F(失败),$14是经过的时间Linux 对数组使用awk,linux,shell,unix,Linux,Shell,Unix,我使用下面的命令来获取每个通道的详细信息。我们可以将以下命令合并为一个命令,而不是使用通道名称的grep。因此,对于所有渠道,它将为每项服务提供完全的成功和失败。为了更清楚,我在下面给出了预期输出 $2是通道$11是服务类型,$12是S(成功)或F(失败),$14是经过的时间 grep 'EXSTAT|BNK' sample.log|/usr/xpg4/bin/awk -F"|" ' {a[$11]=1} $12=="S"{sc[$11]++;st[$1
grep 'EXSTAT|BNK' sample.log|/usr/xpg4/bin/awk -F"|" '
{a[$11]=1}
$12=="S"{sc[$11]++;st[$11]+=$14}
$12=="F"{fc[$11]++;ft[$11]+=$14}
END{for(t in a){
printf "%s,%u,",t,sc[t]+fc[t];
if(sc[t])printf "%u,%g,",sc[t],st[t]/sc[t];else printf "0,0,";
if(fc[t])printf "%u,%g\n",fc[t],ft[t]/fc[t];else print "0,0";
}}'
QCD,1,546,1,546,0,0
QASM,1,2460,1,2460,0,0
QBEND,1,247,1,247,0,0
grep 'EXSTAT|SBN' sample.log|/usr/xpg4/bin/awk -F"|" '
{a[$11]=1}
$12=="S"{sc[$11]++;st[$11]+=$14}
$12=="F"{fc[$11]++;ft[$11]+=$14}
END{for(t in a){
printf "%s,%u,",t,sc[t]+fc[t];
if(sc[t])printf "%u,%g,",sc[t],st[t]/sc[t];else printf "0,0,";
if(fc[t])printf "%u,%g\n",fc[t],ft[t]/fc[t];else print "0,0";
}}'
QASM,3,10202,3,3400.67,0,0
QBSD,4,674,4,168.5,0,0
Expected Output
BNK,QCD,1,1,546,0,0
BNK,QASM,1,1,2460,0,0
BNK,QBEND,1,1,247,0,0
MEM,QBATI,10,10,289.4,0,0
SBN,QASM,3,3,3400.67,0,0
SBN,QBSD,4,4,168.5,0,0
bash-3.2$ grep 'EXSTAT|' sample.log|/usr/xpg4/bin/awk -F"|" '
{a[$11]=$2}
$12=="S"{sc[$11]++;st[$11]+=$14}
$12=="F"{fc[$11]++;ft[$11]+=$14}
END{for(t in a){
printf "%s,%s,%u,",a[t],t,sc[t]+fc[t];
if(sc[t])printf "%u,%g,",sc[t],st[t]/sc[t];else printf "0,0,";
if(fc[t])printf "%u,%g\n",fc[t],ft[t]/fc[t];else print "0,0";
}}'
BNK,QCD,1,1,546,0,0
SBN,QBSD,4,4,168.5,0,0
MEM,QBATI,10,10,289.4,0,0
SBN,QASM,4,4,3165.5,0,0
BNK,QBEND,1,1,247,0,0
bash-3.2$
=============日志========
EXSTAT | BNK | 2014 | 11 | 24 | 11 | 07 | 53 | 403056 | E582783758 | QBEND | S | 000 | 247
EXSTAT | BNK | 2014 | 11 | 24 | 11 | 07 | 59 | 403057 | E582783759 | QASM | S | 000 | 2460
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 08 | 00 | 403059 | 24112014110702 | QBATI | S | 000 | 310
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 09 | 00 | 403063 | 24112014110802 | QBATI | S | 000 | 278
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 09 | 36 | 403064 | 142802 | QBSD | S | 000 | 181
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 10 | 00 | 403065 | 24112014110902 | QBATI | S | 000 | 316
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 11 | 00 | 403066 | 2411201411002 | QBATI | S | 000 | 242
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 12 | 01 | 403067 | 2411201411102 | QBATI | S | 000 | 330
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 13 | 01 | 403068 | 2411201411202 | QBATI | S | 000 | 273
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 13 | 35 | 403069 | 15785 | QASM | S | 000 | 1572
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 13 | 56 | 403073 | 15786 | QASM | S | 000 | 3543
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 14 | 01 124074 | 2411214111302 | QBATI | 000 | 249
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 14 | 16 | 403075 | 15787 | QASM | S | 000 | 5087
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 15 | 00 | 403076 | 2411201411402 | QBATI | S | 000 | 347
EXSTAT | BNK | 2014 | 11 | 24 | 11 | 15 | 52 | 403077 | E582783764 | QCD | S | 000 | 546
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 15 | 53 | 403078 | 142806 | QBSD | S | 000 | 160
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 16 | 00 | 403079 | 2411201411502 | QBATI | S | 000 | 294
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 16 | 57 | 403080 | 142807 | QBSD | S | 000 | 170
EXSTAT | MEM | 2014 | 11 | 24 | 11 | 17 | 00 | 403081 | 2411201411602 | QBATI | S | 000 | 255
EXSTAT | SBN | 2014 | 11 | 24 | 11 | 17 | 42 124082 | 142808 | QBSD | S | 000 | 163您可以使用组合字符串
$2”、“$11
作为数组索引
awk -F"|" '!/EXSTAT\|/{next}
{t=$2","$11;a[t]=1}
$12=="S"{sc[t]++;st[t]+=$14}
$12=="F"{fc[t]++;ft[t]+=$14}
END{for(t in a){
printf "%s,%u,",t,sc[t]+fc[t];
if(sc[t])printf "%u,%g,",sc[t],st[t]/sc[t];else printf "0,0,";
if(fc[t])printf "%u,%g\n",fc[t],ft[t]/fc[t];else print "0,0";
}}' sample.log
跳过任何不包含/EXSTAT\|/{next}
的行,这将替换EXSTAT
grep“EXSTAT”
设置数组{t=$2',“$11;a[t]=$2}
中的频道和服务类型,以逗号分隔a
$12==“S”{sc[t]+;st[t]+=$14}
检查是否成功。剩余部分增加成功计数$12==“S”
,并对成功时间sc
求和st
$12==“F”{fc[t]+;ft[t]+=$14}
检查故障。剩余部分增加故障计数$12==“F”
,并对故障时间fc
求和ft
打印始终存在的输出字段printf“%s,%u,”,t,sc[t]+fc[t]
打印成功计数和平均时间,防止出现零除错误if(sc[t])printf“%u,%g”,sc[t],st[t]/sc[t];else printf“0,0,”
打印故障计数和平均时间,防止出现除零错误if(fc[t])printf“%u,%g\n”,fc[t],ft[t]/fc[t];else print“0,0”
perl
,C
,可能用管道grep
替换过滤器行,就像原始版本一样),或使用不同版本的awk
。我在让nawk
或gawk
读写记录的时间比这更长方面没有问题nawk
是大多数Linux发行版和OS X上的*BSD和gawk
的默认值。@Guru也许您的find
正在搜索中查找一些二进制文件。如果是这样,缩小范围可能会有所帮助。另一个解决方案是使用cut
在到达awk
之前将线条修剪到合理的大小。