Как найти строки между двумя временными метками в файле unix - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть файл журнала ниже, и мне нужно найти строки между двумя случайными метками времени с ч / б "2018-04-12 14:50" до "2018-04-14 14:20"

Входные данные:

2018-04-12 14:43 Error Hello      
2018-04-13 11:33 Error Hello1    
2018-04-14 15:43 Error Hello2  
2018-04-14 12:22 Error Hello3  
2018-04-15 19:44 Error Hello4  
2018-04-16 16:43 Error Hello5

Выходные данные:

2018-04-13 11:33 Error Hello1  
2018-04-14 15:43 Error Hello2  
2018-04-14 12:22 Error Hello3  

Примечание. Я пробовал использовать команду sed ниже, но она показывает пустой вывод, потому что время упоминания отсутствует в файле.

sed -n '/2018-04-12 14:50/,/2018-04-14 14:20/p' log_file

Ответы [ 4 ]

2 голосов
/ 01 февраля 2020

awk обеспечивает сравнение строк с оператором > и < и конкатенацию строк путем простого объединения смежных строк. Простая версия для сбора записей между "2018-04-12 14:50" и "2018-04-14 14:20" может быть:

$ awk '$1" "$2 > "2018-04-12 14:50" && $1" "$2 < "2018-04-14 14:20"' log
2018-04-13 11:33 Error Hello1
2018-04-14 12:22 Error Hello3

( примечание: "2018-04-14 15:43 Error Hello2" не попадает в запрошенный диапазон)

1 голос
/ 01 февраля 2020

Строка с 2018-04-14 15:43 из вашего образца не попадает в диапазон, указанный в вашей команде sed.

В любом случае. вот что у меня есть:

awk -v a="2018-04-12 14:50" -v b="2018-04-14 14:20" \
  '$1 " " $2>=a{n=1} $1 " " $2>b{n=0} n' log_file

Или, для удобства чтения (и комментирования):

awk -v a="2018-04-12 14:50" -v b="2018-04-14 14:20" '
  $1 " " $2 >= a { n=1 }  # If the current line is greater than our start, set mark
  $1 " " $2 >  b { n=0 }  # If the current line is greater than our end, unset mark
  n                      # If our mark is set, print the line
' log_file

Это решение оценивает первые слова в каждой строке по отношению к входные переменные, которые вы устанавливаете с помощью опции -v в awk.

Это работает, потому что оператор awk > оценивает порядок сортировки при использовании со строками, а ваши даты, к счастью, соответствуют ISO 8601, поэтому сортировка работает.

0 голосов
/ 01 февраля 2020
$ awk -v beg='2018-04-12 14:50' -v end='2018-04-14 14:20' '{cur=$1" "$2} beg<=cur && cur<=end' file
2018-04-13 11:33 Error Hello1
2018-04-14 12:22 Error Hello3
0 голосов
/ 01 февраля 2020

Предполагая, что поля даты и времени являются последовательными по своей природе (ваша третья строка не в порядке, поэтому я предполагаю, что здесь должна быть дата 2018-04-13, к которой я ее изменил), вы можете сделать это с помощью простой Команда awk в соответствии со следующими расшифровками (игнорируйте бит pax>, это мое приглашение):

pax> awk '$1"_"$2>"2018-04-14_14:20"{exit} $1"_"$2>="2018-04-12_14:50"{print}' infile
2018-04-13 11:33 Error Hello1
2018-04-13 15:43 Error Hello2
2018-04-14 12:22 Error Hello3

Первое предложение просто завершается, когда вы находите дату за желаемым концом. Второе предложение (если первое предложение еще не вызвало выход) напечатает каждую строку, где дата и время находятся в начале или за пределами начала.


Если эти строки действительно разрешено быть не в порядке, и вам нужны строки в диапазоне дат, где бы они ни находились в файле, вам просто нужно обработать весь файл, распечатав те, которые соответствуют:

pax> awk '$1"_"$2>="2018-04-12_14:50"&&$1"_"$2<="2018-04-14_14:20"{print}' infile
2018-04-13 11:33 Error Hello1
2018-04-13 15:43 Error Hello2
2018-04-14 12:22 Error Hello3

Изменение обратно к исходному файлу с неправильной датой третьей строки, и в этом случае вы получите правильный вывод:

2018-04-13 11:33 Error Hello1
2018-04-14 12:22 Error Hello3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...