[gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

[gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 11.08.2013 12:25:00

Hi,

ich möchte mir in einer Übersicht der zuletzt installierten Pakete ausgeben lassen.

Hierfür mache ich folgendes:
cat /var/log/apt/history.log | grep "apt-get install" | awk '{print $4}'
Ergebnis ist in etwa sowas hier.
hdparm
sysstat
acpitool
apmd
pm-utils
biabam
deborphan
ntp
backup-manager
screen-profiles
putty
Es wäre natürlich schöner, diese Spalte in einer Zeile durch Kommas getrennt auszugeben.
Ist das möglich?
Oder ist der Ansatz ganz falsch, wie macht ihr das?
Zuletzt geändert von Rubberduck am 14.08.2013 11:13:56, insgesamt 1-mal geändert.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Cae » 11.08.2013 13:59:15

Du solltest nicht auf apt-get install greppen, weil apt-get -o irgendwas install darauf nicht macht. Es gibt doch extra die Install:-Zeile, warum sollte man sie nicht nehmen? Uebrigens ist cat file | grep unnoetige Tipparbeit und ein stilistischer Alptraum, besser ist grep file.

Code: Alles auswählen

$ grep '^Install' /var/log/apt/history.log | tr ' ' '\n' | egrep -v '^Install|\(|\)' | tr '\n' ' '; echo
$ awk '/^Install/{for(i=2;i<=NF;i++){if($i!~/\(|\)/)printf(s++?" ":"")"%s",$i}}END{print""}' /var/log/apt/history.log
Einmal mit klassischen coreutils-Mitteln und einmal in reinem awk. Falls gewuenscht, kann man den Architektur-Suffix wie :amd64 auch noch wegschneiden.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 11.08.2013 15:51:53

Hi,

also auch wenn deine Lösung die technisch bessere ist, das Ergebnis sieht so aus.

Code: Alles auswählen

locales:armel mdadm:armel busybox:armel libklibc:armel klibc-utils:armel initramfs-tools:armel linux-image-kirkwood:armel linux-base:armel libuuid-perl:armel linux-image-3.2.0-4-kirkwood:armel libpci3:armel pciutils:armel libusb-1.0-0:armel usbutils:armel libkeyutils1:armel libedit2:armel libkrb5-3:armel libkrb5support0:armel libwrap0:armel libbsd0:armel libk5crypto3:armel openssh-client:armel nfs-kern
usw. usw. usw
Ich möchte aber nicht alle Pakete sehen, sondern mir reicht die Ausgabe von oben, so wie ich sie vorgeschlagen hatte.

Ist es möglich die Ausgabe der Spalten, Komma getrennt in eine Zeile zu schreiben?

PS: Den Unsinn mit grep muss ich mir unbedingt merken.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Cae » 11.08.2013 16:15:22

Also das mit der Kommata-Trennung laesst sich zumindest bei der awk-Zeile einfach erreichen, dazu einfach das s++?" " durch s++?", " ersetzen.

Wie mir gerade auffaellt, sind die ganzen depends von der Install:-Zeile beim manuellen Aufruf ja nicht dabei, also unterscheidet sich das schon (entgegen meiner Annahme oben). Also nochmal, mit Kommata:

Code: Alles auswählen

$ awk '/^Commandline: apt-get install/{for(i=4;i<=NF;i++){if($i!~/\(|\)/)printf(s++?", ":"")"%s",$i}}END{print""}' /var/log/apt/history.log
(man beachte den erhoeten Initalwert von i, damit apt-get install ebenfalls herausgefiltert wird)

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 11.08.2013 17:37:01

ok, mit deiner Hilfe habe ich mir folgendes Konstrukt gebaut.

Code: Alles auswählen

awk '/^Commandline: apt-get install/{for(i=4;i<=NF;i++){if($i!~/\(|\)/)printf(s++?", ":"")"%s",$i}}END{print""}' /var/log/apt/history.log | sed 's/, /|/g;s/--reinstall|//g'
Das Ergebnis sieht so aus.
sudo|screen|rsync|htop|curl|anacron|cron|hdparm|sysstat|acpitool|apmd|pm-utils|biabam|deborphan|ntp|ntpdate|backup-manager|screen-profiles|putty
Das ist schon mal gut, aber ich merke dass ich insgesamt auf einem Holzweg bin, denn ich möchte ja eigentlich nur wissen, welche der Pakete, die ich in letzter Zeit installiert habe, auch noch wirklich installiert sind ( eventuell optional auch nur die letzten 5).
Denn backup-manager und curl Bspw. hab ich lange schon wieder runter geschmissen.
Vielleicht noch eine Idee, wie man das hinbekommen könnte?
Ansonsten ist es soweit schon gut, danke vorab.
Rubberduck

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von linuxCowboy » 11.08.2013 23:33:34

Rubberduck hat geschrieben: ... ich möchte ja eigentlich nur wissen, welche der Pakete, die ich in letzter Zeit installiert habe, auch noch wirklich installiert sind.
z.B.:

Code: Alles auswählen

PAKETLIST=`echo woher auch immer`

j=; for i in $PAKETLIST; do j="$j '?exact-name($i)'"; done

eval $(echo aptitude search $j) | sort
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 12.08.2013 14:23:39

;=) klasse, ich glaub ich erklär mal etwas mehr.

Das sehe ich, wenn ich mich per shh an meiner Maschine anmelde.Anmeldung per ssh
Unterhalb von Groups möchte ich noch eine Auflistung der zuletzt installierten (aber noch vorhandenen) Pakte haben.
Habe es gerade noch im Screenshot editiert.
Installed: | ssh | Putty | Curl | usw..
Vielleicht wird das jetzt was klarer.

Wenn ich das so richtig sehe, vergleicht dein Skript, linuxCowboy, nur eine vorhandene Paketliste, ich möchte aber wie oben schon gesagt, die zuletzt installierten sehen..

Trotzdem danke.
Rubberduck

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von uname » 12.08.2013 15:41:11

Also wenn die Ausgabe von

Code: Alles auswählen

cat /var/log/apt/history.log | grep "apt-get install" | awk '{print $4}'
dir gefallen hat (ob nun immer korrekt oder nicht) dann kannst du einfach die Newlines in getrennte Werte ändern:

Code: Alles auswählen

cat /var/log/apt/history.log | grep "apt-get install" | awk '{print $4}' |tr '\n' ' '
Stand zwar weiter oben auch irgendwie aber doch irgendwie anders.

Wurde zwar letztens erst gepostet aber passt hier ganz gut zu deinem Befehl. Eigentlich braucht man nämlich gar kein "cat".
http://www.socallinuxexpo.org/scale5x/p ... aumann.pdf (ab Seite 20)

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 12.08.2013 17:25:28

Fast Perfekt und vielen Dank.

Aus deiner Angabe und aus "Useless use of grep" ;=) habe ich dann folgendes gebaut.

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log |tr '\n' ' ' | sed 's/ /|/g'
Ergebnis ist doch fast schön...
sudo|screen|rsync|htop|curl|anacron|--reinstall|hdparm|sysstat|acpitool|apmd|pm-utils|biabam|deborphan|ntp|backup-manager|screen-profiles|putty|

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von linuxCowboy » 12.08.2013 18:48:55

