Con il comando "cat" di Linux, come faccio a mostrare solo alcune righe per numero


59

Se utilizzo cat -n text.txtper numerare automaticamente le righe, come posso utilizzare il comando per mostrare solo determinate righe numerate.


1
Cosa intendi con "mostra solo determinate linee numerate", puoi mettere un risultato atteso?
Tachomi,

1
Probabilmente ci saranno milioni di modi per farlo. tail+ headpuò anche fare questo, come puòawk
Bratchley l'

Risposte:


120

Uso sed

uso

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

Per stampare una riga (5)

$ sed -n 5p file
Line 5

Per stampare più righe (5 e 8)

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

Per stampare un intervallo specifico (5-8)

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

Per stampare l'intervallo con un'altra linea specifica (5 - 8 e 10)

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

27

Un modo per farlo è usando sed:

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

dove 11 è il numero della riga che si desidera rimuovere.

O per rimuovere tutti tranne 11:

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

Gli intervalli sono anche possibili:

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

E cat -nnon è nemmeno necessario:

sed '9,12!d' text.txt

9

Puoi usare awk direttamente.

awk 'NR==1' file.txt

sostituendo '1' con il numero di riga desiderato.


1
Questa è di oltre un milione di miglia la migliore risposta qui e merita molto più amore di quello che ha.
Wren,

8

A seconda degli obiettivi mi piace testa o grep

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

restituirà le righe da 41 a 50.

o

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

mostrerà le righe da 40 a 60. Il problema con il metodo grep è che devi usare l'account per il riempimento dei numeri di riga (nota lo spazio)

Entrambi sono abbastanza utili per l'analisi dei file di registro.


Nessuno dei due esempi ha bisogno catperò
roaima,

1
bene sì ... ma .... ma ... ..... ci sono modi migliori. La domanda è stata posta sull'utilizzo di cat, quindi l'ho usato.
Coteyr,

catnon posso fare quello che vuole l'OP
roaima,

2

Come altri ti hanno mostrato, non è necessario utilizzarlo cat -n. Altri programmi lo faranno per te. Se, tuttavia, hai davvero bisogno di analizzare l'output di cat -ne mostrare solo linee specifiche (ad esempio, 4-8, 12 e 42), puoi fare:

$ 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

In awk, $1è il primo campo, quindi questo comando stampa tutte le righe il cui primo campi sono i) tra 4 e 8 (compreso) o ii) 12 o iii) 42.

Se vuoi anche rimuovere il campo aggiunto da cat -nper ottenere le righe originali dal file, puoi fare:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.