Преобразуйте несколько строк в одну и извлекайте из нее столбцы - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть поток (от умиротворяющего инструмента mytool) журналов в формате xml, и мне нужно, чтобы они выглядели читаемыми в одну строку. У меня нет инструмента синтаксического анализа xml на этом узле, поэтому я использовал perl и awk.

Мне удалось получить желаемый результат, но я хотел уменьшить количество каналов / awk / perl до минимально возможного.

Пример входного потока:

./mytool

<ALERT>
   <Time>2018-10-24T16:03:00.128-05:00</Time>
   <Alert>0;2018-10-24T16:02:37.739-05:00;NODE_LOCATION=19;11193;ID=5636122;Temp is on critical range;000;CRITICAL;Recovery=Shutting down the node;100</Alert>
</ALERT>



<ALERT>
   <Time>2018-10-24T16:03:03.053-05:00</Time>
   <Alert>0;2018-10-24T16:02:40.264-05:00;NODE_LOCATION=17;11293;ID=5636124;Temp is on Major range;000;MAJOR;Recovery=Shutdown the node or it will auto shutdown,processes stopped;99</Alert>
</ALERT>

Мой желаемый результат:

2018-10-24T16:02:37.739-05:00  5636122 Temp is on critical range CRITICAL Shutting down the node
2018-10-24T16:02:40.264-05:00  5636124 Temp is on Major range MAJOR Shutdown the node or it will auto shutdown,processes stopped

Текущая команда, которую я использовал для получения результата:

./mytool | perl -000 -lnpe 's/<.*?>|NODE_LOCATION=|Recovery=|ID=//g' | awk -vRS= '{$1=$1}1' |awk -F';' '{print $2,$$4,$5,$6,$8,$9}'

2018-10-24T16:02:37.739-05:00  5636122 Temp is on critical range CRITICAL Shutting down the node
2018-10-24T16:02:40.264-05:00  5636124 Temp is on Major range MAJOR Shutdown the node or it will auto shutdown,processes stopped

Примечание. Понимайте, что использование awk perl - не лучший способ работы с xmls, но это наилучший из возможных вариантов, поэтому приходится идти на компромисс с ним.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вы можете делать все на Perl, если хотите. Избегать труб до awk. Например:

mytool | perl -nE '
  m{<Alert>(.*?)</Alert>} and do {($line = $1) =~ s/NODE_LOCATION=|Recovery=|ID=//g; 
  @F = split /;/, $line; say join " ", @F[1,3,4,5,6,7,8]}'
0 голосов
/ 02 ноября 2018
mytool | perl -nE 'if(/<Alert>/){s/Recovery=|ID=//g; say join " ",(split/;/)[1,4,5,7,8]}'

Вышеприведенное сработает, если в вашем XML есть только одна пара тегов на строку, как в вашем примере.

0 голосов
/ 01 ноября 2018

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

your_command | awk -F"[><]" '
/<Time>/{
  val=$3
  next
}
/<Alert>/{
  split($3,array,";")
  sub(/.*=/,"",array[5])
  sub(/Recovery=/,"",array[9])
  print val,array[5],array[6],array[8],array[9]
}' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...