No bash, quero retornar o nome do arquivo (e o caminho para o arquivo) para cada arquivo do tipo que .php|.html|.js
contém a sequência que não diferencia maiúsculas de minúsculas"document.cookie" | "setcookie"
Como eu faria isso?
No bash, quero retornar o nome do arquivo (e o caminho para o arquivo) para cada arquivo do tipo que .php|.html|.js
contém a sequência que não diferencia maiúsculas de minúsculas"document.cookie" | "setcookie"
Como eu faria isso?
Respostas:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
O r
sinalizador significa pesquisar recursivamente (pesquisar subdiretórios). A i
bandeira significa que não diferencia maiúsculas de minúsculas.
Se você deseja apenas nomes de arquivos, adicione o sinalizador l
(minúsculo L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
no Ubuntu Desktop 16; alguma dica?
--include=\*.{php,html,js}
Tente algo como grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
o -i
torna caso insensível
o .
com os meios finais você deseja começar a partir de seu diretório atual, isso poderia ser substituído por qualquer diretório.
os -r
meios fazem isso recursivamente, na árvore de diretórios
o -n
imprime o número da linha para correspondências.
o --include
permite adicionar nomes de arquivos, extensões. Curingas aceitos
Para mais informações, consulte: http://www.gnu.org/software/grep/
-l
opção (apenas imprimir nomes de arquivos que jogo) em vez de-n
find
eles e grep
para a string:
Ele encontrará todos os arquivos dos seus três tipos em / initial / path e grep para a expressão regular '(document\.cookie|setcookie)'
. Divida mais de 2 linhas com a barra invertida apenas para facilitar a leitura ...
find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
xargs egrep -i '(document\.cookie|setcookie)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
no diretório de ~ 500Gb de peso.
Parece um trabalho perfeito para grep
ou talvez ack
Ou esta maravilhosa construção:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
-exec grep...
é melhor que o meu xargs
método, pois não engasga com espaços nos nomes de arquivos.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Obviamente, as outras opções também podem ser adicionadas.
Apenas para incluir mais uma alternativa, você também pode usar isto:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Onde:
-regextype posix-extended
diz find
que tipo de regex esperar-regex "^.*\.(php|html|js)$"
informa find
ao próprio regex que os nomes de arquivos devem corresponder-exec grep -EH '(document\.cookie|setcookie)' {} \;
diz find
para executar o comando (com suas opções e argumentos) especificado entre a -exec
opção e o \;
de cada arquivo encontrado, onde {}
representa onde o caminho do arquivo está nesse comando.
enquanto
E
opção diz grep
para usar regex estendido (para apoiar os parênteses) e ...H
opção diz grep
para imprimir caminhos de arquivo antes das correspondências.E, dado isso, se você quiser apenas caminhos de arquivo, poderá usar:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Onde
|
[pipe] envia a saída de find
para o próximo comando depois disso (que é sed
, então sort
)r
opção diz sed
para usar regex estendido.s/HI/BYE/
diz sed
para substituir toda Primeira ocorrência (por linha) de "HI" por "BYE" e ...s/(^.*):.*$/\1/
diz para substituir o regex (^.*):.*$
(ou seja, um grupo [incluído entre ()
] incluindo tudo [ .*
= um ou mais caracteres] desde o início da linha [ ^
] até 'o primeiro': 'seguido de qualquer coisa até' o final de linha [ $
]) pelo primeiro grupo [ \1
] do regex substituído.u
diz a classificação para remover entradas duplicadas (use sort -u
como opcional).... Longe de ser a maneira mais elegante. Como eu disse, minha intenção é aumentar o leque de possibilidades (e também dar explicações mais completas sobre algumas ferramentas que você pode usar).