Извлечение и переформатирование текста между клавишами строки / времени - PullRequest
0 голосов
/ 31 декабря 2018

У меня проблема с извлечением текста между двумя строками.

У меня есть такой файл журнала (пример данных):

2018-12-31 09:49:24 addData [data=data]</br>
2018-12-31 09:49:25 publishData .......................
2018-12-31 09:49:26 createDoc [xml=
<mail>
    <recipent>doctor who</recipent>
</mail>]
<attempt>1</attempt>]
2018-12-31 09:49:26 createDoc [xml=
<clientHash>hash</clientHash>
<content>context</content>]
2018-12-31 09:51:27 exampleService [count=1]

Мой код: perl -ne 'print if (/09:40/ .. /09:50/)' server.log | sed -n '/createDoc/,/]/p'

Мой вывод:

2018-12-31 09:49:26 createDoc [xml=<mail><recipent>doctor who</recipent>
</mail>]
<attempt>1</attempt>]
2018-12-31 09:49:26 createDoc [xml=
<clientHash>hash</clientHash>
<content>context</content>]

, но я хочу, чтобы только xml был таким:

<element>
<mail><recipent>doctor who</recipent>
</mail>
<attempt>1</attempt>
</element>
<element>
<mail><recipent>doctor who</recipent>
</mail>
<clientHash>hash</clientHash>
<content>context</content>
</element>

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Допустим, у нас есть tmp.log , что-то вроде ниже.

2018-12-31 09:49:24 addData [data=data]</br>
2018-12-31 09:49:25 publishData .......................
2018-12-31 09:49:26 createDoc [xml=<mail><recipent>doctor who</recipent></mail>]<attempt>1</attempt>]
2018-12-31 09:49:26 createDoc [xml=<clientHash>hash</clientHash><content>context</content>]
2018-12-31 09:51:27 exampleService [count=1]

Мы можем объединить некоторые основные команды, чтобы получить желаемый результат.

  • Извлечь xml-строки из всего файла журнала.
  • Разделить строку по символу '[' и получить второй элемент.

cat tmp.log | grep xml | awk 'BEGIN { FS = "[" } ; { print $2 }'

Это приведет к чему-товот так:

xml=<mail><recipent>doctor who</recipent></mail><attempt>1</attempt>]
xml=<clientHash>hash</clientHash><content>context</content>]

Если вы также хотите избавиться от последнего символа, который является '] '.Добавьте еще один awk.

cat tmp.log | grep xml | awk  'BEGIN { FS = "[" } ; { print $2 }'| awk  'BEGIN { FS = "]" } ; { print $1 }'

Я знаю, что это не самый крутой способ сделать это, по крайней мере, это легко понять и работает.

0 голосов
/ 31 декабря 2018

Я бы использовал Awk для этого.Если у вас есть GNU Awk, вы даже можете легко анализировать метки времени.

awk -v start=$(date -d "09:40" +%s) \
    -v end=$(date -d "09:50" +%s) '           
    /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} / {
        if ($0 ~ / createDoc \[xml=/) {
            split($1, ymd, /-/)
            split($2, hms, /:/)
            when = mktime(ymd[1] " " ymd[2] " " ymd[3] " " hms[1] " " hms[2] " " hms[3])
            p = (when >= start && when <= end)
            if (p) $0 = substr($0, 36)
        }
        else p = 0
    }
    p { sub(/\]$/, ""); print }' file.log

Это несколько ориентировано на Linux - в дополнение к GNU Awk (для функции mktime )Синтаксис date специфичен для GNU date.(На OSX попробуйте date -j %H:%M:%S 09:40:00 +%s.)

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