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>
-l
opçã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 n
linhas 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..nextfile
processamento 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=1
apenas pesquisará a 1ª linha. Obrigado!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Ou use awk
para um único processo sem |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Em cada linha, se your_regexp
corresponder, 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 ( -n
significa 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; } }' textfile
faz.
awkish
. 2xifs
e 1xelse
em 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 ...
head
produzirá as 10 primeiras linhas (usando a -n
opção) e você poderá canalizar essa saída para grep
.
head
usadas usaram -n 10
(inclusive eu) sem perceber que, head
por 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 file
pode ser canalizada grep
para 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 2
fará 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 head
com 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