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?

Martin Vegter
quelle
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'
Chris Down
quelle
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'
Slyx
quelle
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
Barun
quelle