kent, grep --versionesse é o comando a ser usado para conhecer a versão grep? Se assim for, não está funcionando. Não foi possível encontrar nenhum outro comando para conhecer a versão grep.
Vivek
2
boa pergunta, mas 'Versão do sistema
operacional
1
O SO e a versão são irrelevantes aqui.
MD XF
grep 'pattern' *
User0
Respostas:
430
Experimente este pequeno truque para persuadir grep -se de que está lidando com vários arquivos, para exibir o nome do arquivo:
Sim, funcionou. Você pode me dizer qual é o significado de adicionar /dev/nulleste comando?
Vivek
55
Se grepfor fornecido com vários nomes de arquivos, ele os exibirá automaticamente antes da partida, mas deixará o nome do arquivo no caso de um único arquivo de entrada. Ao usar /dev/nullcomo um arquivo de entrada extra grep"pensa" que lidar com vários arquivos, mas / dev / null é, naturalmente, esvaziar, por isso não vai aparecer na lista jogo ..
Scrutinizer
32
Usar / dev / null é um truque inteligente, mas acho que a sugestão abaixo da bandeira -H é uma resposta melhor.
JohnQ
22
OK, mas a -Hopção para grep não faz parte do POSIX, e o sistema operacional usado é o Solaris 10, onde nem o grep padrão nem a versão compatível com POSIX do grep têm a -Hopção.
Escrutinador
4
Isso é importante se você estiver usando grep com find, como find . -name foo -exec grep pattern {} \;- assumindo muitos arquivos nomeados fooem seu subdiretório, findainda entregará grepum único arquivo para operar por vez. O /dev/nulltruque parece funcionar em todos os sabores linux / osx que eu tentei, então parabéns! Note que acho que -Hé mais limpo, mas, como mencionado abaixo, pode não ser compatível com a sua versão do grep.
V Jon
296
Se você tem as opções -H e está -ndisponível ( man grepé seu amigo):
@ codeforester Eu não conheço nenhum outro greps, então eu não sei.
MD XF
2
Legal ! isso funcionou para linux. se você usa mac, pode instalar o coreutils com o brew. E lembre-se add PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" ao seu .bashrc
zw963
2
Isso (também) funcionou no MinGW (1.0.17, eu acho).
31516 Peter Mortensen
Funciona para mim com o Mac grep embutido (2.5.1-FreeBSD). Mas, para usar o grep alternativo do Homebrew, outra maneira é executar brew install grepe usar ggrep. Não há necessidade de modificar PATH.
wonderlr
5
Que tal isso, que consegui graças, em parte, a este post.
Você deseja encontrar vários arquivos, digamos logs com nomes diferentes, mas com um padrão (por exemplo filename=logfile.DATE), dentro de vários diretórios com um padrão (por exemplo /logsapp1, /logsapp2). Cada arquivo tem um padrão que você deseja grep (por exemplo "init time") e deseja ter o "init time"de cada arquivo, mas sabendo a qual arquivo pertence.
Ou apenas usando findfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Martin
1
Esta é uma pequena modificação de uma solução anterior. Meu exemplo procura o redirecionamento stderr nos scripts bash:
grep '2>' $(find . -name "*.bash")
grep --version
grep --version
esse é o comando a ser usado para conhecer a versão grep? Se assim for, não está funcionando. Não foi possível encontrar nenhum outro comando para conhecer a versão grep.grep 'pattern' *
Respostas:
Experimente este pequeno truque para persuadir
grep
-se de que está lidando com vários arquivos, para exibir o nome do arquivo:Para também obter o número da linha:
fonte
/dev/null
este comando?grep
for fornecido com vários nomes de arquivos, ele os exibirá automaticamente antes da partida, mas deixará o nome do arquivo no caso de um único arquivo de entrada. Ao usar/dev/null
como um arquivo de entrada extragrep
"pensa" que lidar com vários arquivos, mas / dev / null é, naturalmente, esvaziar, por isso não vai aparecer na lista jogo ..-H
opção para grep não faz parte do POSIX, e o sistema operacional usado é o Solaris 10, onde nem o grep padrão nem a versão compatível com POSIX do grep têm a-H
opção.find . -name foo -exec grep pattern {} \;
- assumindo muitos arquivos nomeadosfoo
em seu subdiretório,find
ainda entregarágrep
um único arquivo para operar por vez. O/dev/null
truque parece funcionar em todos os sabores linux / osx que eu tentei, então parabéns! Note que acho que-H
é mais limpo, mas, como mencionado abaixo, pode não ser compatível com a sua versão dogrep
.Se você tem as opções
-H
e está-n
disponível (man grep
é seu amigo):Opções:
-H
é uma extensão GNU, mas-n
é especificada pelo POSIXfonte
-H
não é suportado aqui.Não é necessário truque.
Com números de linha:
fonte
grep
s, então eu não sei.brew install grep
e usarggrep
. Não há necessidade de modificar PATH.Que tal isso, que consegui graças, em parte, a este post.
Você deseja encontrar vários arquivos, digamos logs com nomes diferentes, mas com um padrão (por exemplo
filename=logfile.DATE
), dentro de vários diretórios com um padrão (por exemplo/logsapp1, /logsapp2
). Cada arquivo tem um padrão que você deseja grep (por exemplo"init time"
) e deseja ter o"init time"
de cada arquivo, mas sabendo a qual arquivo pertence.Então,
outputfilename.txt
seria algo comoEm geral
Explicação:
find
O comando pesquisará os nomes de arquivos com base no padrãoentão, o pipe
xargs -I{}
redirecionará afind
saída para o{}
qual será a entrada para
grep ""pattern" {}
Em seguida, o truque para
grep
exibir os nomes dos arquivos\dev\null
e, finalmente, escreva a saída em arquivo com
tee outputfile.txt
Isso funcionou para mim na
grep
versão 9.0.5 build 1989.fonte
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Esta é uma pequena modificação de uma solução anterior. Meu exemplo procura o redirecionamento stderr nos scripts bash:
grep '2>' $(find . -name "*.bash")
fonte
trabalhou para eu pesquisar todos os arquivos .txt (insira seu próprio valor de pesquisa, é claro).
fonte