Как работать, находят - должностное лицо?

Стандарт 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'

513
09.05.2011, 23:11
6 ответов

Вы пропустили a ; (оставленный здесь как \; препятствовать тому, чтобы оболочка интерпретировала его) или a + и a {}:

find . -exec grep chrome {} \;

или

find . -exec grep chrome {} +

find выполнится grep и займет место {} с найденным именем (именами) файла.Разница между ; и + это с ; сингл grep команда для каждого файла выполняется тогда как с + как можно больше файлов дано как параметры к grep сразу.

763
27.01.2020, 19:27
  • 1
    Если Вы используете \; окончание конструкции grep передается один файл за один раз, таким образом, это не отображает имя файла по умолчанию, только подобранные строки. Для получения списка файлов вместо этого добавляют использование grep -ls в конструкции находки. –  Caleb 10.05.2011, 09:55
  • 2
    find . -exec grep foo {} + покажет, что Вы производите как это ./dir/file.py:from foo import bar –  s g 17.04.2015, 23:30
  • 3
    find . -exec grep foo {} \; покажет, что Вы производите как это from foo import bar –  s g 17.04.2015, 23:31
  • 4
    find . -exec grep -l foo {} + покажет, что Вы производите как это ./dir/file.py –  s g 17.04.2015, 23:32
  • 5
    find . -exec grep -l foo {} \; покажет, что Вы производите как это ./dir/file.py –  s g 17.04.2015, 23:33

Вы не должны использовать find для этого вообще; grep может обработать открытие файлов любой из списка шарика всего в текущем каталоге:

grep chrome *

... или даже рекурсивно для папки и всего под ним:

grep chrome . -R
50
27.01.2020, 19:27
  • 1
    grep будет дросселировать, если расширение пробежится через ARG_MAX.-R посетит все, в то время как использование находит, что можно более легко добавить примитивы, чтобы исключить определенные файлы (-имя, и т.д.) или даже не посетить поддеревья (-чернослив). –  Mel 10.05.2011, 02:58
  • 2
    @Mel. Моя точка была то, что, по всей вероятности, спрашивающая сторона делала вещи более сложными, чем они должны были быть путем представления find когда grep мог сделать задание, но в некоторых случаях будет более эффективно для использования, находят к прекрасному зубцу список файлов перед выходом в grep. –  Caleb 10.05.2011, 09:53
  • 3
    @Mel grep не втискивает такой случай, exec делает. –  Chris Down 26.03.2013, 08:21
find . | xargs grep 'chrome'

можно также сделать:

find . | xargs grep 'chrome' -ls

Первые шоу Вы строки в файлах, второе просто перечисляет файлы.

Опция Caleb более опрятна, меньше нажатий клавиш.

20
27.01.2020, 19:27
  • 1
    Проблема с xargs это, это ожидает, что его вход будет заключен в кавычки специфическим способом который find не производит. Так find … | xargs … не работает, если у Вас есть имена файлов, содержащие пробел или \'". положительные стороны –  Gilles 'SO- stop being evil' 10.05.2011, 09:31
  • 2
    @Gilles можно обойти ту проблему при помощи чего-то как find . | xargs -n1 -iX grep "X" 'chrome' так, чтобы аргументы питались по одному и заключались в кавычки. Очевидно, это - ужасно неэффективный способ обработать этот пример, но для некоторых ситуаций это хорошо. –  Caleb 10.05.2011, 14:56
  • 3
    Для полноты мы должны также упомянуть-i опцию для нечувствительности к регистру с 'grep'. Также существует-iname в находке для нечувствительности к регистру. –  Mathew 10.05.2011, 15:01
  • 4
    @Caleb: только 100%-й надежный способ иметь xargs справьтесь с именами файлов Linux, find ... -print0 | xargs -0, использование NUL как разделитель. Альтернатива - xargs -d '\n' с помощью новой строки в качестве разделителя, 99%-й надежности. –  user1686 10.05.2011, 23:18
  • 5
    я часто использую это, но он перестанет работать для очень длинных списков имен файлов, в которых точке находят - должностное лицо, становится победителем. –  Spacemoose 05.07.2015, 12:08

Чтобы увидеть список файлов вместо строк:

grep -l "chrome" *

или:

grep -r -l "chrome" .
2
27.01.2020, 19:27

Найти можно одним способом, и вы можете попробовать the_silver_searcher , тогда все, что вам нужно сделать, это

ag chrome

Он будет искать хром во всех файлах (включая подкаталоги), и это быстрее, чем find

10
20.08.2021, 13:36

Вот пример того, как я обычно использую 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"
6
20.08.2021, 13:36

Теги

Похожие вопросы