Использовать команду grep, но только для последних строк файла? - PullRequest
3 голосов
/ 17 апреля 2019

Как я могу выполнить grep только для «хвоста» файла?

Я пытаюсь запустить эту команду:

grep 'TEST COMPLETE' -L *.log

TEST COMPLETE отображается в последних двух строках, эта команда выводит список всех файлов в папке, которые еще не завершили тест (из-за -L). Журналы очень большие, хотя grep очень медленный.

С другой стороны, я могу использовать трубку на хвосте. Грэп почти мгновенный:

tail *.log | grep 'TEST COMPLETE'

Однако я не могу использовать аргументы -l или -L, так как теперь я копирую ввод канала, а не файл. Запустив его с аргументом list files:

tail *.log | grep 'TEST COMPLETE' -L

Будет просто выводить: (standard input)

Можно ли как-нибудь заставить grep искать по последним 10 строкам или что-то в этом роде?

Ответы [ 4 ]

6 голосов
/ 17 апреля 2019

Вы можете просто сделать это в цикле for:

for log in *.log; do
   if ! tail "$log" | grep -q 'TEST COMPLETE'; then
      echo "$log"
   fi
done
2 голосов
/ 17 апреля 2019

Это должно работать:

for f in *.log; do  tail "$f" | grep -q 'TEST COMPLETE' || echo "$f"; done
0 голосов
/ 18 апреля 2019

Предполагая, tail *.log помещает ==> filename <== между каждым файлом, и эта строка не встречается ни в одном из файлов:

tail *.log |
awk 'gsub(/^==> | <==$/,""){if (f) print f; f=""} /TEST COMPLETE/{f=FILENAME} END{if (f) print f}'
0 голосов
/ 17 апреля 2019

tail -n10 FILENAME Даст вам последние 10 строк файла. Затем вы можете передать это в grep, как сделано в вашем вопросе.

...