Com o comando “cat” do Linux, como mostro apenas algumas linhas por número

35

Se eu usar cat -n text.txt para numerar automaticamente as linhas, como faço para usar o comando para mostrar apenas certas linhas numeradas.

    
por Geckono1 08.06.2016 / 21:17

5 respostas

72

Use 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
    
por 08.06.2016 / 21:36
19

Uma maneira de fazer isso é usando sed :

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

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

Ou para remover todos, exceto 11:

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

Os intervalos também são possíveis:

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

E cat -n não é necessário:

sed '9,12!d' text.txt
    
por 08.06.2016 / 21:22
4

Dependendo dos objetivos que eu gosto de cabeça ou grep

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

retornará as linhas de 41 a 50.

ou

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

mostrará as linhas 40 a 60. O problema com o método grep é que você tem que usar a conta para preenchimento dos números de linha (observe o espaço)

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

    
por 09.06.2016 / 10:58
2

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

$ 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, então 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 quiser remover o campo adicionado por cat -n para obter as linhas originais do arquivo, faça:

$ 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
    
por 09.06.2016 / 12:31
2

Você pode usar o awk diretamente.

awk 'NR == 1' file.txt

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

    
por 28.12.2017 / 18:33