Você também pode canalizar um fluxo arbitrário head:someCmd | head -10
Stuart Nelson
1
Cabeça padrões para imprimir as primeiras 10 linhas de saída padrão, de modo que este é válido para 10 linhashead log.txt | grep <whatever>
Zlemini
5
Existe uma maneira de fazer isso ao usar a -lopção grep ? Eu gostaria de listar todos os arquivos com os 5 primeiros caracteres RIFFD.
James M. Lay
49
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
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
Eu fui uma dessas pessoas que encontrou isso no Google. Obrigado!
Floris
para mim, esse código imprimiu o caminho completo do arquivo. O que é exatamente o que eu precisava. Também FNR=1apenas pesquisará a 1ª linha. Obrigado!
Brian W
2
Para fazer isso recursivamente em um diretório:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog 7/19/19
1
Obrigado @OrangeDog. Uma ligeira correção: deveria ser #-type f
David Siegal
26
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.
1
@potong você está certo, corrigido. @srikanthradix, embora possa ser mais rápido, sua solução não está procurando regexps, mas apenas cadeias de caracteres fixas. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilefaz.
Zsolt Botykai
4
Além disso, o estilo não é awkish. 2xifse 1xelseem um comando que não precisa de nenhuma declaração de ação faria aho. weinberger e kernighan cry ...
jaypal singh
1
Eu acho que, em vez de NR, seria melhor usar o FNR, porque se você usar o awk com vários arquivos, o FNR inicia a partir de 0 para cada arquivo.
Vladyslav Savchenko 04/10
9
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.
Não, isso fornecerá as 6 primeiras ocorrências de "string" em todo o arquivo cov.txt
franzisk
2
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)
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".
Embora possa estar certo. adicione mais descrição da pergunta para tornar a resposta mais abrangente.
Pramod S. Nikam
3
Isso responde a uma pergunta completamente diferente e não é útil nesse contexto.
Pre101
-1
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:
head
:someCmd | head -10
head log.txt | grep <whatever>
-l
opção grep ? Eu gostaria de listar todos os arquivos com os 5 primeiros caracteresRIFFD
.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 useiPara 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, usefonte
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|
: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
: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.fonte
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
e1xelse
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 é usarhead
:head
produzirá as 10 primeiras linhas (usando a-n
opção) e você poderá canalizar essa saída paragrep
.fonte
head
usadas usaram-n 10
(inclusive eu) sem perceber que,head
por padrão, exibe apenas 10 linhas . :)fonte
Você pode usar a seguinte linha:
fonte
A saída de
head -10 file
pode ser canalizadagrep
para fazer isso:Usando Perl:
fonte
-A 2
: imprime duas linhas antes do padrão.-B 2
: imprime duas linhas após o padrão.fonte
-C 2
fará o mesmo que-A 2 -B 2
Ele procura apenas as 6 primeiras linhas para
string
fonte
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
comtail
: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)
fonte
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".
fonte
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:
NB: O padrão no meu caso sempre corresponde à primeira linha.
fonte