Eu tenho arquivos de log muito longos, é possível pedir ao grep para pesquisar apenas as 10 primeiras linhas?
Eu tenho arquivos de log muito longos, é possível pedir ao grep para pesquisar apenas as 10 primeiras linhas?
Respostas:
A magia dos canos;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-lopção grep ? Eu gostaria de listar todos os arquivos com os 5 primeiros caracteres RIFFD.
Para as pessoas que encontrarem isso no Google, eu precisava pesquisar as primeiras nlinhas de vários arquivos, mas imprimir apenas os nomes de arquivos correspondentes. eu usei
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
Para o FNR..nextfileprocessamento de um arquivo depois que 10 linhas são vistas. Ele //..{}imprime o nome do arquivo e segue sempre que a primeira correspondência em um determinado arquivo é exibida. Para citar os nomes de arquivos em benefício de outros programas, use
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1apenas pesquisará a 1ª linha. Obrigado!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Ou use awkpara um único processo sem |:
awk '/your_regexp/ && NR < 11' INPUTFILE
Em cada linha, se your_regexpcorresponder, e o número de registros (linhas) for menor que 11, ele executará a ação padrão (que está imprimindo a linha de entrada).
Ou use sed:
sed -n '/your_regexp/p;10q' INPUTFILE
Verifica sua regexp e imprime a linha ( -nsignifica não imprimir a entrada, que é o padrão) e sai logo após a 10ª linha.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- Mais rápido.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilefaz.
awkish. 2xifse 1xelseem um comando que não precisa de nenhuma declaração de ação faria aho. weinberger e kernighan cry ...
Você tem algumas opções usando programas junto com grep. O mais simples na minha opinião é usar head:
head -n10 filename | grep ...
headproduzirá as 10 primeiras linhas (usando a -nopção) e você poderá canalizar essa saída para grep.
headusadas usaram -n 10 (inclusive eu) sem perceber que, headpor padrão, exibe apenas 10 linhas . :)
grep "pattern" <(head -n 10 filename)
Você pode usar a seguinte linha:
head -n 10 /path/to/file | grep [...]
A saída de head -10 filepode ser canalizada greppara fazer isso:
head -10 file | grep …
Usando Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2: imprime duas linhas antes do padrão.
-B 2: imprime duas linhas após o padrão.
head -10 log.txt # read the first 10 lines of the file.
-C 2fará o mesmo que-A 2 -B 2
grep -m6 "string" cov.txt
Ele procura apenas as 6 primeiras linhas para string
Uma extensão da resposta de Joachim Isaksson: Muitas vezes, preciso de algo do meio de um arquivo longo, por exemplo, linhas 5001 a 5020; nesse caso, você pode combinar headcom tail:
head -5020 file.txt | tail -20 | grep x
Isso obtém as primeiras 5020 linhas, depois mostra apenas as últimas 20 e, em seguida, canaliza tudo para grep.
(Editado: erro fencepost nos meus exemplos de números, adicionado pipe ao grep)
grep -A 10 <Padrão>
Isso é para pegar o padrão e as próximas 10 linhas após o padrão. Isso funcionaria bem apenas para um padrão conhecido, se você não tiver um padrão conhecido, use as sugestões "head".
Eu tive um problema semelhante e todo o problema acima não resolve completamente. Também estou interessado em obter o nome do arquivo que contém as linhas correspondentes. Minha solução:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: O padrão no meu caso sempre corresponde à primeira linha.
head:someCmd | head -10