Siduction Forum > Scripting & Kernelhacking

[DE] ein kniffliges sed Problem

(1/2) > >>

bluelupo:
Hallo Community,

ich möchte für folgenden grep-Einzeiler ein entsprechendes sed Konstrukt finden um drei Zeilen aus der /var/apt/log/history.log zu extrahieren. Ich suche "Install" am Anfang der Zeile und möchte noch zusätzlich die zwei direkt darüber. Mit egrep funktioniert das soweit.


--- Code: ---$ egrep -B2 ^'(Install)':.*linux-image-4.8.0-58 /var/log/apt/history.log
Start-Date: 2017-06-29  22:38:33
Commandline: apt-get dist-upgrade
Install: linux-headers-4.8.0-58:amd64 (4.8.0-58.63~16.04.1, automatic), linux-image-4.8.0-58-generic:amd64 (4.8.0-58.63~16.04.1, automatic),.....

--- End code ---

Mit sed komme ich nicht weiter. Wie bringe ich den sed dazu mir die zwei Zeilen oberhalb des Treffers auch noch auszugeben (wie beim obigen grep Kommando).


--- Code: ---$ sed -n '/Install:.*linux-image-4.8.0-58/p' /var/log/apt/history.log
Install: linux-headers-4.8.0-58:amd64 (4.8.0-58.63~16.04.1, automatic), linux-image-4.8.0-58-generic:amd64 ....

--- End code ---


EDIT: bin jetzt etwas weitergekommen mit dem sed. Die Zeile vor "Install:" bekomme ich mit folgenden sed Kommando. Jetzt fehlt nur noch die Zeile die mit "Start-Date:" beginnt.


--- Code: ---$ sed '/^Install:.*linux-image-4.8.0-58/!{h;d};/^Install:.*linux-image-4.8.0-58/{x;G;}' </var/log/apt/history.log
Commandline: apt-get dist-upgrade
Install: linux-headers-4.8.0-58:amd64 (4.8.0-58.63~16.04.1, automatic), linux-image-4.8.0-58-generic:amd64 ....

--- End code ---

unklarer:
Ich kann dir nicht wirklich helfen.   :-\
Vielleicht hilft dir aber dieser Link, den ich mal abgespeichert hatte...

musca:
Hallo bluelupo,
sed '/^Start/h;/^Command/H;/^Install/{H;x};/Install/!d' </var/log/apt/history.log

# /^Start/h;   speichert den pattern space im hold space, falls das Pattern mit "Start" beginnt.
# /^Command/H   fügt den pattern space an den hold space an, falls das Pattern mit "Command" beginnt.
# /^Inst/{H;x};   fügt den pattern space an den hold space an und ersetzt den pattern space durch den holdspace, falls das Pattern mit Install" beginnt.
# /Install/!{d}   löscht den pattern space, falls das Pattern nicht "Install" enthält.

cheers
musca

Geier0815:
Wenn Du schon weißt das dein erster Treffer "Start-Date:" am Anfang hat und deine Suche mit "Install" beendet wird und Du auch die Zeilen dazwischen brauchst, dann probier mal:

--- Code: --- sed -n '/^Start-Date:/,/^Install/ p' < /var/log/apt/history.log
--- End code ---

Ich weiß aber nicht genau wie gierig der Regex dann ausgewertet wird. Im schlimmsten Fall wird dir alles zwischen dem ersten "Start-Date" und dem letzten "Install" ausgegeben, sieht für mich beim kurzen Testen aber nicht so aus. Schau mal ob's dir taugt.
Ansonsten ist hier der Link zum ausführlichsten sed-Tutorial das ich kenne.

bluelupo:
Hi musca,
erstmal Danke für deine Hilfe zum sed. Dein Einzeiler liefert alle Zeilen aus der history.log die am Anfang der Zeile Start|Command|Install stehen haben sowie ich das verstehe. Mich würden aber nur die Zeilen (Start|Command|Install) interessieren wo in der "Install-Zeile" auch das Paket linux-image-* vorkommt. Mit anderen Worten ich möchte den Installationszeitpunkt eines Kernels ermitteln.


--- Code: ---sed '/^Start/h;/^Command/H;/^Install/{H;x};/Install/!d' </var/log/apt/history.log

--- End code ---


EDIT1:
OK, bin schon weitergekommen mit einer bestimmten Kernelversion.


--- Code: ---$ sed '/^Start/h;/^Command/H;/^Install.*linux-image-4.10.0-27/{H;x};/Install.*linux-image-4.10.0-27/!d' </var/log/apt/history.log

Start-Date: 2017-07-23  16:39:34
Commandline: apt-get dist-upgrade
Install: linux-headers-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2, automatic), linux-image-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2, automatic), linux-headers-4.10.0-27:amd64 (4.10.0-27.30~16.04.2, automatic), linux-image-extra-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2, automatic)

--- End code ---

Wenn ich nun noch zum Installationszeitpunkt den Deinstallationszeitpunkt in einem Aufruf bekommen würde wäre dies optimal. Getrennt bekomme ich es schon hin.


--- Code: ---$ sed '/^Start/h;/^Command/H;/^Purge.*linux-image-4.10.0-27/{H;x};/Purge.*linux-image-4.10.0-27/!d' </var/log/apt/history.log

Start-Date: 2017-09-01  21:44:25
Commandline: apt-get remove --purge --yes linux-headers-4.10.0-27-generic linux-image-4.10.0-27-generic linux-image-extra-4.10.0-27-generic
Purge: linux-headers-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2), linux-image-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2), linux-image-extra-4.10.0-27-generic:amd64 (4.10.0-27.30~16.04.2)

--- End code ---

EDIT2: Geier0815, die sed-Zeile von dir ist ziemlich gierig ;-) Aber trotzdem Danke für den Tipp!

Navigation

[0] Message Index

[#] Next page

Go to full version
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks WYSIWYG Editor