Die Paketliste hast du doch selbst in deinem Eingangspost vorgegeben, und aus der history.log extrahiert!

Damit läuft es auf ein einfaches tr '\n' '|' hinaus.

Als eigentliche Übung sah ich an, herauszufinden, welche von den "apt-get install"s wirklich noch installiert sind!??

@uname: useless use of cat

Seite 25! Cat on Ice! :mrgreen:

Alf würde es lieben...
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 12.08.2013 20:23:29

hm..hab nichts geschrieben von einer Paketliste. Steh ich auf dem Schlauch?

Das mit der Übung und dem Vergleich ist ja ok, ich muss es nur auch ausgeben.
Weißt du, ich möchte einfach sehen können, welche Paket ich so in der letzten Zeit installiert habe.

Der tr ist für einfache Arbeiten scheinbar auch ok.
Muss ich mir noch genauer ansehen.
Besten Dank euch.

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Meillo » 22.08.2013 12:25:14

Rubberduck hat geschrieben:Fast Perfekt und vielen Dank.
Inzwischen zwar reichlich nachtraeglich will ich doch auch noch etwas ergaenzen: Wenn man die Inhalte von mehreren Zeilen auf einer zusammenfuegen will, dann kann man auch einfach durch xargs(1) pipen:

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log | xargs
Im Vergleich zu der tr(1)-Variante hat das den Vorteil, dass der Abschliessende Zeilenumbruch erhalten bleibt, man also weder ein echo(1) anfuegen noch den letzten Trenner entfernen muss. So ist das naemlich nicht ganz korrekt:

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log |tr '\n' ' ' | sed 's/ /|/g'
Wenn man es genau nimmt will man:

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log |tr '\n' ' ' | sed 's/ /|/g;s/|$//'; echo
Und btw: Statt |tr '\n' ' ' | sed 's/ /|/g' doch besser gleich nur |tr '\n' '|'. Das kann man dann natuerlich auch an das xargs anhaengen, wenn man Pipes ``trennender'' findet als Leerzeichen.
Use ed once in a while!

