В приглашении Unix, как вы извлекаете переменное число строк (которые могут включать пустую строку) из файла, соответствующего шаблону? - PullRequest
0 голосов
/ 07 июля 2019

В моем файле несколько сообщений, каждое с отметкой времени.Мне нужно вытащить только одно сообщение из файла на основе его отметки времени.Иногда сообщение будет содержать пустую строку в содержимом сообщения.Я предпочитаю делать это в приглашении unix в операционной системе AIX.

Мой файл (er96aa.example) содержит следующую информацию.Я хочу вытащить второе сообщение с отметкой времени 15: 56: 10.097 (всего должно быть 4 строки данных).

07/05/19 15:56:10.091 SOCKETSND MESSAGE LENGTH=338   MESSAGE:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

07/05/19 15:56:10.099 SOCKETSND MESSAGE LENGTH=338   MESSAGE:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Я пытался

  grep -p '15:56:10.097' er96aa.example 

но это возвращает только первые две строки.

Я пытался

  grep -p'07/05/19' '15:56:10.097' er96aa.example

, но это ничего не возвращает.

  grep -p'07/05/19'+ '15:56:10.097' er96aa.example   and

  grep -p'07/05/19+' '15:56:10.097' er96aa.example

, но возвращает весь файл

Я изменил свой файл и поместил 07/05/19 в отдельную строку, а "grep -p'07 / 05/19 ''15: 56: 10.097' er96aa.example" сработал, но, к сожалению, нету меня есть возможность изменить формат файла, с которым я обычно работаю.

Ожидаемый результат:

07/05/19 15:56:10.097 SOCKETSND
MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Некоторые вариации поста Джона.

awk '/^[0-9]{2}\/[0-9]{2}\/[0-9]{2}/{f=0} /^07\/05\/19 15:56:10.097/{f=1} f'
07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Используются точные дата и время в качестве триггера, и вся строка переходит на следующую строку, начиная с формата даты.

0 голосов
/ 07 июля 2019

У меня нет доступа к AIX box, чтобы проверить это, но попробуйте:

$ awk '/MESSAGE:/{f=0} /15:56:10.097/{f=1} f' file
07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Как это работает

По умолчанию awk читает файл по одной строке за раз,Наш скрипт использует одну переменную f, чтобы определить, должна ли быть напечатана текущая строка.

  • /MESSAGE:/{f=0}

    Это устанавливает переменную f в значение false (0) если регулярное выражение MESSAGE: появляется в текущей строке.

  • /15:56:10.097/{f=1}

    Устанавливает для переменной f значение true (1)в текущей строке появляется регулярное выражение 15:56:10.097.

  • f

    Если f истинно, выведите строку.

...