Schwanz mit sed emulieren


8

Ich habe ein Mini-System mit nur einem begrenzten Anzahl von Binärdateien ( bash, cp, cat, sed, ...). Ich habe keinen tailBefehl und frage mich, ob ich die Tail-Funktionalität mit emulieren könntesed

cat foo.txt | tail -n 10

Ich weiß, dass ich mit sed die Zeilen 1-10 drucken kann cat foo.txt | sed -n '1,10p', aber wie würde ich die letzten 10 Zeilen drucken?


2
Es gibt viele nützliche sed-Skripte in einer Befehlszeile, die Sie möglicherweise benötigen: sed one-line
Slyx

Antworten:


15

Sie könnten so etwas tun:

sed -e :a -e '$q;N;11,$D;ba'

sed -e :a -e '$q;N;11,$D;ba' fooum die Frage zu entsprechen.
Slyx

Ich habe keine Ahnung, wie es funktioniert, aber es funktioniert perfekt. Vielen Dank.
Martin Vegter

Könnte jemand diesen wunderbaren Befehl erklären? Ich möchte einen Befehl haben, der den Anfang und das Ende eines Dokuments anzeigt , und ich denke, dieser Befehl könnte helfen, aber ich muss den Hauptteil hinzufügen. Tatsächlich ist der Befehl, nach dem ich gesucht habe, einfach: sed -e '1,11p' -e :a -e '$q;N;11,$D;ba' Aber ich möchte immer noch den Schwanzteil verstehen !!!
Franck

0
tac foo |  sed -n '1,10p' | tac

aber wenn du kein tac hast, kannst du sed nur so verwenden:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'

0

Ist exprmit Ihrem System verfügbar? Anschließend können Sie versuchen, die gewünschte Zeilennummer auszuwerten, nachdem Sie die Gesamtzahl der Zeilen in der Datei gezählt haben.

Ich habe eine Datei tmpmit dem Namen erstellt, die die Zahlen von 1 bis 20 in jeder Zeile enthält.

nlines=$(cat tmp | sed -n '$=')
cat tmp | sed -n $(expr $nlines - 9),"$nlines"p
11
12
13
14
15
16
17
18
19
20

Natürlich können Sie verwenden wc -l, falls verfügbar.

Der Befehl zum Berechnen der Gesamtzahl der Zeilen in der Datei stammt von sed one liners . Ich habe jedoch nicht überprüft, ob es auch mit leeren Dateien funktioniert.

PS Wenn exprnicht verfügbar, können Sie in Bash Zahlen subtrahieren, wie unten gezeigt:

cat tmp | sed -n $((nlines-9)),"$nlines"p
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.