пока grep несколько файлов, как мне остановиться после первого совпадения? - PullRequest
10 голосов
/ 31 марта 2009

У меня есть список шаблонов в текстовом файле, для которого я использую bzgrep для сопоставления с несколькими файлами:

for pattern in $(cat ~/patterns.txt); do echo $pattern; bzgrep -i $pattern *.bz2; done

Как заставить bzgrep (grep) остановиться после первого совпадения текущего шаблона (мне нужно, чтобы он был полностью остановлен, а не останавливаться на текущем файле grep'ed) и перейти к следующему шаблону Я прочитал о параметре "-m 1", но я думаю, что он останавливается только на текущем файле. Есть идеи?

Спасибо

Ответы [ 5 ]

12 голосов
/ 31 марта 2009

Передайте вывод grep до head -n 1; это потянет (и передаст) первую строку и проигнорирует остальные (то есть уничтожит исходный канал).

5 голосов
/ 31 марта 2009
for pattern in $(< ~/patterns.txt); do
  echo "$pattern"
  for i in *.bz2; do
    bzgrep -i "$pattern" "$i" && break
  done
done

Вы можете добавить -H к grep для отображения имени файла: строка, а не просто строка.

4 голосов
/ 31 марта 2009

Вы можете использовать переключатель -q (--quiet aka --silent). Затем проверьте, успешно ли выполнена команда. Это ничего не выводит и прекращает поиск сразу после нахождения совпадения, а просто возвращает успех или неудачу.

1 голос
/ 31 марта 2009

Вот пример:

for i in  ~/bin/*; do grep -m 1 lua $i /dev/null && break; done

То же самое работает с bzgrep; после первого успешного матча вы выходите из цикла.

Включая /dev/null, вы получите имя файла в случае, если у вас есть какой-то вид grep динозавра, который не распознает параметр -H.

0 голосов
/ 09 мая 2009

Если вы используете ack, в http://betterthangrep.com/, вы можете использовать флаг -1 именно по этой причине.

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