Com o comando "cat" do Linux, como mostro apenas certas linhas por número

59

Se eu usar cat -n text.txtpara numerar automaticamente as linhas, como usar o comando para mostrar apenas determinadas linhas numeradas.

Geckono1
fonte
1
O que você quer dizer com "mostrar apenas certas linhas numeradas", pode colocar uma saída esperada?
Tachomi
1
Provavelmente haverá um milhão de maneiras de fazer isso. tail+ headTambém pode fazer isso, como podeawk
Bratchley

Respostas:

120

Usar sed

Uso

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

Para imprimir uma linha (5)

$ sed -n 5p file
Line 5

Para imprimir várias linhas (5 e 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

Para imprimir um intervalo específico (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

Para imprimir o intervalo com outra linha específica (5 - 8 e 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
tachomi
fonte
27

Uma maneira de fazer isso é usando sed:

cat -n text.txt | sed '11d'

onde 11 é o número da linha que você deseja remover.

Ou para remover todos, exceto 11:

cat -n text.txt | sed '11!d'

Também são possíveis intervalos:

cat -n text.txt | sed '9,12!d'

E cat -nnem é necessário:

sed '9,12!d' text.txt
phk
fonte
9

Você pode usar o awk diretamente.

awk 'NR==1' file.txt

substituindo '1' pelo número da linha desejada.

KUBball3
fonte
1
Esta é, em um milhão de milhas, a melhor resposta aqui e merece muito mais amor do que tem.
Wren
8

Dependendo dos objetivos, gosto de head ou grep

cat /var/log/syslog -n | head -n 50 | tail -n 10

retornará as linhas 41 a 50.

ou

cat /var/log/syslog -n | grep " 50" -b10 -a10

mostrará as linhas de 40 a 60. O problema com o método grep é que você precisa usar a conta para preencher os números das linhas (observe o espaço)

Ambos são bastante úteis para analisar arquivos de log.

coteyr
fonte
catPorém, nenhum dos exemplos precisa
roaima
1
bem, sim ... mas .... mas ... ..... Existem maneiras melhores. A pergunta feita sobre o uso de gato, porém, então eu usei.
coteyr
catnão pode fazer o que o OP quer
roaima
2

Como outros lhe mostraram, não há necessidade de usar cat -n. Outros programas farão isso por você. Se, no entanto, você realmente precisar analisar a saída cat -ne mostrar apenas linhas específicas (por exemplo, 4-8, 12 e 42), poderá:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
 4  Line 4
 5  Line 5
 6  Line 6
 7  Line 7
 8  Line 8
12  Line 12
42  Line 42

Em awk, $1é o primeiro campo, portanto, este comando imprime todas as linhas cujos primeiros campos são i) entre 4 e 8 (inclusive) ou ii) 12 ou iii) 42.

Se você também deseja remover o campo adicionado por cat -npara obter as linhas originais do arquivo, você pode:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42
terdon
fonte