Я ищу команду, которая печатает содержание первого файла, найденного в / и т.д., который содержит строку 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
Я бы сказал:
grep -lRE '10.17.1|130.236.189' /etc/ | head -1 | xargs cat
grep
используется с -R для рекурсивного поиска /etc
при использовании -E для использования расширенных возможностей grep. -l
с grep используется для печати только имен файлов вместо содержимого. xargs
и xargs передаст имя файла в качестве параметра tor 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], нет необходимости их использовать;)
Я думаю, что Вы могли избежать 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
так, чтобы только содержание первого файла соответствия было распечатано.
Вот то, что я сделал бы:
$ 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