Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对数组使用awk_Linux_Shell_Unix - Fatal编程技术网

Linux 对数组使用awk

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。因此,对于所有渠道,它将为每项服务提供完全的成功和失败。为了更清楚,我在下面给出了预期输出

$2是通道$11是服务类型,$12是S(成功)或F(失败),$14是经过的时间

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”
    打印故障计数和平均时间,防止出现除零错误


您好,它工作正常。还有一个问题。如果我想检查第二个参数EGP和EXSTAT,如何做。EXSTAT | EGP | 2014 | 09 | 21 | 12 | 02 | 31 | 1001 | QSWR1236 | QSWR | S | 000|4385@Guru你可以用布尔值。因此,您可以向跳行添加第二个条件<代码>$1=“EXSTAT”| | 2美元=EGP{next}对于一些目录,我在下面看到了一个错误/usr/xpg4/bin/awk:第0行(NR=40945):记录太长(限制:19999字节)/usr/xpg4/bin/awk-F“|”'$1=“EXSTAT”| | 2美元=EGP{next}\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\{fc[$11]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。此项或记录的任何解决方案都太高。@Guru您可以尝试其他实用程序(
perl
C
,可能用管道
grep
替换过滤器行,就像原始版本一样),或使用不同版本的
awk
。我在让
nawk
gawk
读写记录的时间比这更长方面没有问题
nawk
是大多数Linux发行版和OS X上的*BSD和
gawk
的默认值。@Guru也许您的
find
正在搜索中查找一些二进制文件。如果是这样,缩小范围可能会有所帮助。另一个解决方案是使用
cut
在到达
awk
之前将线条修剪到合理的大小。