Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

1. Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 07/12/2020 - 02:28h

Boa Noite a Todos. Não estou conseguindo buscar com o grep apenas em um tipo de arquivo! Se alguém puder me ajudar a completar meu comando, agradeço!

OBS MUITO IMPORTANTE: Não quero usar find ou nenhum outro comando junto com o grep, porque isso eu sei fazer! Meu objetivo é usar apenas o grep! Logo se o grep não pode fazer o que desejo, basta me informar que eu uso outra solução!

O comando abaixo funciona mas não busca em Sub-diretórios obviamente:
grep nick *.txt 

Baseado no comando acima tentei:
grep -r nick *.txt 

Mas não funciona! Ou seja, incluo o recursive e o *.txt fica bugado! Não localizando mais nada em lugar algum!

Então estou perdido! É possível eu informar ao comando grep que desejo que ele verifique APENAS naquele tipo de arquivo?


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/12/2020 - 17:02h


Nick-us escreveu:

msoliver escreveu:
Sim, é possível!
Utilize a opção "--include=GLOB"
--include=GLOB
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).

Ainda não consegui, possivelmente pq não entendi como usar o comando! Eu tentei da forma abaixo mas nenhuma funcionou!
grep Nubank -r --include=GLOB *.txt
grep Nubank -r --include=GLOB *.txt *
grep -r --include=GLOB *.txt Nubank
grep -r --include=GLOB *.txt Nubank *
grep -r --include=GLOB Nubank *.txt
grep --include=GLOB Nubank *.txt -r
grep -r --include=GLOB /.*.txt Nubank *

Poderia me mostrar um exemplo pronto de como procurar a "PALAVRA" em sub-diretórios usando o GLOB?

Boa tarde Nick!
"GLOB" é onde vai "PROCURAR", no caso *.txt
Exemplo:
Procura por 'onchange', recursivamente somente nos arquivos *.html
grep -ro --include=*.html 'onchange' adminq/HTML/ 

+Detalhes:
https://www.cyberciti.biz/faq/unix-linux-grep-include-file-pattern-recursive-example/

______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


3. Re: Como usar o Grep filtrando o tipo de arquivo?

pam
pam30

(usa Outra)

Enviado em 07/12/2020 - 06:57h

Vc vai precisar do globstar

$ shopt -s globstar 


Daí poderá:

$ grep nick **/*.txt 


Se precisar ir para dentro de pastas e arquivos começando
com . , ative a opção de shell dotglob.

Para retornar as configs padrão da shell:

$ shopt -u globstar dotglob 


Se tiver arquivos txt demais e atigir o limite
de argumentos do grep, vai precisar usar o xargs
com o grep:

$ printf '%s\n' **/*.txt | xargs grep nick 


A sintaxe do find é muito dolorosa como é dito
no manual do find, mas o glob tem seus truques, tb..

Manual do find unix 8:

BUGS
The syntax is painful.

http://man.cat-v.org/unix_8th/1/find


4. Re: Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/12/2020 - 22:26h

Então estou perdido! É possível eu informar ao comando grep que desejo que ele verifique APENAS naquele tipo de arquivo?
Sim, é possível!
Utilize a opção "--include=GLOB"
--include=GLOB
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
é parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________



5. Re: Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 08/12/2020 - 05:29h

msoliver escreveu:
Sim, é possível!
Utilize a opção "--include=GLOB"
--include=GLOB
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).

Ainda não consegui, possivelmente pq não entendi como usar o comando! Eu tentei da forma abaixo mas nenhuma funcionou!
grep Nubank -r --include=GLOB *.txt
grep Nubank -r --include=GLOB *.txt *
grep -r --include=GLOB *.txt Nubank
grep -r --include=GLOB *.txt Nubank *
grep -r --include=GLOB Nubank *.txt
grep --include=GLOB Nubank *.txt -r
grep -r --include=GLOB /.*.txt Nubank *

Poderia me mostrar um exemplo pronto de como procurar a "PALAVRA" em sub-diretórios usando o GLOB?


6. Re: Como usar o Grep filtrando o tipo de arquivo?

pam
pam30

(usa Outra)

Enviado em 08/12/2020 - 08:13h

Tem muitos greps que não tem essa opção,
por exemplo o grep do busybox não tem.
Parece que o grep do BSD *não* tem o --include ..
Além disso, usar o glob da shell funciona
com todos os comandos, com todas as shells..

Mas se tem opção no GNU grep, não tem pq não usar..

$ grep -r --include='*.txt' nick


7. Re: Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 10/12/2020 - 07:22h

pam30 escreveu:
Tem muitos greps que não tem essa opção,
por exemplo o grep do busybox não tem.
Parece que o grep do BSD *não* tem o --include ..
Além disso, usar o glob da shell funciona
com todos os comandos, com todas as shells..

Mas se tem opção no GNU grep, não tem pq não usar..

$ grep -r --include='*.txt' nick

Muito Obrigado Pam! Achei bastante interessante o comentário que vc fez sobre os diferentes greps, é bom estar atento a isso, até porque penso em um dia testar o BSD e ficarei atento a diferença que possa existir entre programas que eu imaginava que seriam iguais!

Eu pensei em encerrar essa pergunta te selecionando como melhor resposta, porque consegui resolver baseado em sua resposta, visto que vc deu a resposta completa primeiro, mas pensei um pouco e acho que não seria exatamente justo com o msoliver que respondeu primeiro, visto que ele corrigiu a resposta, adicionando as informações faltantes. Na minha opinião foi apenas um descuido, pois ele imaginou que eu entenderia a resposta dele o que seria até normal, mas eu de fato não entendi! E não tenho como dar melhor resposta para 2 pessoas!

Mas de qualquer forma muito obrigado!




8. Re: Como usar o Grep filtrando o tipo de arquivo? [RESOLVIDO]

pam
pam30

(usa Outra)

Enviado em 10/12/2020 - 07:46h

pode pontuar o msoliver , ele sempre merece.
eu não ligo para pontuação,
um comentário de resp é muito melhor.

(off-topic)
eu tenho feito um script para imitar o grep
usando só built-ins da shell..
dá para fazer umas coisa se for uma pesquisa
simples, não tiver o grep mas tiver a shell:

Usando string fixa (e globs no teste [[ ]] ):
for arq in *.txt ;do linha=1 ;while IFS=  read ;do ((linha++)) ;[[ "$REPLY" = *nick* ]] && echo "$arq:$linha: $REPLY" ;done <"$arq" ;done 

Colocando tudo em minúsculas ( mesmoq ue grep -i) e usando REGEX (grep -E), "nick" e "nubank" devem estar na mesma linha:
for arq in *.txt ;do linha=1 ;while IFS=  read ;do ((linha++)) ;[[ "${REPLY,,}" =~ nick.*nubank ]] && echo "$arq:$linha: $REPLY" ;done <"$arq" ;done 

Sensível a maiúsculas e usando REGEX (grep -E) com mais de uma string de procura:
for arq in *.txt ;do linha=1 ;while IFS=  read ;do ((linha++)) ;[[ "$REPLY" =~ (nick|NuBank) ]] && echo "$arq:$linha: $REPLY" ;done <"$arq";done 


O For loop é para garantir que ele vai passar por todos os arquivos gerados pelo glob *.txt
(mas pode ser o nome de um único arquivo).
O While loop vai ler linha por linha de cada arquivo, contar o número de linhas
e dando certo o teste [[ ]], vai imprimir o nome do arquivo com o número da linha
e a linha em seguida...

flwz






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts