Как извлечь журналы между двумя отметками времени, строка может начинаться или не начинаться с datetime

Этот формат позволяет вам выбирать из всех вариантов перечисления и сортировки ls:

ls -at $DIR | while read i; do echo $i; done
3
05.12.2016, 05:32
3 ответа

Измените начало сценария на

$ awk \
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/ \
      {
           ︙

или

$ awk \
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/    {
           ︙

В настоящее время в вашем сценарии есть три оператора:

  1. Если строка соответствует / ^ [0-9] {4} - [0-9] {2} - [0-9] {2} [0-2] [0-9]: [0-5] [0-9] / , распечатать (действие по умолчанию).
  2. Для всех строк (условие по умолчанию) установите p равным 1, если $ 1 $ 2 находится в пределах диапазона, и 0, если это не так.
  3. Если p не равно нулю, выведите строку.

Итак, каждая строка, которая выглядит как отметка даты и времени (на основе вашего регулярного выражения), печатается на основе утверждения 1. И каждая строка, содержащая дату -время штампа в диапазоне выбора печатается на основе взаимодействия между операторами 2 и 3.

Очевидно, вы хотите связать условие 1 и оператор 2 вместе.

0
27.01.2020, 21:37

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

Ваши операторы if ... предполагают, что поля даты / времени находятся в $ 1 и $ 2 , которые также (по определению) не обязательно верны. . Попробуйте вместо этого (это не проверено, потому что у меня нет образца ваших данных)

awk '
    {
        if (match($0, /\<[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]\>/))
        {
            s = substr($0, RSTART, RLENGTH)            
            if (s >= "2014-04-07 23:00") p=1
            if (s >= "2014-04-08 02:00") p=0
        }
    }
    p { print $0 }
' log

Вывод из образца данных

2014-04-07 23:40:33.345 aegsgssdh
wqtqttqtqtq
post
agggsdgg
2014-04-08 01:00:54.777 ggsdgwettwetewt
cvdgwetegdkiytitityi
error
0
27.01.2020, 21:37

Я создал простой сценарий для ваших целей. Убедитесь, что это полезно для вас

[upkar @ server2 one] # cat logxtract.sh

L1 = $ (grep - n "2014-04-07 23: [0-9] [0-9]" log | awk -F ":" '{print $ 1}')

L2 = $ (grep -n "2014-04- 08 02: [0-9] [0-9] "log | awk -F": "'{print $ 1}')

sed -n $ L1," $ L2 "p log

Вывод скрипт

[upkar @ server2 one] # sh logxtract.sh

2014-04-07 23:40:33.345 aegsgssdh

wqtqttqtqtq

post

agggsdgg

2014-04-08 01:00:54.777 ggsdgwettwetewt

cvdgwetegdkiytitityi

error

2014-04-08 02:02:22.009 qwwqtwtwebbcbewdhshsdh
0
27.01.2020, 21:37

Теги

Похожие вопросы