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.


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

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

9

Sie können awk direkt verwenden.

awk 'NR==1' file.txt

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.