Использовать ли AWK, SED или Grep из Bash для отображения / печати, чтобы указать переменные из полей выбора из нескольких строк файла журнала? - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь разобрать журналы сообщений только для чтения с радио. Некоторые записи состоят из 2-3 строк, другие могут быть более 8 строк. Хорошая новость в том, что я могу найти уникальные статические строки начала и остановки. Плохая новость в том, что я пытался скопировать код SED из ближайшего примера, который я смог найти за последние 11 часов, но безуспешно.

Лог выглядит так:

M: 2019-06-08 18:15:24.927 DMR Slot 2, received network voice header from KS3X to TG 91
M: 2019-06-08 18:15:25.402 DMR Talker Alias (Data Format 1, Received 6/20 char): 'KS3X D'
M: 2019-06-08 18:15:25.410 DMR Slot 2, Embedded Talker Alias Header
M: 2019-06-08 18:15:25.412 0000:  04 00 68 4B 53 33 58 20 44  *..hKS3XD*
M: 2019-06-08 18:15:26.111 DMR Talker Alias (Data Format 1, Received 13/20 char): 'KS3X DMR ID: '
M: 2019-06-08 18:15:26.120 DMR Slot 2, Embedded Talker Alias Block 1
M: 2019-06-08 18:15:26.121 0000:  05 00 4D 52 20 49 44 3A 20  *..MR ID: *
M: 2019-06-08 18:15:26.824 DMR Talker Alias (Data Format 1, Received 20/20 char): 'KS3X DMR ID: 1142129'
M: 2019-06-08 18:15:26.824 DMR Slot 2, Embedded Talker Alias Block 2
M: 2019-06-08 18:15:26.824 0000:  06 00 31 31 34 32 31 32 39  *..1142129*
M: 2019-06-08 18:16:15.921 DMR Slot 2, received network end of voice transmission, 51.2 seconds, 0% packet loss, BER: 0.0%

Переменные данных, которые я хотел бы получить, будут следующими:

  1. Позывной между «от» и «до» в строке 1.
  2. Канал, расположенный между «до» и концом строки 1.
  3. ID DMR в конце строки 8 (1142129).
  4. Продолжительность 51,2 секунды в строке 11.
  5. Процент потери пакетов в строке 11.
  6. Процент BER в конце строки 11.

Все записи, независимо от длины строк, начинаются с «принятого голосового заголовка от» и заканчиваются символом процента «%». Кроме того, кто-нибудь может указать мне на низкоуровневый обзор того, когда использовать SED, GREP или AWK, все они мне кажутся очень похожими? Просто ссылка на хороший учебник была бы замечательной.

Я пытаюсь запустить bash-скрипт для мониторинга журнала с помощью терминала, используя что-то вроде этого: tail -fn0 /var/log/pi-star/MMDVM-2019-06-08.log

Но только с 6 переменными, указанными выше. Супер благодарен !!!

#!/bin/bash
ACCESS_TOKEN="o.WOgpVaaEBjoVLGKS3VzFnsO4xGClTRiF"
tail -fn0 /var/log/pi-star/MMDVM-2019-06-08.log | \

while read line ; do
        echo "$line" | gawk '
  match($0, /received.*voice header from ([[:alnum:]]+) to ([[:alnum:]]+ [0-9]+)/, a) {
    in_record = 1
    call_sign = a[1]
    channel = a[2]
  }
  in_record && match($0, /DMR ID: ([0-9]+)/, a) {
    dmr_id = a[1]
  }
  in_record && match($0, /([0-9.]+) seconds, ([0-9]+)% packet loss, BER: ([0-9.]+)%/, a) {
    in_record = 0
    print call_sign, channel, dmr_id, a[1], a[2], a[3]
  }
'
done

Ответы [ 3 ]

3 голосов
/ 08 июня 2019
gawk '
  match($0, /received.*voice header from ([[:alnum:]]+) to ([[:alnum:]]+ [0-9]+)/, a) {
    in_record = 1
    call_sign = a[1]
    channel = a[2]
  }
  in_record && match($0, /DMR ID: ([0-9]+)/, a) {
    dmr_id = a[1]
  }
  in_record && match($0, /([0-9.]+) seconds, ([0-9]+)% packet loss, BER: ([0-9.]+)%/, a) {
    in_record = 0
    print call_sign, channel, dmr_id, a[1], a[2], a[3]
  }
' OFS=, radio.log
KS3X,TG 91,1142129,51.2,0,0.0

Это относится к GNU awk (для формы с тремя аргументами функции match ())

1 голос
/ 09 июня 2019

С GNU awk для нескольких символов RS:

$ awk -v RS='%\n' -v OFS=, '{print $12, $14" "$15, $112+0, $150, $152+0, $156}' file
KS3X,TG 91,1142129,51.2,0,0.0
1 голос
/ 09 июня 2019

Вот еще один скрипт awk (стандартный Linux gawk), выполняющий тот же трюк.с меньшим количеством кода и улучшенными шаблонами захвата.

script.awk

/received network voice header from/,/#$/{
    if (match($0, "from ([^ ]+) to (.*$)", a)) {
        output[1] = a[1];
        output[2] = a[2];
    }
    if (match($0, "DMR ID: ([^']+)'", a)) {
        output[3] = a[1];
    }
    if (match($0, "voice transmission, ([^ ]+) seconds, ([^%]+)% packet loss, BER: ([^%]+)%", a)) {
        output[4] = a[1];
        output[5] = a[2];
        output[6] = a[3];

        outputStr =  output[1];
        for (i = 2; i <= 6; i++) outputStr = outputStr","output[i];
        print outputStr;
    }
}

скрипт запуска

awk -f script.awk input.log

вывод:

KS3X,TG 91,1142129,51.2,0,0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...