Распечатайте содержание первого файла, который содержит некоторые определенные строки

Я ищу команду, которая печатает содержание первого файла, найденного в / и т.д., который содержит строку 10.17.1 или 130.236.189 где команды должны были использоваться: find, grep, head, xargs, и cat.

Чего я достиг, прежде чем ответ Ravexina и с некоторой справкой был чем-то как ниже.

sudo egrep –rl '(10.17.1|130.236.189)' /etc | head -1 | cat
1
задан 15 April 2017 в 23:32

3 ответа

Я бы сказал:

grep  -lRE  '10.17.1|130.236.189' /etc/ | head -1 | xargs cat
  • grep используется с -R для рекурсивного поиска /etc при использовании -E для использования расширенных возможностей grep.
  • Переключатель -l с grep используется для печати только имен файлов вместо содержимого.
  • Затем перенаправьте его на xargs и xargs передаст имя файла в качестве параметра tor cat
  • После того, как все cat распечатает его.

Если вам нужно использовать find:

find /etc/ 2> /dev/null | xargs grep -lE '10.17.1|130.236.189' 2> /dev/null | head -1 | xargs cat

Я использовал 2> /dev/null, чтобы игнорировать ошибки прав доступа, когда я обычный пользователь, если вы используете [ 119], нет необходимости их использовать;)

2
ответ дан 3 December 2019 в 06:54

Я думаю, что Вы могли избежать head и xargs при помощи статус выхода из grep как логический предикат в эти find команда, например,

find /etc -type f -exec grep -IFq -e '10.17.1' -e '130.236.189' {} \; -exec cat {} \; -quit

Объяснение grep флаги:

  • -I игнорируют двоичные файлы (обычно не хотят держать, они)
  • -F рассматривают шаблоны как фиксированные строки, а не регулярные выражения (избегает потребности выйти из периодов - за счет неспособности использовать оператор regex |)
  • -q выход сразу с нулевым состоянием, если соответствие найдено

первый файл, в котором grep находит, что соответствие заставит это выходить с нулевым состоянием, которое в свою очередь заставит find выполняться cat на том файле. Принятие эти cat успешно, find будет затем quit так, чтобы только содержание первого файла соответствия было распечатано.

2
ответ дан 3 December 2019 в 06:54

Вот то, что я сделал бы:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

Путем это работает, в основном похож так:

  • мы позволяем find файлы определения местоположения дескриптора ( -type f) и для каждого из них выполняющий использование команды -exec ... {}\; флаг
  • та определенная команда будет в форме bash -c 'command1;command2' arg1 arg2
  • каждый файл, который найден, передается как аргумент bash -c и в рамках самой команды это рецензируется к как $1 переменная
  • grep -q бесшумно проверит файл на основное регулярное выражение 10\.17\.1\|130\.236\.189 и выход с 0, если текст найден или 1 если не найденным.
  • после успешного открытия текста мы печатаем использование имени файла printf команда, и затем cat файл.

Тестовый прогон:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

>>> ./somefile.txt
10.17.1
some other text
>>> ./somefile2.txt
another file, 130.236.189
some other text
0
ответ дан 3 December 2019 в 06:54

Другие вопросы по тегам:

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