alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 23.11.2008 15:58:25

Hallo,

ich möchte alle Zeilen ausgeben, die nach folgenden regulären Ausdruck "Results of DB-Import finished at " kommen.

Bei USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) habe ich folgendes gefunden

Code: Alles auswählen

sed -n '/regexp/{n;p;}'
, es wird jedoch nur die Zeile danach ausgegeben.

Kann mir jemand sagen, wie man den Ausdruck ändern muss, dass sed alle Zeilen danach zurückgibt oder eine Alternative nennen?

mfg
Twilo

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von roli » 23.11.2008 18:41:40

Hi,

spontan faellt mir keine sed Loesung ein. Wenn du darauf nicht festgelegt bist, waere awk oder Perl einfacher.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 23.11.2008 18:56:35

MIt awk könnte es so gehen:

Code: Alles auswählen

root@laptop:/tmp# cat test.tmp 
ZeileEins
zwei

vier
fuenf
sechs
-o username=$NAMEaksdjfaksdjfaksdjfaksdjf
kasdjflkj
kasdjflkj
Results of DB-Import finished at
kasdjflkj
kasdjflkj
aksdjf
root@laptop:/tmp# awk '/^Result/,/^$/' test.tmp 
Results of DB-Import finished at
kasdjflkj
kasdjflkj
aksdjf
Oh, yeah!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 23.11.2008 19:03:26

Hallo,
roli hat geschrieben:Wenn du darauf nicht festgelegt bist, waere awk oder Perl einfacher.
ob es nun in sed, awk oder perl realisiert wird, ist relativ egal.

Diese Funktionalität brauche ich in ein Bash-Shellskript.

es soll z.B. ab folgender Zeile "Results of DB-Import finished at 2008-11-20 11:54:19" alles ausgegeben werden.

mfg
Twilo

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 23.11.2008 19:05:03

Hallo,
Duff hat geschrieben:MIt awk könnte es so gehen:

Code: Alles auswählen

root@laptop:/tmp# cat test.tmp 
ZeileEins
zwei

vier
fuenf
sechs
-o username=$NAMEaksdjfaksdjfaksdjfaksdjf
kasdjflkj
kasdjflkj
Results of DB-Import finished at
kasdjflkj
kasdjflkj
aksdjf
root@laptop:/tmp# awk '/^Result/,/^$/' test.tmp 
Results of DB-Import finished at
kasdjflkj
kasdjflkj
aksdjf
super, funktioniert! :)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von roli » 23.11.2008 19:20:57

Hi,
Twilo hat geschrieben:ob es nun in sed, awk oder perl realisiert wird, ist relativ egal.
da du so explizit nach sed gefragt hattest war mir das nicht so klar.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 23.11.2008 20:05:00

Code: Alles auswählen

root@laptop:/tmp# cat test.tmp |sed -ne '/^Results/,/^$/p'
Results of DB-Import finished at
kasdjflkj
kasdjflkj
aksdjf
Oh, yeah!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 23.11.2008 20:19:16

Hallo,

die sed Variante ist bei einer 21MB Datei schneller

sed:
real 0m0.190s
user 0m0.128s
sys 0m0.059s

awk:
real 0m0.722s
user 0m0.584s
sys 0m0.096s

mfg
Twilo

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 23.11.2008 23:15:24

Twilo hat geschrieben:
Duff hat geschrieben:MIt awk könnte es so gehen:

Code: Alles auswählen

awk '/^Result/,/^$/' test.tmp
super, funktioniert! :)
Es ist aber nur scheinbar korrekt, denn wenn im folgenden Text eine Leerzeile auftaucht, hört die Ausgabe auf.
Korrekt ist

Code: Alles auswählen

awk '/^Result/,0' test.tmp

Eine Variante mit sed wäre:

Code: Alles auswählen

tac test.tmp | sed ' /^Result/q; ' | tac 
Aber dann hat's mich doch gefuchst und ich wollte eine reine sed-Version erzeugen ;-)
Hier das Ergebnis:

Code: Alles auswählen

