
Ich versuche, mit dem sed
Befehl eine Datei nach allen Einträgen bis 10.000 zu durchsuchen, aber ich glaube, dieser unvollständige sed
Suchstring 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 logfile
wie diese:
$ seq 9900 10050 | sed 's/$/ /' > logfile
Die Datei logfile
sieht 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 sed
Befehl 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 sed
funktioniert, indem Zeilen gefunden werden, die mit einem Ziffernbereich von 0 bis 9 beginnen und zwischen 1 und 4 lang sind. Die Notation to sed
fü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 sed
das Abgleichen von Teilzeichenfolgen in längeren Zahlen.
Das \|10000
entspricht 10000, da es sich im Vergleich zu den restlichen Zeichenfolgen davor um ein etwas einzigartiges Muster handelt. Der nachfolgende Text p
weist darauf hin sed
, dass die Ergebnisse gedruckt werden sollen.
Verwendung von grep als Alternative
Die Verwendung von sed
ist nicht wirklich das richtige Suchwerkzeug. Sie sind wahrscheinlich besser dran, wenn Sie grep
stattdessen 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 \b
kennzeichnet 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 d
löschen Sie sie. Und wenn Sie zur Zeile kommen, beenden 10000
Sie 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.
grep
Aber es wäre , wie slm betont, schneller.
Antwort4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile