Wie zeige ich mit dem Linux-Befehl „cat“ nur bestimmte Zeilen nach Nummer an?

59

Wenn ich cat -n text.txtdie Zeilen automatisch nummeriere, wie verwende ich dann den Befehl, um nur bestimmte nummerierte Zeilen anzuzeigen.

Geckono1
quelle
1
Was meinst du mit "zeige nur bestimmte nummerierte Zeilen", kannst du eine erwartete Ausgabe machen?
Tachomi
1
Es wird wahrscheinlich eine Million Möglichkeiten geben, dies zu tun. tail+ headkann dies auch tun, wie kannawk
Bratchley

Antworten:

120

Verwenden sed

Verwendungszweck

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

Eine Zeile drucken (5)

$ sed -n 5p file
Line 5

So drucken Sie mehrere Zeilen (5 und 8)

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

So drucken Sie einen bestimmten Bereich (5 - 8)

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

So drucken Sie den Bereich mit einer anderen bestimmten Zeile (5 - 8 & 10)

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

Eine Möglichkeit ist die Verwendung von sed:

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

Dabei ist 11 die Nummer der zu entfernenden Zeile.

Oder entfernen Sie alle bis auf 11:

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

Bereiche sind auch möglich:

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

Und cat -nwird nicht einmal benötigt:

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

Sie können awk direkt verwenden.

awk 'NR==1' file.txt

Ersetzen Sie '1' durch die gewünschte Zeilennummer.

KUBball3
quelle
1
Dies ist mit einer Million Meilen die beste Antwort hier und verdient viel mehr Liebe als es hat.
Wren
8

Je nach Ziel mag ich Kopf oder Grep

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

Gibt die Zeilen 41 bis 50 zurück.

oder

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

zeigt die Zeilen 40 bis 60 an. Das Problem bei der grep-Methode ist, dass Sie das Konto zum Auffüllen der Zeilennummern verwenden müssen (beachten Sie das Leerzeichen)

Beide sind sehr praktisch zum Parsen von Protokolldateien.

coteyr
quelle
Kein Beispiel benötigt catjedoch
Roaima
1
na ja ... aber ... aber ... Es gibt bessere Wege. Die Frage nach der Verwendung von Katze, also habe ich sie verwendet.
Coteyr
catkann nicht tun, was die OP will
Roaima
2

Wie andere Ihnen gezeigt haben, besteht keine Notwendigkeit zu verwenden cat -n. Andere Programme erledigen das für Sie. Wenn Sie jedoch die Ausgabe wirklich analysieren cat -nund nur bestimmte Zeilen anzeigen müssen (z. B. 4-8, 12 und 42), können Sie Folgendes tun:

$ 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, $1ist das erste Feld, so dass dieser Befehl alle Zeilen ausgibt, deren erste Felder i) zwischen 4 und 8 (einschließlich) oder ii) 12 oder iii) 42 sind.

Wenn Sie auch das Feld entfernen möchten, das hinzugefügt wurde cat -n, um die ursprünglichen Zeilen aus der Datei zu erhalten, können Sie Folgendes tun:

$ 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
quelle