<test.tmp  sed -n 's/^Result//; t rest ; b ; :rest ; n; p ; b rest ; d'
Zwar nicht ganz trivial, aber dafür sogar ganz korrekt, weil die "Result ..." Zeile auch weg ist, wie ja eigentlich gefordert.
Das müsste man bei den anderen Varianten ja auch noch einbauen, oder ein `sed 1d' anhängen.


Ich hatte viel Spaß beim Knobeln, hoffe es hilft auch weiter. :-)
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 24.11.2008 10:07:23

Code: Alles auswählen

cat test.tmp |sed -n '/^messagebus/,$p'
Sollte auch funktionieren. Ist ein wenig einfacher...
Oh, yeah!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 24.11.2008 13:11:34

Hallo,

die Zeiten sind von ein FreeBSD 6.2 System gemessen

Code: Alles auswählen

awk '/^Result/,0' test.tmp
real 0m1.168s
user 0m0.706s
sys 0m0.047s

Code: Alles auswählen

tac test.tmp | sed ' /^Result/q; ' | tac 
für FreeBSD 6.2 musste ich das "tac" durch "tail -r" ersetzen
real 0m0.019s
user 0m0.000s
sys 0m0.010s

Code: Alles auswählen

<test.tmp  sed -n 's/^Result//; t rest ; b ; :rest ; n; p ; b rest ; d'
sed: 1: "s/^Result//; t rest ; b ...": undefined label 'rest ; b ; :rest ; n; p ; b rest ; d'
nur auf mein Debian lauffähig, daher die Zeitmessung auf ein Debiansystem
real 0m1.270s
user 0m1.240s
sys 0m0.000s

Code: Alles auswählen

sed -n '/^Result/,$p' test.tmp
real 0m0.241s
user 0m0.183s
sys 0m0.047s
Meillo hat geschrieben:Zwar nicht ganz trivial, aber dafür sogar ganz korrekt, weil die "Result ..." Zeile auch weg ist, wie ja eigentlich gefordert.
Das müsste man bei den anderen Varianten ja auch noch einbauen, oder ein `sed 1d' anhängen.
die Zeile muss nicht unbedingt mit ausgegeben werden - schöner ist es jedoch wenn sie vorhanden ist.

die Variante mit tac bzw. tail -r ist vond er Perfomance her die beste :-)

mfg
Twilo

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 24.11.2008 16:03:24

Duff hat geschrieben:

Code: Alles auswählen

cat test.tmp |sed -n '/^messagebus/,$p'
Sollte auch funktionieren. Ist ein wenig einfacher...
Ohh Mann, ich war echt blind!!

Allerdings muss ich zu meiner ``Verteidigung'' bemerken, dass ich die Adressierung `/^Result/,$' in AWK versucht hatte, die dort aber nicht funktioniert.
... aber dass ich auf diese Lösung nicht gekommen bin *kopfschüttel* ... muss wohl die Nachtzeit gewesen sein.
Use ed once in a while!

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 24.11.2008 16:14:10

Twilo hat geschrieben:die Zeiten sind von ein FreeBSD 6.2 System gemessen
Für aussagekräftige Zeitmessungen sollte man das System jedes Mal neu booten und das Programm dann oft am Stück durchlaufen lassen (100x oder so). Dann bekommt man vergleichbare Werte. Sonst zeigen sie nur ungefähre Größenordnungen auf, wenn überhaupt.

Code: Alles auswählen

<test.tmp  sed -n 's/^Result//; t rest ; b ; :rest ; n; p ; b rest ; d'
sed: 1: "s/^Result//; t rest ; b ...": undefined label 'rest ; b ; :rest ; n; p ; b rest ; d'
Das Problem ist, dass Labels eigentlich bis zum Zeilenende gehen und sie deshalb in Einzeilern schlecht nutzbar sind.
Aber du kannst mal versuchen das Leerzeichen nach `:rest' zu entfernen, also den Strichpunkt direkt anschließen lassen, ob das hilft.
nur auf mein Debian lauffähig, daher die Zeitmessung auf ein Debiansystem
Das ist dann natürlich überhaupt nicht mehr vergleichbar. Wenn dann musst du alle Messungen (auch) auf dem Debian-System machen.

Meillo hat geschrieben:Zwar nicht ganz trivial, aber dafür sogar ganz korrekt, weil die "Result ..." Zeile auch weg ist, wie ja eigentlich gefordert.
Das müsste man bei den anderen Varianten ja auch noch einbauen, oder ein `sed 1d' anhängen.
die Zeile muss nicht unbedingt mit ausgegeben werden - schöner ist es jedoch wenn sie vorhanden ist.
Nur weil du es so in deinem ersten Post geschrieben hattest. Du hattest wohl nicht das geschrieben was du meintest. ;-)

die Variante mit tac bzw. tail -r ist vond er Perfomance her die beste :-)
Vermutung: Dies wird sich ändern, wenn du _große_ Datenmengen verwendest, denn `tac' (bzw. `tail -r') kann erst anfangen zu arbeiten, wenn _alle_ Zeilen eingelesen wurden. Es müssen also 2x alle Daten zwischengepuffert werden.



