Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
TRex
Moderator
Beiträge: 6060
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 27.05.2018 22:41:43

Meillo hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:17:39
@eggy: Clever, fuer diese Aufgabe R zu nehmen!
Ich hab auch darüber nachgedacht, python mit numpy/matplotlib zu nehmen... aber ich finde Portabilität der Form "wenige Abhängigkeiten" ist viel wert. Aber ja, spezialisierte Tools machen die Lösung gleich dreimal verständlicher und man erfindet das Rad nicht neu.

Die Formatierung hätte ich selbst vermutlich nicht so angelegt - viel zu kompliziert/starr zum Bearbeiten. Aber zum Posen auf superuser/stackoverflow taugts :D

@meillo: gutes Auge auf den leeren Klassen!
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!

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

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:44:24

TomL hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:37:46
Meillo hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:17:39
Btw: Die Formatierung von dem Code ist ja abgefahren ...
Nicht nur das.. ich find das insgesamt total abgefahren ....
Wenn man awk-Code gewohnt ist, ist dieser ganz in Ordnung. ;-)
1. Problem:

Code: Alles auswählen

du -bs ${1:-.}/* 
du: Warnung: Zusammenfassen widerspricht --max-depth=1
„du --help“ liefert weitere Informationen.
Kann ich nicht nachvollziehen. Bei mir laeufts problemlos.
2. Problem (Auszugsweise nur einige dieser "Fehler"):

Code: Alles auswählen

du -b --max-depth=0 ${1:-.}/*
du: Zugriff auf './proc/194/task/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/task/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
Da hast du das Script wohl im root-Verzeichnis gestartet. Derartige Meldungen sind normal wenn man auf Dateien unterhalb von /proc zugreift.
Use ed(1) once in a while!

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

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:51:20

Mein Script verwendet nur `du -s'. Wenn man weiss, dass man ein GNU du hat, ist `du -sb' besser (liefert Bytes). Fuer POSIX-Konformitaet ist `du -sk' die beste Wahl (liefert Kilobytes).

Ganz interessant dazu der Rationale-Abschnitt der POSIX-Seite zu du(1): http://pubs.opengroup.org/onlinepubs/96 ... es/du.html
Use ed(1) once in a while!

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

Re: Scripting Contest

Beitrag von Meillo » 12.07.2018 22:16:41

Neue Aufgabe:

Implementiere ein Einfaerben der Matches fuer grep(1) (oder egrep(1)), ohne `--color' zu verwenden. Es geht also um irgendeine Art von Wrapper um grep(1), der die Treffer in der Ausgabe einfaerbt, so wie `grep --color' das tut.

Gesucht sind kreative Ansaetze. (Die Behandlung aller Randfaelle kann vernachlaessigt werden.)


Loesungen koennen ab kommendem Sonntag, 18:00 gepostet werden.
Use ed(1) once in a while!

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

Re: Scripting Contest

Beitrag von Meillo » 15.07.2018 19:28:41

Hier meine Implementierung:

Code: Alles auswählen

#!/bin/sh

re="$1"
shift

start="`printf '\033[31;01m\033[K'`"
end="`printf '\033[m\033[K'`"

cmd=`egrep -on "$re" "$@" | sort -u | sed '
        s_\([0-9]*\):\(.*\)_NR==\1 {gsub("\2", "'"$start"'\2'"$end"'");print}_
'`
awk "$cmd" "$@" 
Die Idee ist, zweimal durch die Datei zu laufen. Beim ersten Mal mit `grep -on' nur die Matches mit Zeilennummer rauszuholen. Daraus baue ich dann mittels sed ein awk-Script. das beim zweiten Durchgang durch die Datei diese Matches einfaerbt. :-)

Robustheit ist was anderes, aber von der Herangehensweise finde ich die Aufgabe sehr spannend. Mal sehen, ob mir noch eine weitere Herangehensweise einfaellt ...

Die Terminalcolorescapes habe ich uebrigens von `grep --color' abgeschaut. Weiss jemand was das `\033[K' macht?


Die Idee dazu hatten ein Freund und ich neulich. Da dachte ich, dass sich das auch als Scripting-Contest-Aufgabe eignen wuerde. Nun bin ich auf weitere Loesungen, Ideen und Kommentare gespannt.
Use ed(1) once in a while!

eggy
Beiträge: 1508
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 15.07.2018 20:35:04


tobo
Beiträge: 560
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 15.07.2018 22:25:35

Soll das denn so sein, dass die Ausgabe bei Mehrfachtreffern auch mehrfach geschieht? Wenn ich z.B. diese Zeile in einer Datei habe:
#ifconfig eth0 192.168.10.1 netmask 255.255.255.0 up>
und ich suche nach
"[0-9]\.[0-9]+"
dann bekomme ich 4 Ausgabezeilen, unterschiedlich eingefärbt UND textlich (eth0.) verändert!? {EDIT: Beschränkt sich offensichtlich auf "[0-9]"}

Falls das jetzt lösungstechnisch nicht zwingend vorgeschrieben ist grep zu verwenden, um grep zu simulieren - sed kann ja auch direkt regex!? Nur umgeschrieben und "nicht" ausgiebig getestet:

Code: Alles auswählen

#!/bin/sh

re="$1"
shift

start="`printf '\033[31;01m'`"
end="`printf '\033[m'`"

sed -rn 's/'"$re"'/'"$start"'&'"$end"'/gp' "$@"

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

Re: Scripting Contest

Beitrag von Meillo » 16.07.2018 09:48:53

tobo hat geschrieben: ↑ zum Beitrag ↑
15.07.2018 22:25:35
Soll das denn so sein, dass die Ausgabe bei Mehrfachtreffern auch mehrfach geschieht? Wenn ich z.B. diese Zeile in einer Datei habe:
#ifconfig eth0 192.168.10.1 netmask 255.255.255.0 up>
und ich suche nach
"[0-9]\.[0-9]+"
dann bekomme ich 4 Ausgabezeilen, unterschiedlich eingefärbt UND textlich (eth0.) verändert!? {EDIT: Beschränkt sich offensichtlich auf "[0-9]"}
Du hast recht, das ist falsch. Es ist die Folge eines klassischen Problems bei der Softwareentwicklung. Ich habe die ganze Zeit mit diesem Code entwickelt und getestet:

Code: Alles auswählen

#!/bin/sh

re="$1"
shift

start="`printf '\033[31;01m\033[K'`"
end="`printf '\033[m\033[K'`"

cmd=`egrep -on "$re" "$@" | sort -u | sed '
        s_\([0-9]*\):\(.*\)_NR==\1 {gsub("\2", "'"$start"'\2'"$end"'")}_
'`
awk "$cmd;1" "$@"
Erst ganz am Ende habe ich realisiert, dass ich nur die gematchten Zeilen ausgeben sollte (also auch greppe und nicht nur highlighte). Folglich habe ich das ``;1'' in der letzten Zeile entfernt und in der sed-Ersetzung ein ``;print'' eingefuegt:

Code: Alles auswählen

#!/bin/sh

re="$1"
shift

start="`printf '\033[31;01m\033[K'`"
end="`printf '\033[m\033[K'`"

cmd=`egrep -on "$re" "$@" | sort -u | sed '
        s_\([0-9]*\):\(.*\)_NR==\1 {gsub("\2", "'"$start"'\2'"$end"'");print}_
'`
awk "$cmd" "$@"
... dachte mir, das wird schon passen. ;-)

Habe dann nur noch einen kleinen Test gemacht, der das Problem nicht gezeigt hat ...

Es ist ja nicht so, dass man dieses Problemszenario noch nie gesehen haette. Trotzdem faellt man drauf rein. Haette ich nur eine Testsuite geschrieben, die haette mich davor bewahrt! Also: Darum Testsuites schreiben! ... und auch laufen lassen!


Falls das jetzt lösungstechnisch nicht zwingend vorgeschrieben ist grep zu verwenden, um grep zu simulieren - sed kann ja auch direkt regex!? Nur umgeschrieben und "nicht" ausgiebig getestet:

Code: Alles auswählen

#!/bin/sh

re="$1"
shift

start="`printf '\033[31;01m'`"
end="`printf '\033[m'`"

sed -rn 's/'"$re"'/'"$start"'&'"$end"'/gp' "$@"
LOL! :lol: Da war ich ja mal super erfolgreich im unnoetig kompliziert sein. Von hinten durch die Brust ins Auge. :facepalm:

Danke, dass du mich aus meiner Denkrinne geholt hast. :THX:


Diese Aktion habe ich ja mal sowas von in den Sand gesetzt! :mrgreen:
Use ed(1) once in a while!

tobo
Beiträge: 560
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 16.07.2018 19:21:45

Ich will ja nicht kleinlich sein, aber das stimmt immer noch nicht: Der Text wird am Anfang zu "eth0.1" ergänzt.
Die Rückgabe von egrep liefert:

Code: Alles auswählen

1:2.168
1:0.1
1:5.255
1:5.0
Und diese Rückgaben sind Strings, werden von AWK (bei der Suche) aber als RegEx behandelt, weswegen das "0.1" im Beispiel doppelt greift!? Das ist also ein grundsätzliches Problem. Ich habe mal ein bisschen probiert an \2 "zumzuquoten", mich dabei aber vom richtigen Ergebnis eher entfernt, weil ich von AWK halt schlicht keine Ahnung habe.

eggy
Beiträge: 1508
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 19.07.2018 08:48:10

Ich sitz grad an nen SVG-Problemchen und wahrscheinlich gibts schon nen kleines Tool dafür (oder Inkscape kann das irgendwie) aber vielleicht hat der ein oder andere ja trotzdem Lust sich damit zu beschäftigen: Aus einer SVG-Datei sollen alle Shapes extrahiert werden, dabei soll pro Shape die Farbe und evtl ein Objektname ausgegeben werden, zu jedem Shape soll auch eine Liste der (absoluten) Koordinaten ausgegeben werden. Kurven sollen dabei in Linien umgewandelt werden.

Klingt erstmal einfach, interessant wirds dadurch, dass in so einem Pfad relative und absolute Koordinaten gemischt auftreten können, Bewegungen auf eine Achse eingeschränkt werden können, und am Ende nur die Punkte des Polygons ohne die Kontrollpunkte der Bezierkurven in der Liste erscheinen sollen.

https://www.w3schools.com/graphics/svg_path.asp

Beispieldatei: NoPaste-Eintrag40384

Wie üblich: Lösungen bitte erst ab Sonntag 18:00h posten

Antworten