Benutzeravatar
Rubberduck
Beiträge: 177
Registriert: 14.07.2013 21:48:19
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Langenfeld Rheinland

Re: [gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Rubberduck » 22.08.2013 13:19:25

ahh..sehr gute Info.

Vielen Dank!

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: [gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von uname » 22.08.2013 14:36:28

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log | xargs
Reicht es nicht so:

Code: Alles auswählen

awk '/apt-get install/{print $4}' /var/log/apt/history.log | xargs
Anmerkung zu xargs vs. tr:
Nun nutze ich schon seit Jahren "xargs" z.B. in Verbindung mit "find" usw. Aber dass man es eigentlich auch ohne irgendwelche weiteren Optionen nutzen kann um so triviale Probleme zu lösen hatte ich vorher gar nicht gemerkt. Danke dafür.

Sag mal wie kann ich denn als Trennzeichen (delimiter) ein Komma setzen. Geht irgendwie nicht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von Meillo » 22.08.2013 15:14:23

uname hat geschrieben:

Code: Alles auswählen

awk '/apt-get install/{print $4}' < /var/log/apt/history.log | xargs
Reicht es nicht so:

Code: Alles auswählen

awk '/apt-get install/{print $4}' /var/log/apt/history.log | xargs
Ja. Da besteht kein (relevanter) Unterschied.
Sag mal wie kann ich denn als Trennzeichen (delimiter) ein Komma setzen. Geht irgendwie nicht.
So zum Beispiel:

Code: Alles auswählen

awk '/apt-get install/{print $4}' /var/log/apt/history.log | xargs | tr ' ' ,
Oder:

Code: Alles auswählen

awk '/apt-get install/{print $4}' /var/log/apt/history.log | xargs | sed 's/ /,&/g'
Oder was meinst du?

(Man muss bedenken, dass das nur klappt wenn in den Zeilen keine Leerzeichen enthalten sind -- das ist hier der Fall -- sonst ist die tr(1)-Variante zu empfehlen.)
Use ed once in a while!

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: [gelöst]Spalten nach Zeilen sortieren, Komma getrennt

Beitrag von uname » 22.08.2013 15:16:29

Ich hatte gedacht ich könnte die xargs-Option

Code: Alles auswählen

       --delimiter=delim
       -d delim
wählen. Habe ich wohl falsch verstanden, da es wohl für die Eingangs- und nicht die Ausgangswerte gilt.

Antworten