Ich empfehle

Code: Alles auswählen

<test.tmp sed -n '/^Result/,$p'
Das ist die IMHO simpelste und klarste Variante.
@Duff: Dieses `cat test.tmp |' kannst du dir sparen in dem du stdin umleitest. Das spart einen Prozess, ist nicht weniger lesbar und 1:1 anwendbar.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 24.11.2008 16:35:37

Meillo hat geschrieben: @Duff: Dieses `cat test.tmp |' kannst du dir sparen in dem du stdin umleitest. Das spart einen Prozess, ist nicht weniger lesbar und 1:1 anwendbar.
Da hast du natürlich vollkommen Recht. Man könnte es auch so schreiben (sed -n '/^Result/,$p' file).
Oh, yeah!

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 24.11.2008 19:06:07

Duff hat geschrieben:Man könnte es auch so schreiben (sed -n '/^Result/,$p' file).
Ja.
Use ed once in a while!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 24.11.2008 22:25:09

Hallo,
Meillo hat geschrieben:
Twilo hat geschrieben:die Zeiten sind von ein FreeBSD 6.2 System gemessen
Für aussagekräftige Zeitmessungen sollte man das System jedes Mal neu booten und das Programm dann oft am Stück durchlaufen lassen (100x oder so). Dann bekommt man vergleichbare Werte. Sonst zeigen sie nur ungefähre Größenordnungen auf, wenn überhaupt.
ich habe die Tests ca. 20-25 mal durchgeführt mit einer 21MB großen Datei
Meillo hat geschrieben:
nur auf mein Debian lauffähig, daher die Zeitmessung auf ein Debiansystem
Das ist dann natürlich überhaupt nicht mehr vergleichbar. Wenn dann musst du alle Messungen (auch) auf dem Debian-System machen.
bei den anderen Varianten war die Laufzeit ungefähr gleich

Meillo hat geschrieben:
die Variante mit tac bzw. tail -r ist vond er Perfomance her die beste :-)
Vermutung: Dies wird sich ändern, wenn du _große_ Datenmengen verwendest, denn `tac' (bzw. `tail -r') kann erst anfangen zu arbeiten, wenn _alle_ Zeilen eingelesen wurden. Es müssen also 2x alle Daten zwischengepuffert werden.
was verstehst du unter "große" Dateien? Ist 21MB groß?
die tail -r Variante war mit Abstand die schnellste Variante :-)

mfg
Twilo

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 24.11.2008 23:00:16

Twilo hat geschrieben:
Meillo hat geschrieben:
Twilo hat geschrieben:die Zeiten sind von ein FreeBSD 6.2 System gemessen
Für aussagekräftige Zeitmessungen sollte man das System jedes Mal neu booten und das Programm dann oft am Stück durchlaufen lassen (100x oder so). Dann bekommt man vergleichbare Werte. Sonst zeigen sie nur ungefähre Größenordnungen auf, wenn überhaupt.
ich habe die Tests ca. 20-25 mal durchgeführt mit einer 21MB großen Datei
Ahh, gut.
Meillo hat geschrieben:
nur auf mein Debian lauffähig, daher die Zeitmessung auf ein Debiansystem
Das ist dann natürlich überhaupt nicht mehr vergleichbar. Wenn dann musst du alle Messungen (auch) auf dem Debian-System machen.
bei den anderen Varianten war die Laufzeit ungefähr gleich
auch gut

Meillo hat geschrieben:
die Variante mit tac bzw. tail -r ist vond er Perfomance her die beste :-)
Vermutung: Dies wird sich ändern, wenn du _große_ Datenmengen verwendest, denn `tac' (bzw. `tail -r') kann erst anfangen zu arbeiten, wenn _alle_ Zeilen eingelesen wurden. Es müssen also 2x alle Daten zwischengepuffert werden.
was verstehst du unter "große" Dateien? Ist 21MB groß?
die tail -r Variante war mit Abstand die schnellste Variante :-)
Erstaunt mich und sagt mir, dass ich mir wohl mal einen Blick in den Quellcode von `tail' bzw. `tac' gönnen sollte.

