2

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

sed -n '/2014-03-27 07:00:00/ , /2014-03-27 11:25:00/p' log-file-name

Я ожидаю, что он напечатает все строки, которые соответствуют с 7 утра до 11 утра. Но я получаю ноль матчей. Если я удаляю «-n», он печатает целые строки с 3 часов утра до 16:14 в результате. Я попытался настроить команду sed выше с одинарными и двойными кавычками и пробовал разные варианты пробелов. Но результаты всегда "все или ничего". Может кто-нибудь объяснить, почему sed не печатает строки для часового окна, которое я прошу напечатать?

3 ответа3

1

Вы пытаетесь использовать sed с функцией запуска, остановки.

Таким образом, если найдена линия, соответствующая вашему первому (начальному) шаблону, выходные данные будут возвращаться до тех пор, пока не будет найдена линия, соответствующая второму (начальному) шаблону.

Если в вашем файле нет начальной строки, вы не получите результатов.

Удаление флажка -n из ваших опций означает, что все будут напечатаны, даже если они не соответствуют вашему шаблону. Использование sed с -n '/.../p' заставит его вести себя как grep.

Я нашел полезное руководство здесь

Для вашего случая вы можете рассмотреть шаблон что-то вроде:

\d{4}-\d{2}-\d{2} ((0[7-9])|(1[0-1])):\d{2}:\d{2},\d{3}

Выше будет соответствовать все время с 07:00 до 11:59
некоторые объяснения:
\d{4} = match 4 digits (year, eg. 2014)
(0[7-9]) = match 07 - 09
| = OR
(1[0-1]) = match 10 -11

0

Это будет сложно с помощью регулярных выражений. Возможно, что-то подобное сделает:

awk '$1 FS $2>=s{p=1} $1 FS $2>e{exit}p' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file

Объяснение:

awk '
  $1 FS $2>=s{     # `$1 FS $2` is the string the consists of field 1, a space, 
                   # and field 2. If it is larger or equal (string comparison) 
                   # to the variable s, then: 
    p=1            # set a variable p to 1
  }
  $1 FS $2>e{      # if the string $1 FS $2 is larger than variable e, then
    exit           # exit the script ( stop processing the file )
  }
  p                # if variable p is equal to 1 then print the record (line)
' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file    
                   # line above: set variables p and s and specify file name

$1 FS $2 - строка, состоящая из поля 1, пробела и поля 2. Если оно больше или равно (сравнение строк) переменной s, тогда установите для переменной p значение 1

0

Unix великолепен в выполнении небольших вещей, не делайте их слишком длинными. Это берет awk из связанного поста и добавляет канал даты.

Он находит все даты в начале строки с 2014-03-27, принимает эти выходные данные и находит все время с часами (второе поле), большими или равными 7 и менее 11.

grep ^2014-03-27 log-file | awk -F'[: ]' '$2 >= 7 && $2 < 11 { print }'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .