В bash Я хочу вернуть имя файла (и путь к файлу) для каждого файла типа .php|.html|.js
, содержащего строку без учета регистра "document.cookie" | "setcookie"
Как мне это сделать?
В bash Я хочу вернуть имя файла (и путь к файлу) для каждого файла типа .php|.html|.js
, содержащего строку без учета регистра "document.cookie" | "setcookie"
Как мне это сделать?
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
Флаг r
означает рекурсивный поиск (поиск в подкаталогах). Флаг i
означает, что регистр не учитывается.
Если вам просто нужны имена файлов, добавьте флаг l
(строчные буквы L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
Попробуйте что-то вроде grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
-i
делает это регистронезависимым
.
в конце означает, что вы хотите начать с текущего каталога, его можно заменить любым каталогом.
-r
означает делать это рекурсивно, прямо вниз по дереву каталогов
-n
печатает номер строки для совпадений.
--include
позволяет добавлять имена файлов, расширения. Подстановочные знаки приняты
Для получения дополнительной информации см.: http://www.gnu.org/software/grep/
find
и grep
для строки:
Здесь будут найдены все файлы трех типов в /start/path и grep для регулярного выражения '(document\.cookie|setcookie)'
. Разделить на две строки с обратной косой чертой только для удобства чтения...
find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
xargs egrep -i '(document\.cookie|setcookie)'
Звучит как идеальная работа для grep
или, возможно, ack
Или эта замечательная конструкция:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
Чтобы включить еще одну альтернативу, вы также можете использовать это:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Где:
-regextype posix-extended
сообщает find
, какое регулярное выражение ожидать-regex "^.*\.(php|html|js)$"
сообщает find
, что имена файлов регулярных выражений должны совпадать с -exec grep -EH '(document\.cookie|setcookie)' {} \;
сообщает find
выполнить команду (с ее параметрами и аргументами), указанную между опцией -exec
и \;
для каждого найденного файла, где {}
обозначает, где находится файл путь идет в этой команде.
а
E
указывает grep
использовать расширенное регулярное выражение (для поддержки круглых скобок) и...H
указывает grep
печатать пути файлов до совпадений.И, учитывая это, если вам нужны только пути к файлам, вы можете использовать:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Где
|
[pipe] посылает вывод find
следующей команде после этого (которая sed
, затем sort
)r
указывает sed
использовать расширенное регулярное выражение.s/HI/BYE/
сообщает sed
заменить каждое первое вхождение (на строку) "HI" на "BYE" и...s/(^.*):.*$/\1/
сообщает ему заменить регулярное выражение (^.*):.*$
(что означает группа [материал, заключенный в ()
], включая все [.*
= один или несколько символов любого типа] из начало строки [^
] до "первой": "за ней следует что-нибудь до конца строки [$
]) с помощью первой группы [\1
] заменено регулярное выражение.u
говорит sort для удаления повторяющихся записей (возьмите sort -u
как необязательный).... FAR - самый элегантный способ. Как я уже сказал, мое намерение состоит в том, чтобы увеличить диапазон возможностей (а также дать более полное объяснение некоторых инструментов, которые вы могли бы использовать).