* David Haller schrieb am 17.Jan.2003:
On Fri, 17 Jan 2003, Bernd Brodesser wrote:
* David Haller schrieb am 17.Jan.2003:
$ rpm -qa \ --queryformat="%{installtime} %{installtime:date} \t%{name}-%{version}\n" \ | sort -n | cut -d' ' -f2- | sed -n '1{p;n;p;};${x;p;x;p;};h'
Exakt :) Grad find ich noch ne einfachere Variante (ich hab's nach dem cut in ne Datei umgeleitet): sed -n '1{p;n;p;};${x;G;p;};h' < /tmp/rpmlist
Nun gut, viel einfacher auch nicht. ;)
Hier haben wir die vorletzte Zeile im hold-space, dann vertauschen wir (wg. der Reihenfolge), haengen die letzte Zeile (die nun im hold-space ist) an die vorletzte im pattern-space an und geben beide aus ;)
Kann es sein, daß bei Linux ein *einfacher* Filter fehlt, mit dem man bestimmte Zeilen ausgeben kann?
Ja. Aber s.u. :)
Also etwa die ersten drei Zeilen und die letzten drei,
$ sed -n '1{N;N;p;};${x;G;p;};N;h;' /tmp/rpmlist Mon 16 Aug 1999 07:19:26 PM CEST bc-1.04 Mon 16 Aug 1999 07:19:30 PM CEST tcsh-6.08.05 Mon 16 Aug 1999 08:27:13 PM CEST aaa_dir-99.7.12 Fri 29 Nov 2002 12:30:18 PM CET util-linux-2.11u Fri 06 Dec 2002 12:47:46 PM CET MPlayer-0.90pre6 Thu 12 Dec 2002 01:09:28 AM CET kbd-1.06
*Uffa* ;)
Aber 4-zeilig bekomm ich's nimmer hin. Das naheliegende sed -n '1{N;N;N;p;};${x;G;p;};N;N;h;' /tmp/rpmlist funktioniert nicht.
Nee, leider nicht, auch Dein Teil mit drei Zeilen funktioniert nicht. Jedenfalls nicht mit jeder Anzahl von Zeilen. Mit der richtigen Anzahl funktioniert auch das mit vier Zeilen. Aber die Anzahl der Zeilen der Eingabe muß stimmen. Variier doch einfach mal die Zeilenzahl von /tmp/rpmlist, dann wirst Du es merken. Oder einfach bei der 1 ein paar N hinzu, oder weg, tut es auch. Mit dem N wird eine neue Zeile am Arbeitsspeicher angehängt. Diese Zeile durchläuft aber nicht mehr das sed. Wenn es die letzte ist, wird auch $ nicht erkannt.
Aber eigentlich kann man ja sowas per 'head -N datei; tail -N datei' machen...
,----[ ~/bin/headntail ] | #!/bin/sh | exec 3>/dev/stdout
Zwei Ausgabeströme reichen Dir nicht. Na gut.
| test -n "$IN" && unset IN
Hä? Ein einfachs unset IN macht das Gleiche, oder nicht?
| case "$#" in | 0) N="-10"; IN="/dev/stdin";; | 1) case "$1" in | -*) N="$1"; IN="/dev/stdin";; | *) N="-10";; | esac;; | *) case "$1" in | -*) N="$1"; shift;; | *) N="-10";; | esac;; | esac | test -n "$IN" && set -- "$IN" | for f in "$@"; do | ( cat "$f" | tee /dev/stderr | head $N 1>&3 ) 2>&1 | tail $N | done `----
Nun ja. aber doch nicht das, was man einem unbedarften Anwender zumuten sollte. Als fertiges Programm für diesen Anwender hingegen ist es etwas zu unflexibel. Bernd -- Bitte die Etikette beachten: http://www.suse-etikette.de.vu/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4