Искать только последние n строк файла на предмет соответствия текстового шаблона и печатать имена файлов, у которых нет этого шаблона - PullRequest
0 голосов
/ 01 мая 2018

Я хотел бы найти последние 2 строки группы файлов с одинаковыми именами для данного текстового шаблона и записать имена файлов, в которых найдены совпадения НЕ .

Я пробовал это:

tail -n 2 slurm-* | grep -L "run complete"

Как видите, "slurm" - это база файлов, и я хочу найти файлы, в которых "run complete" отсутствует. Тем не менее, эта команда не дает мне никакого вывода. Я попробовал обычную (не обратную) задачу:

tail -n 2 slurm-* | grep -H "run complete"

и я получаю кучу выходных данных (все найденные совпадения, но не имена файлов):

(standard input):run complete

Я полагаю, что я неправильно понял, как работает вывод хвостовой части в grep, любая помощь очень ценится.

1 Ответ

0 голосов
/ 02 мая 2018

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

for file in `ls slurm-*`;
do
res=`tail -n2 $file | grep "run complete" 1>/dev/null 2>&1; echo $?`;
  if [ $res -ne 0 ];
  then
    echo $file ;
  fi ;
done ;

Объяснение -

"echo $?" дает нам код возврата команды grep. Если grep находит шаблон в файле, он возвращает 0. В противном случае код возврата не равен нулю.

Мы проверяем этот ненулевой код возврата, и только затем "выводим" имя файла. Поскольку вы не упомянули, нужен ли вывод grep, я отбросил STD_OUT и STD_ERR, отправив его в /dev/null.

.
...