Überlegungen:
- Ist es mit `tac' (auf Debian) gleich schnell wie `tail -r' (auf FreeBSD)?
- Ist es gleich schnell, wenn man statt `tac file | ...' es so schreibt `<file tac | ...'?

... und dann habe ich wirklich mal nachgedacht und es erstaunt mich doch nicht mehr so sehr, WENN die ``Result''-Zeile eher gegen Ende der Datei kommt. Denn dann muss das sed deutlich weniger Zeilen abarbeiten.

Zu welchen Ergebnissen kommst du, wenn du die Position der ``Result''-Zeile variierst?


(btw: Ich bin eindeutig der Meinung, dass die _simpelste_ Version verwendet werden sollte, nicht die schnellste. Außer die Performance der simplen Version nicht deutlich _zu schlecht_ ist. Das aber ist hier nicht der Fall. Nichtsdestotrotz finde ich die jetzige Diskussion äußerst spannend. ;-) )
Use ed once in a while!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 24.11.2008 23:34:41

Hallo,
Meillo hat geschrieben:- Ist es mit `tac' (auf Debian) gleich schnell wie `tail -r' (auf FreeBSD)?
ja, der Unterschied war bei der 3. Nachkommastelle.
Meillo hat geschrieben:- Ist es gleich schnell, wenn man statt `tac file | ...' es so schreibt `<file tac | ...'?
real 0m0.022s
user 0m0.004s
sys 0m0.015s
Meillo hat geschrieben:... und dann habe ich wirklich mal nachgedacht und es erstaunt mich doch nicht mehr so sehr, WENN die ``Result''-Zeile eher gegen Ende der Datei kommt. Denn dann muss das sed deutlich weniger Zeilen abarbeiten.
% wc -c DATEI.log
23102572 DATEI.log
% wc -l DATEI.log
235246 DATEI.log
% grep -n ^Result DATEI.log
235146:Results of DB-Import finished at 2008-11-24 15:35:58
Meillo hat geschrieben:Zu welchen Ergebnissen kommst du, wenn du die Position der ``Result''-Zeile variierst?
die Ergebnisse kann ich Dir erst morgen liefern
Meillo hat geschrieben:(btw: Ich bin eindeutig der Meinung, dass die _simpelste_ Version verwendet werden sollte, nicht die schnellste. Außer die Performance der simplen Version nicht deutlich _zu schlecht_ ist. Das aber ist hier nicht der Fall. Nichtsdestotrotz finde ich die jetzige Diskussion äußerst spannend. ;-) )
tac bzw. tail -r macht aber eher Sinn, da das "Results ..." immer am Ende der Datei steht

mfg
Twilo

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 25.11.2008 10:41:43

Twilo hat geschrieben: % wc -l DATEI.log
235246 DATEI.log
% grep -n ^Result DATEI.log
235146:Results of DB-Import finished at 2008-11-24 15:35:58
also ziemlich am Ende. Somit bin ich sehr auf die neuen Performance-Messungen gespannt.
Meillo hat geschrieben:(btw: Ich bin eindeutig der Meinung, dass die _simpelste_ Version verwendet werden sollte, nicht die schnellste. Außer die Performance der simplen Version nicht deutlich _zu schlecht_ ist. Das aber ist hier nicht der Fall. Nichtsdestotrotz finde ich die jetzige Diskussion äußerst spannend. ;-) )
tac bzw. tail -r macht aber eher Sinn, da das "Results ..." immer am Ende der Datei steht
Gutes Argument.
Trotzdem würde ich die reine sed-Variante von Duff verwenden, da sie auf einen Blick offenbart was sie macht. Bei der `tac'/`tail -r'-Variante muss man doch erst mal um die Ecke denken. Und das für unnötige Mehr-Geschwindigkeit.

`tac'/`tail -r': real 0m0.019s
sed von Duff: real 0m0.241s
... nicht mal eine halbe Sekunde, bei 21MB! ... das ist doch schnell _genug_
Außer deine Datenmengen sind üblicherweise 10x so groß.
Use ed once in a while!

Benutzeravatar
Twilo
Beiträge: 255
Registriert: 21.04.2006 00:59:40
Wohnort: Berlin

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Twilo » 25.11.2008 21:07:31

Hallo,

hier die Ergebnisse:
Test 1 - Suchwort am Ende
Test 2 - Suchwort am Anfang
Test 3 - Suchwort in der Mitte

