Сделать grep stop после первой несовпадающей строки - PullRequest
6 голосов
/ 20 января 2012

Я пытаюсь использовать grep, чтобы просмотреть некоторые журналы и выбрать только самые последние записи.В журналах много лет интенсивного трафика, поэтому глупо делать

    tac error.log | grep 2012
    tac error.log | grep "Jan.2012" 

и т. Д.

и ждать 10 минут, пока он проходит несколько миллионов строк, которые, как я уже знаю, не идутчтобы соответствовать.Я знаю, что есть опция -m, чтобы остановиться на первом матче, но я не знаю, как сделать так, чтобы он остановился на первом не матче.Я мог бы сделать что-то вроде grep -B MAX_INT -m 1 2011, но вряд ли это было бы оптимальным решением.

Может ли grep справиться с этим или в awk есть смысл?

Ответы [ 4 ]

5 голосов
/ 20 января 2012

Как насчет использования awk следующим образом:

tac error.log | awk '{if(/2012/)print;else exit}'

Это должно завершиться, как только будет найдена строка, не соответствующая 2012 году.

2 голосов
/ 20 января 2012

Вот решение на python:

# foo.py
import sys, re
for line in sys.stdin:
    if re.match(r'2012', line):
        print line,
        continue
    break

you @ host> tac foo.txt | python foo.py

1 голос
/ 20 января 2012

Превосходные однострочные скрипты для sed страницы для спасения:

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

Другими словами, вы должны быть в состоянии сделать следующее:

sed -n '/Jan 01 2012/,/Feb 01 2012/p' error.log | grep whatevs
1 голос
/ 20 января 2012

Я не думаю, что grep поддерживает это.

Но вот мой ответ "почему у нас снова awk":

tail -n `tac biglogfile | grep -vnm1 2012 | sed 's/:.*//' | xargs expr -1 +` biglogfile

Обратите внимание, что это не 'не будет точным, если ваш журнал записывается в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...