Verwenden Sie den Befehl sed, um die Textdatei nach Einträgen 10000 und darunter zu durchsuchen

Verwenden Sie den Befehl sed, um die Textdatei nach Einträgen 10000 und darunter zu durchsuchen

Ich versuche, mit dem sedBefehl eine Datei nach allen Einträgen bis 10.000 zu durchsuchen, aber ich glaube, dieser unvollständige sedSuchstring könnte für Einträge bis 10.000 gelten:

sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile

Antwort1

Sie können dies auch mit der folgenden Methode tun:

$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile

Beispiel

Angenommen, ich hätte eine Beispieldatei logfilewie diese:

$ seq 9900 10050  | sed 's/$/ /' > logfile

Die Datei logfilesieht dann folgendermaßen aus:

$ head -5 logfile 
9900
9901
9902
9903
9904

$ tail -5 logfile 
10046
10047
10048
10049
10050

sed 's/$/ /'Aufgrund der Zeile darüber, die wir beim Erstellen der Beispieldatei eingefügt haben, steht am Ende jeder dieser Zeilen ein Leerzeichen .

Wenn wir jetzt den obigen sedBefehl ausführen:

$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile  | tail -5
9996 
9997 
9998 
9999 
10000 

Wir bekommen alles bis 10.000, mehr nicht.

Wie es funktioniert

Das Obige sedfunktioniert, indem Zeilen gefunden werden, die mit einem Ziffernbereich von 0 bis 9 beginnen und zwischen 1 und 4 lang sind. Die Notation to sedführt "/^[0-9]\{1,4\}[^0-9]diesen Teil aus. Die Notation [^0-9]am Ende besagt, dass Zeichen nicht 0 bis 9 sind. Dies verhindert seddas Abgleichen von Teilzeichenfolgen in längeren Zahlen.

Das \|10000entspricht 10000, da es sich im Vergleich zu den restlichen Zeichenfolgen davor um ein etwas einzigartiges Muster handelt. Der nachfolgende Text pweist darauf hin sed, dass die Ergebnisse gedruckt werden sollen.

Verwendung von grep als Alternative

Die Verwendung von sedist nicht wirklich das richtige Suchwerkzeug. Sie sind wahrscheinlich besser dran, wenn Sie grepstattdessen verwenden.

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900 
9901 
9902 
9903 
9904 

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996 
9997 
9998 
9999 
10000 

Das Obige findet alle Zeilen, die eine Ziffernfolge enthalten, die 10000 oder weniger beträgt. Das \bkennzeichnet einen Rahmen entweder vor oder nach der Zeichenfolge.

Antwort2

Perl kann dies einfacher und lesbarer machen:

perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file

Antwort3

sed '/[0-9]/!d;/10000/q' <log.file

Solange die Einträge in sequenzieller Reihenfolge sind, müssen Sie nur angeben, dass die Zeile eine Nummer enthält, !andernfalls dlöschen Sie sie. Und wenn Sie zur Zeile kommen, beenden 10000Sie sie q. Aber 10000 wird trotzdem gedruckt – es wird die letzte gedruckte Zeile sein.

Das wäre auch viel besser, wenn Sie es verankern könnten – vielleicht am Anfang der Zeile, wie:

sed '/^[0-9]/!d;/^10000/q' <log.file

Das wäre sicherer – und schneller.

grepAber es wäre , wie slm betont, schneller.

Antwort4

sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile

verwandte Informationen