find + como imprimir o nome do arquivo quando o grep é correspondido [duplicado]

0

o seguinte comando find útil, imprime o valor da tag Name

find /tmp -type f -name '*.xml' -exec grep -o -P '(?<=<Name>).*(?=</Name>)' {} \;

o problema é no caso de termos alguns arquivos xml em / tmp, então nunca sabemos qual arquivo xml tem a tag Name

ou em outras palavras, esta sintaxe de busca imprimirá o valor de Name

mas sem o nome do arquivo xml

por favor, conselhos sobre como imprimir o nome do arquivo quando grep corresponder ao:

(?<=<Name>).*(?=</Name>)
    
por yael 18.01.2018 / 09:05

4 respostas

1

grep sempre exibirá o nome do arquivo contendo a correspondência se mais de um arquivo for fornecido na linha de comando. Se você passar apenas um arquivo, nenhum nome de arquivo será impresso.

Para forçar sempre a impressão do nome do arquivo junto com a correspondência real, adicione /dev/null como um arquivo extra para o grep:

find /tmp -type f -name '*.xml' -exec grep -o -P '(?<=<Name>).*(?=</Name>)' {} /dev/null \;

Ou, para potencialmente menos invocações de grep , use find -exec grep ... {} + :

find /tmp -type f -name '*.xml' -exec grep -o -P '(?<=<Name>).*(?=</Name>)' /dev/null {} +

Pelo menos o GNU grep , bem como grep no OpenBSD e no FreeBSD também suportam o -H flag para sempre imprimir o nome do arquivo, mesmo se apenas um arquivo for dado. Como você usou grep -P , provavelmente está usando o GNU grep de qualquer maneira.

    
por 18.01.2018 / 09:09
1

Você simplesmente dá o parâmetro greps "-H", então o nome do arquivo sempre será impresso, mesmo se houver apenas um arquivo para o grep (como no seu caso).

    
por 18.01.2018 / 09:12
1

Note que grep não é a ferramenta certa para analisar arquivos xml / html (documentos) e não fornecerá uma solução robusta e sólida. Use analisadores xml / html "adequados", como xmlstarlet :

find /tmp -type f -name '*.xml' -exec xmlstarlet sel -t -m "//Name" -f -n {} \;
  • xmlstarlet sel -t -m "//Name" -f -n - imprimirá o nome do arquivo de entrada (assegurado pela opção -f ) apenas se o documento xml de entrada corresponder ( -m ) à expressão XPATH "//Name"
por 18.01.2018 / 09:22
0

Se você não se importar que o nome do arquivo seja impresso após as linhas encontradas, sempre encontrará a opção "-print":

find /tmp -type f -name '*.xml' -exec grep -o -P '(?<=<Name>).*(?=</Name>)' {} \; -print
    
por 18.01.2018 / 09:38