2014-11-18 4 views
1

Я использую ниже команды для получения информации для каждого канала. Вместо grep с именем канала мы можем объединить ниже команды в один. Таким образом, для всех каналов это обеспечит общий успех и неудачу для каждой службы. Я дал ожидаемый результат ниже для большей ясности.используя awk с массивами

$ 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 | БНК | 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 | 24112014111002 | Q BATI | S | 000 | 242 EXSTAT | MEM | 2014 | 11 | 24 | 11 | 12 | 01 | 403067 | 24112014111102 | QBATI | S | 000 | 330 EXSTAT | MEM | 2014 | 11 | 24 | 11 | 13 | 01 | 403068 | 24112014111202 | 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 | 403074 | 24112014111302 | QBATI | S | 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 | 24112014111402 | 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 | 24112014111502 | 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 | 24112014111602 | QBATI | S | 000 | 255 EXSTAT | SBN | 2014 | 11 | 24 | 11 | 17 | 42 | 403082 | 142808 | QBSD | S | 000 | 163

ответ

2

Вы можете использовать комбинированные строку $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" распечатывает счетчик отказов и среднее время, защищая от деления на нулевую ошибку.

+0

Привет, он работает отлично. Еще один запрос. Если я хочу проверить для второго параметра EGP вместе с EXSTAT, как это сделать. EXPLAT | EGP | 2014 | 09 | 21 | 12 | 02 | 31 | 1001 | QSWR1236 | QSWR | S | 000 | 4385 – Guru

+0

@Guru Вы используете логические [выражения] (http://pubs.opengroup.org/onlinepubs/ 9699919799/utilities/awk.html # tag_20_06_13_02) в [patterns] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_01). Таким образом, вы можете добавить второе условие к строке пропуска. '$ 1! =" EXSTAT "|| $ 2! = EGP {next}' – kdhp

+0

Для некоторых каталогов я становлюсь ниже ошибки./usr/xpg4/bin/awk: строка 0 (NR = 40945): Запись слишком длинная (LIMIT: 19999 bytes) /usr/xpg4/bin/awk -F "|" '$ 1! = "EXSTAT" || $ 2! = EGP {next} \ /\ F \ |/{fc [$ 11] ++; ft [$ 11] + = $ 14} \ /\ | S \ |/{sc [$ 11] ++; st [$ 11] + = $ 14} \ END {для (t в sc) {\ printf "% s,% u,% u,% g,", t, sc [t ] + fc [t], sc [t], st [t]/sc [t]; \ if (fc [t]) printf "% u,% g \ n", fc [t], ft [t ]/fc [t]; \ else print "0,0"}} '$ (найти $ ectpath -mtime 0-тип f). Любое решение для этого или записей слишком велико. – Guru

Смежные вопросы