Saída de um número de linha específico baseado no padrão

0

Eu tenho um arquivo que é 2760 linhas com um id na linha 2740. Nos resultados eu sempre preciso dele para a linha de saída 7 do topo. Existem arquivos que contêm muito mais linhas e alguns que contêm menos, mas a saída é sempre o valor na linha 7.

Estou usando grep 'PATTERN' | sed -n '7p' yyyymmdd*.log , isso parece corresponder ao padrão, mas à linha de saída 7 do primeiro arquivo encontrado no diretório.

Gostaria que alguém me desse um empurrão na direção certa?

    
por Samosa 06.09.2016 / 15:00

3 respostas

0

Eu tentaria

awk '/PATTERN/ { c[FILENAME]++ ; if (c[FILENAME]==7) print ; } ' yyyymmdd*.log

onde

  • o truque c[FILENAME] selecionará a 7ª linha em cada arquivo.
por 06.09.2016 / 15:25
0

Com o GNU sed , isso deve ser possível. Por exemplo, para exibir apenas o número da linha, se incluir o PATTERN do seu arquivo yyyymmdd*.log , tente:

sed -n '2740s/PATTERN/PATTERN/p' yyyymmdd*.log

Isso fará o prefácio do comando search para sed com o número de linha especificado (2740), e -n e p suprimirão a saída, a menos que seja correspondida.

    
por 24.09.2017 / 02:09
0

Você precisa da linha 7 de cada arquivo de entrada correspondente a um determinado padrão de nome de arquivo?

awk 'FNR==7' file*

A awk variable FNR será o número da linha do arquivo de entrada atual. Se for 7, a linha é impressa.

Ou com o GNU sed :

sed -n -s '7p' file*

O% GNU sed option -s fará com que o contador interno de linha seja reiniciado entre os arquivos de entrada (esta é uma extensão GNU para o padrão sed )

Se você precisar filtrar o resultado em alguma expressão regular, basta enviar a saída por meio de grep 'PATTERN' ou, com awk :

awk 'FNR==7 && /PATTERN/' file*

ou, com GNU sed :

sed -n -s '7{/PATTERN/p}' file*

Seu comando:

grep 'PATTERN' | sed -n '7p' yyyymmdd*.log

Algumas questões:

  1. O grep não tem entrada e estará aguardando entrada em seu fluxo de entrada padrão.
  2. O sed só selecionará a sétima linha do conjunto completo de arquivos de entrada (isto é, somente do primeiro arquivo). Seu contador de linha não redefine entre arquivos. Usando o GNU sed com -s , como acima, corrige isso.
  3. As duas partes do pipeline não estão conectadas. sed não lerá de grep .
  4. O grep não é necessário. Você só precisa da linha 7.
por 24.09.2017 / 08:48