grep Последние n совпадения по файлам - PullRequest
5 голосов
/ 26 января 2012

Я использую grep для извлечения строк в наборе файлов:

grep somestring * .log

Можно ли ограничить максимальное количество совпадений в файле до последнего nсовпадения из каждого файла?

Ответы [ 4 ]

7 голосов
/ 26 января 2012

Ну, я думаю, что grep не поддерживает ограничение N совпадений в конце файла, так что это то, что вам нужно сделать

ls *.log | while read fn; do grep -iH create "$fn" | tail -1; done

Замените tail -1 -1 на N. (опция -H - напечатать имя файла, иначе оно не будет напечатано, если вы используете grep в одном файле, и это именно то, что мы делаем выше)

ПРИМЕЧАНИЕ. Выше soln будет хорошо работать с именами файлов с пробелами.

Для N совпадений с начала файла

grep -i -m1 create *.log

Заменить -m1 1 на N.

1 голос
/ 26 января 2012
for file in /path/to/logs/*.log 
do 
   tail <(grep -H 'pattern' "$file")
done

В этом списке будут отображаться последние 10 матчей, а tail по умолчанию отображает последние 10 строк.Если вы хотите получить другой номер, вам поможет следующее:

for file in /path/to/logs/*.log 
do 
   tail -n number <(grep -H 'pattern' "$file")
done

, где number может быть вашим числом строк

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

Вроде как здесь, но читайте это Как сделать что-то с каждым файлом в каталоге, используя bash? в качестве отправной точки.Вот мое мнение, предполагая, что только последние 20 совпадений из каждого файла.

for i in * 
do
  if test -f "$i" 
  then
    grep somestring $i | tail -n 20
  fi
done

Может быть не совсем правильно, нет файлов передо мной, чтобы проверить, но должно быть отправной точкой.

0 голосов
/ 05 декабря 2016

Последнее вхождение шаблон поиска в каждом файле журнала в текущем каталоге:

find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"

Первое вхождение шаблон поиска в каждом файле журнала в текущем каталоге:

find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | head -n1"

замените 1 в -n1 числом желаемых вхождений


В качестве альтернативы вы можете использовать find -exec вместо xargs

find . -name \*log\* -exec sh -c "grep --color=always -iH pattern {} | tail -n1" \;

Вы можете использовать -mtime с find, чтобы ограничить поиск файлов журналов, скажем, до 5 дней

find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"

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