der Test wurde wie folgt durchgeführt

Code: Alles auswählen

(
  wc -c tmp.log;
  wc -l tmp.log;
  grep -n ^Result tmp.log;
  i=1;
  anzahl=100;
  echo '---------';
  while [ $i -le $anzahl ] ; do
    echo  "Durchlauf $i "
    echo '---------';
    echo "time awk '/^Result/,0' tmp.log >/dev/null;"
    time awk '/^Result/,0' tmp.log >/dev/null;
    echo '---------';
    echo "time tail -r tmp.log |sed ' /^Result/q; ' |tail -r > /dev/null;"
    time tail -r tmp.log |sed ' /^Result/q; ' |tail -r > /dev/null;
    echo '---------';
    echo "time sed -n '/^Result/,$p' tmp.log >/dev/null;"
    time sed -n '/^Result/,$p' tmp.log >/dev/null;
    echo '---------';
    i=$[$i+1];
  done;
) > ~/tmp/test1.txt 2>&1;
EDIT: die Tests wurden auf ein FreeBSD 6.2 System durchgeführt

mfg
Twilo

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 25.11.2008 22:00:29

Aha, jetzt sieht man was ;-)
1) Die Zeiten vom AWK-Script (Variante1) und dem sed-Script (Variante3) bleiben konstant. Grund: In jedem Fall wird die komplette Datei durchlaufen, es werden halt manche Zeilen ausgegeben oder nicht.
2) Der Unterschied zwischen AWK (Variante1) und sed (Variante3) ist deren Komplexität. AWK ist größer, braucht deshalb länger zum starten und ist vermutlich auch beim Bearbeiten einer Zeile etwas langsamer.
3) Die Laufzeit der `tac'/`tail -r' Variante (Nummer2) variiert. Grund: Der sed-Teil bricht ab sobald die Result-Zeile erreicht wurde, somit muss sed nur bis zu dieser Zeile arbeiten. Zudem muss das zweite `tac'/`tail -r' nur noch die auszugebenden Zeilen bearbeiten.


Ich danke für die erneuten Tests und auch dafür, dass du uns an deinem Versuchsaufbau teilhaben lassen hast -- so lobe ich mir das! *daumen-hoch*
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 26.01.2009 15:23:06

Wollte den Thread hier nochmals ausgraben, da ich momentan mit sed nicht mehr weiter komme.

Ich will nach einer regex nur eine bestimmte Anzahl von Zeilen ausgeben lassen (z.B. 10).
Bekomme es mit dem Speichern im Eingabe- und Haltespeicher einfach nicht hin.
Oh, yeah!

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 26.01.2009 15:26:11

Duff hat geschrieben:Wollte den Thread hier nochmals ausgraben, da ich momentan mit sed nicht mehr weiter komme.
Warum kein neuer Thread für ein neues Problem?
Ich will nach einer regex nur eine bestimmte Anzahl von Zeilen ausgeben lassen (z.B. 10).
Bekomme es mit dem Speichern im Eingabe- und Haltespeicher einfach nicht hin.

Code: Alles auswählen

grep -A 10 're'
Wäre das nichts?


EDIT:
Mit `gsed' ist auch folgendes möglich:

Code: Alles auswählen

sed -n '/re/,+10 p'
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Duff » 26.01.2009 15:31:07

Ok, einen neuen Thread hätte man vielleicht wirklich öffnen können...aber naja...

Es handelt sich um ein HP-UX. Da gibt es die -A Option nicht und ich würde es gerne mit sed realisieren. Habe es so gemacht, dass ich mit sed -n '/regex/,/^$/p' datei zwar das gewünschte angezeigt bekomme, da eine Leerzeile nach den 10 Zeichen kommt, aber ich würde gerne wissen, wie ich es lösen kann, dass ab dem Regex x-Zeichen ausgeben werden.
Oh, yeah!

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

Re: alle Zeilen ab einer bestimmten Zeile ausgeben - mit sed?

Beitrag von Meillo » 26.01.2009 15:38:41

Duff hat geschrieben:[...] aber ich würde gerne wissen, wie ich es lösen kann, dass ab dem Regex x-Zeichen ausgeben werden.
(vermutlich s/Zeichen/Zeilen/, oder?)

Für AWK kann ich das bieten:

Code: Alles auswählen

awk '/re/{while (i++ < 10) { print; getline; } }'
Use ed once in a while!

Antworten