
Moin! Ich habe eine Textdatei, in der bestimmte Werte mit Escape-Sequenzen für Farben markiert sind. D.h. wenn ich die Datei in Konsole z.B. mit 'cat' ausdrucken, werden diese Werte farblich dargestellt. Nun sollte ich alle rot markierten Werte herausfiltern, am liebsten mit 'awk'/'sed'. Ich stehe hier etwas auf dem Schlauch und kann nicht herausfinden, wie ich das tun kann. Das Format an sich ist einfach: <Farben-Escapes für rot>WERT<leerzeichen> Jede Zeile hat auch andere Inhalte, die schlicht ignoriert werden sollen. Danke schon im voraus für Hilfe! BG, Kimmo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Am Dienstag, 29. August 2017, 08:48:30 CEST schrieb K. Elo:
grep -Po '\\033\[31m.*?\b' file wobei \\033\[31m der Farbcode wäre.
-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Am Tue, 29 Aug 2017, Harald Stürmer schrieb:
Genauer: die Escapesequenz ist ESC [ $parameter m also z.B.: printf '\e[31mfoo\e[0mbar\n' Oder auch (und das wird durch obige RE für grep z.B. nicht gefunden: printf '\e[31;42mfoo\e[0mbar\n' $parameter dürfen auch mehrere, durch ';' getrennte Codes sein, erst das 'm' schließt die Sequenz dann ab. Wie genau die Sequenz _angegeben_ werden muß, damit das jew. Programm die Sequenz richtig an das Terminal schickt variiert je nach Programm und Quoting der Sequenz. Und diese ganze Escapecodes sind in einer oft übersehenen manpage, nämlich 'man 4 console_codes' dokumentiert. Obige Farbcodes z.B. unter ==== ECMA-48 Set Graphics Rendition The ECMA-48 SGR sequence ESC [ parameters m sets display attributes. [..] 31 set red foreground ==== Ansonsten siehe die manpages der Shell bzgl. Quoting, und man 7 regex und 'man perlre' bzgl. wie dann die Regex für grep/sed/awk aufzubauen ist und natürlich die manpages zu grep/sed/awk. PS: gelegentlich will man diese Sequenzen aus einer Datei wieder raushaben, dabei hilft "ansifilter" -dnh -- When I was a boy all our networks Were for hauling in fish from the sea-- Our bawd rate was eight bits an hour (and she was worth it!), And our IP address was just three. And you kids who complain that the World Wide Web Is too slow oughtta cut out your bitching, 'Cause when I was a boy every packet Was delivered by carrier pigeon. -- Frank Hayes -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Danke vielmals für die schnellen Antworten sowie David für die zusätzliche Information. Ich hätte noch eine Zusatzfrage: ich habe festgestellt, in einigen Zeilen gibt es zwei rot markierte Werte. Wie kann ich jetzt diese so herausfiltern, dass diese auf einer Zeile gezeigt werden? Die Grep- Variante fügt für jeden gefundenen Wert eine neue Zeile ein. Also die Zeile: Bla bla <Roter Wert1> Bla Bla <Roter Wert2> soll: <Roter Wert1> <Roter Wert2> produzieren. Ist das mit 'awk' möglich? Oder soll ich lieber mit Python weitermachen? Danke & Gruß, Kimmo 2017-08-29, 10:46 +0200, David Haller schrieb:

Hallo, Am Tue, 29 Aug 2017, K. Elo schrieb:
Denke schon. Aber um ganz sicher zu sein, zeig doch mal ein konkretes und komplettes Beispiel (wobei du die reinen _Text_-Inhalte in "Bla*" und "Roter Wert" natürlich zensieren kannst und solltest, aber so, das die Struktur (IP/Text) erhalten bleibt). Also eine komplette Beispielzeile inkl. der Escapes wenn's geht. Minimaler pseudo-awk-code Ansatz aus der Hüfte: ==== /\e\[31(;[0-9;]*)?m/ { gensub|gsub|sub ... print ... } ==== Die Bedingung sollte bei jeder Zeile mit mind. einem "Rot" anspringen oder so, und dann kann man nach Herzenslust basteln ;) Die Regex ist jetzt aber nur hingeschrieben und noch nichtmal gegen meine 2 einfachen Beispiele getestet. Hmpf. Ist awk bei sowas "greedy" und kennt's ggfs. einen "non-greedy" Modifier? Öhm, evtl. kann awk das doch nicht, aber perl (mit python kenn ich mich nicht aus). Und perl (ohne weitere Module) startet durchaus flott (hier z.B. in <0.1s mit "strict"), und da wird schonmal "strict.pm" gesucht und geladen... Wenn man (gar in ner Schleife) perl (und awk und sed!) mehrfach für ein "Dings" aufruft macht man aber immer was flasch[tm], da reicht es _einmal_ perl, awk, sed aufzurufen. Wobei, Schleifen in sed sind nicht gerade intuitiv... HTH, -dnh PS: Tip am Rande: 'find ... perl' ist immer ne doofe Idee, v.a. wenn das perl was nicht triviales macht, bei dem jedoch nicht die Ausführung die Laufzeit bestimmt[2]. "Find" kann perl selber auch, wenn auch anders, aber zur Übersetzung gibt's "find2perl", das man dann noch verfeinern kann... [2] geht's z.B. um Videos rekodieren, dann geht der Anteil von find+perl trotz aller Ineffizienz gegen Null, je nach Größe der Videos ;) -- Demokratie ist die Herrschaft der Unfähigen über die Desinteressierten... -- gewissermaßen aus Dorfer's Donnerstalk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo! 2017-08-29 16:01 +0200, David Haller schrieb:
Hier ein Auszug (2 Zeilen, mit cat -A produziert): --- snip --- ^[[32m^[[K1081^[[m^[[K^[[36m^[[K:^[[m^[[KEI_1987/0379 Datum: 19.10.1987 ID: ^[[01;31m^[[KSA8750379^[[m^[[K ^[[32m^[[K1300^[[m^[[K^[[36m^[[K:^[[m^[[KM-oM-^BM-7 Ohne Titel ^[[01;31m^[[KSA8772126^[[m^[[K --- snip --- Ich habe es mir genauer angeschaut und es werden auch andere Farbkodierungen verwendet. Daher sollten eigentlich ALLE farbkodierten Stellen extrahiert werden. Also, wenn ich es richtig sehe, Werte zwischen "^[[????m^[[K" und "^[[m^[[K". Eigentlich ist dies wie mit Tags, aber für mich ist eben das Problem, wie Escapesequenzen behandelt werden sollten. Der Output der 1. Zeile sollte also sein: 1081 : SA8750379 BG, Kimmo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Am Tue, 29 Aug 2017, K. Elo schrieb:
Achtung, schwer zu lesend: $ cat Kimmo_Elo_Escapes_Prob.sh | perl -ne '\ if( s/.*?(?:\e\[\d+(?:;\d+)?m(.*?)\e\[\d*(?:;\d+)?m)+.*?/$1 /gs ) { s/\e\[K//g; s/\s+$/\n/; print ; }' 1081 : SA8750379 1300 : SA8772126 Leichter lesbar: perl -ne 'if( s/ ### ersetze .*? ### möglichst kurzes irgendwas (?: ### Gruppe auf \e\[\d+ ### ESC [ NUMMERn (?:;\d+)? ### ggfs. gefolgt von ";NUMMERn" m ### m (also ESC [ NUMMER(;NUMMER)m (.*?) ### möglichst kurzes irgendwas \e\[\d* ### (?:;\d+)? ### noch ne ESC [ .. m Sequenz, diesmal ggfs. leer m ### (siehe \d* vs. \d+ )+ .*? ### möglichst kurzes irgendwas /$1 /gsx ### durch den Text zw. den 2 ESC [ Sequenzen ) { s/\e\[K//g; ### noch die \e[K Sequenzen raus s/\s+$/\n/; ### Leerzeichen am Ende raus print ; }' Hm. Ich seh grad, werden ESC [ .. m nicht "geschlossen", z.B.: "[31mfoo[36mbar[K:[m", dann klappt das so nicht. Is nicht so einfach... Melde dich ggfs. nochmal. HTH, -dnh -- Hmm mit welcher Beschleunigung muß man denn ein Schwein durch die Atmosphäre schießen, damit es durchgegrillt ist, aber schön saftig bleibt und mit einer leichten Kruste? Und wie weit weg und in welchem Abwurfwinkel, damit man den vom Gegenüber bereitgehaltenen Spieß trifft? :-) -- Erhard Schwenk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Am Dienstag, 29. August 2017, 08:48:30 CEST schrieb K. Elo:
grep -Po '\\033\[31m.*?\b' file wobei \\033\[31m der Farbcode wäre.
-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Am Tue, 29 Aug 2017, Harald Stürmer schrieb:
Genauer: die Escapesequenz ist ESC [ $parameter m also z.B.: printf '\e[31mfoo\e[0mbar\n' Oder auch (und das wird durch obige RE für grep z.B. nicht gefunden: printf '\e[31;42mfoo\e[0mbar\n' $parameter dürfen auch mehrere, durch ';' getrennte Codes sein, erst das 'm' schließt die Sequenz dann ab. Wie genau die Sequenz _angegeben_ werden muß, damit das jew. Programm die Sequenz richtig an das Terminal schickt variiert je nach Programm und Quoting der Sequenz. Und diese ganze Escapecodes sind in einer oft übersehenen manpage, nämlich 'man 4 console_codes' dokumentiert. Obige Farbcodes z.B. unter ==== ECMA-48 Set Graphics Rendition The ECMA-48 SGR sequence ESC [ parameters m sets display attributes. [..] 31 set red foreground ==== Ansonsten siehe die manpages der Shell bzgl. Quoting, und man 7 regex und 'man perlre' bzgl. wie dann die Regex für grep/sed/awk aufzubauen ist und natürlich die manpages zu grep/sed/awk. PS: gelegentlich will man diese Sequenzen aus einer Datei wieder raushaben, dabei hilft "ansifilter" -dnh -- When I was a boy all our networks Were for hauling in fish from the sea-- Our bawd rate was eight bits an hour (and she was worth it!), And our IP address was just three. And you kids who complain that the World Wide Web Is too slow oughtta cut out your bitching, 'Cause when I was a boy every packet Was delivered by carrier pigeon. -- Frank Hayes -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Danke vielmals für die schnellen Antworten sowie David für die zusätzliche Information. Ich hätte noch eine Zusatzfrage: ich habe festgestellt, in einigen Zeilen gibt es zwei rot markierte Werte. Wie kann ich jetzt diese so herausfiltern, dass diese auf einer Zeile gezeigt werden? Die Grep- Variante fügt für jeden gefundenen Wert eine neue Zeile ein. Also die Zeile: Bla bla <Roter Wert1> Bla Bla <Roter Wert2> soll: <Roter Wert1> <Roter Wert2> produzieren. Ist das mit 'awk' möglich? Oder soll ich lieber mit Python weitermachen? Danke & Gruß, Kimmo 2017-08-29, 10:46 +0200, David Haller schrieb:

Hallo, Am Tue, 29 Aug 2017, K. Elo schrieb:
Denke schon. Aber um ganz sicher zu sein, zeig doch mal ein konkretes und komplettes Beispiel (wobei du die reinen _Text_-Inhalte in "Bla*" und "Roter Wert" natürlich zensieren kannst und solltest, aber so, das die Struktur (IP/Text) erhalten bleibt). Also eine komplette Beispielzeile inkl. der Escapes wenn's geht. Minimaler pseudo-awk-code Ansatz aus der Hüfte: ==== /\e\[31(;[0-9;]*)?m/ { gensub|gsub|sub ... print ... } ==== Die Bedingung sollte bei jeder Zeile mit mind. einem "Rot" anspringen oder so, und dann kann man nach Herzenslust basteln ;) Die Regex ist jetzt aber nur hingeschrieben und noch nichtmal gegen meine 2 einfachen Beispiele getestet. Hmpf. Ist awk bei sowas "greedy" und kennt's ggfs. einen "non-greedy" Modifier? Öhm, evtl. kann awk das doch nicht, aber perl (mit python kenn ich mich nicht aus). Und perl (ohne weitere Module) startet durchaus flott (hier z.B. in <0.1s mit "strict"), und da wird schonmal "strict.pm" gesucht und geladen... Wenn man (gar in ner Schleife) perl (und awk und sed!) mehrfach für ein "Dings" aufruft macht man aber immer was flasch[tm], da reicht es _einmal_ perl, awk, sed aufzurufen. Wobei, Schleifen in sed sind nicht gerade intuitiv... HTH, -dnh PS: Tip am Rande: 'find ... perl' ist immer ne doofe Idee, v.a. wenn das perl was nicht triviales macht, bei dem jedoch nicht die Ausführung die Laufzeit bestimmt[2]. "Find" kann perl selber auch, wenn auch anders, aber zur Übersetzung gibt's "find2perl", das man dann noch verfeinern kann... [2] geht's z.B. um Videos rekodieren, dann geht der Anteil von find+perl trotz aller Ineffizienz gegen Null, je nach Größe der Videos ;) -- Demokratie ist die Herrschaft der Unfähigen über die Desinteressierten... -- gewissermaßen aus Dorfer's Donnerstalk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo! 2017-08-29 16:01 +0200, David Haller schrieb:
Hier ein Auszug (2 Zeilen, mit cat -A produziert): --- snip --- ^[[32m^[[K1081^[[m^[[K^[[36m^[[K:^[[m^[[KEI_1987/0379 Datum: 19.10.1987 ID: ^[[01;31m^[[KSA8750379^[[m^[[K ^[[32m^[[K1300^[[m^[[K^[[36m^[[K:^[[m^[[KM-oM-^BM-7 Ohne Titel ^[[01;31m^[[KSA8772126^[[m^[[K --- snip --- Ich habe es mir genauer angeschaut und es werden auch andere Farbkodierungen verwendet. Daher sollten eigentlich ALLE farbkodierten Stellen extrahiert werden. Also, wenn ich es richtig sehe, Werte zwischen "^[[????m^[[K" und "^[[m^[[K". Eigentlich ist dies wie mit Tags, aber für mich ist eben das Problem, wie Escapesequenzen behandelt werden sollten. Der Output der 1. Zeile sollte also sein: 1081 : SA8750379 BG, Kimmo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org

Hallo, Am Tue, 29 Aug 2017, K. Elo schrieb:
Achtung, schwer zu lesend: $ cat Kimmo_Elo_Escapes_Prob.sh | perl -ne '\ if( s/.*?(?:\e\[\d+(?:;\d+)?m(.*?)\e\[\d*(?:;\d+)?m)+.*?/$1 /gs ) { s/\e\[K//g; s/\s+$/\n/; print ; }' 1081 : SA8750379 1300 : SA8772126 Leichter lesbar: perl -ne 'if( s/ ### ersetze .*? ### möglichst kurzes irgendwas (?: ### Gruppe auf \e\[\d+ ### ESC [ NUMMERn (?:;\d+)? ### ggfs. gefolgt von ";NUMMERn" m ### m (also ESC [ NUMMER(;NUMMER)m (.*?) ### möglichst kurzes irgendwas \e\[\d* ### (?:;\d+)? ### noch ne ESC [ .. m Sequenz, diesmal ggfs. leer m ### (siehe \d* vs. \d+ )+ .*? ### möglichst kurzes irgendwas /$1 /gsx ### durch den Text zw. den 2 ESC [ Sequenzen ) { s/\e\[K//g; ### noch die \e[K Sequenzen raus s/\s+$/\n/; ### Leerzeichen am Ende raus print ; }' Hm. Ich seh grad, werden ESC [ .. m nicht "geschlossen", z.B.: "[31mfoo[36mbar[K:[m", dann klappt das so nicht. Is nicht so einfach... Melde dich ggfs. nochmal. HTH, -dnh -- Hmm mit welcher Beschleunigung muß man denn ein Schwein durch die Atmosphäre schießen, damit es durchgegrillt ist, aber schön saftig bleibt und mit einer leichten Kruste? Und wie weit weg und in welchem Abwurfwinkel, damit man den vom Gegenüber bereitgehaltenen Spieß trifft? :-) -- Erhard Schwenk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (3)
-
David Haller
-
Harald Stürmer
-
K. Elo