Стандарт grep не может сделать, это, но последние версии GNU grep может. Можно обратиться к sed, awk или жемчугу. Вот несколько примеров, которые делают то, что Вы хотите на своем демонстрационном входе; они ведут себя немного по-другому в угловых случаях.
Замена foobar word other stuff
word
, распечатайте, только если замена сделана.
sed -n -e 's/^foobar \([[:alnum:]]\+\).*/\1/p'
Если первое слово foobar
, распечатайте второе слово.
awk '$1 == "foobar" {print $2}'
Полоса foobar
если это - первое слово, и пропустите строку иначе; затем разделите все после первого пробела и печати.
perl -lne 's/^foobar\s+// or next; s/\s.*//; print'
Вы пропустили a ;
(оставленный здесь как \;
препятствовать тому, чтобы оболочка интерпретировала его) или a +
и a {}
:
find . -exec grep chrome {} \;
или
find . -exec grep chrome {} +
find
выполнится grep
и займет место {}
с найденным именем (именами) файла.Разница между ;
и +
это с ;
сингл grep
команда для каждого файла выполняется тогда как с +
как можно больше файлов дано как параметры к grep
сразу.
Вы не должны использовать find
для этого вообще; grep может обработать открытие файлов любой из списка шарика всего в текущем каталоге:
grep chrome *
... или даже рекурсивно для папки и всего под ним:
grep chrome . -R
find
когда grep
мог сделать задание, но в некоторых случаях будет более эффективно для использования, находят к прекрасному зубцу список файлов перед выходом в grep.
– Caleb
10.05.2011, 09:53
find . | xargs grep 'chrome'
можно также сделать:
find . | xargs grep 'chrome' -ls
Первые шоу Вы строки в файлах, второе просто перечисляет файлы.
Опция Caleb более опрятна, меньше нажатий клавиш.
xargs
это, это ожидает, что его вход будет заключен в кавычки специфическим способом который find
не производит. Так find … | xargs …
не работает, если у Вас есть имена файлов, содержащие пробел или \'"
. положительные стороны
– Gilles 'SO- stop being evil'
10.05.2011, 09:31
find . | xargs -n1 -iX grep "X" 'chrome'
так, чтобы аргументы питались по одному и заключались в кавычки. Очевидно, это - ужасно неэффективный способ обработать этот пример, но для некоторых ситуаций это хорошо.
– Caleb
10.05.2011, 14:56
xargs
справьтесь с именами файлов Linux, find ... -print0 | xargs -0
, использование NUL как разделитель. Альтернатива - xargs -d '\n'
с помощью новой строки в качестве разделителя, 99%-й надежности.
– user1686
10.05.2011, 23:18
Чтобы увидеть список файлов вместо строк:
grep -l "chrome" *
или:
grep -r -l "chrome" .
Найти можно одним способом, и вы можете попробовать the_silver_searcher
, тогда все, что вам нужно сделать, это
ag chrome
Он будет искать хром во всех файлах (включая подкаталоги), и это быстрее, чем find
Вот пример того, как я обычно использую find/exec...
find . -name "*.py" -print -exec fgrep hello {} \;
Это рекурсивно ищет все файлы .py и каждый файл распечатывает имя файла и fgrep для «привет» на этот (для каждого) файл. Вывод выглядит так (только что запустил один сегодня):
./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"
grep -ls
в конструкции находки. – Caleb 10.05.2011, 09:55find . -exec grep foo {} +
покажет, что Вы производите как это./dir/file.py:from foo import bar
– s g 17.04.2015, 23:30find . -exec grep foo {} \;
покажет, что Вы производите как этоfrom foo import bar
– s g 17.04.2015, 23:31find . -exec grep -l foo {} +
покажет, что Вы производите как это./dir/file.py
– s g 17.04.2015, 23:32find . -exec grep -l foo {} \;
покажет, что Вы производите как это./dir/file.py
– s g 17.04.2015, 23:33