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

Как извлечь журналы между двумя отметками времени, строка может начинаться с даты и времени, а может и не начинаться. Я пытаюсь выполнить ниже, и это только извлечение строк, начинающихся только с даты и времени. Формат 2014-04-07 23:002014-04-07 23:00

 $ awk \ '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/ { if ($1" "$2 >= "2014-04-07 23:00") p=1; if ($1" "$2 >= "2014-04-08 02:00") p=0; } p { print $0 }' log 

Вот мои данные:

 2014-04-07 22:59:10.001 agaggagag gagagg 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 asgsaftewtewt 1253536443755475 2014-04-08 10:55:34.934 etwtewtewppip jklhlljkjvncncmmm sghywywywywyw 

Я хочу извлечь все данные между 2014-04-07 23:00 и 2014-04-08 02:00

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 

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

  $ 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 вместе.

Я создал простой сценарий для вашей цели. Проверить это полезно для вас

[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