Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] Ausschlussliste erstellen  (Read 8180 times)

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
[DE] Ausschlussliste erstellen
« on: 2011/07/20, 23:11:18 »
Hi, ich habe 2 Listen von Dateien:

Code: [Select]

1. find . -iname \*.txt
2. grep -v 'unwort' $(find . -iname \*.txt ) | awk -F \: '{print $1}'


Was ich bräuchte: Liste 1 ohne Liste 2 - irgendwie bin ich zu blöde dazu. Wie macht man so was?
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #1 on: 2011/07/21, 00:04:15 »
OK. Als gelöst würde ich das nicht bezeichnen wollen, aber es macht auf die Schmutzige genau das, was ich will. Da ich aber keinerlei Plan habe, wie ich das auf die Schnelle elegant gelöst bekomme, muss das für heute reichen. Ich würde mich trotzdem über einen Tipp freuen. Gibts da nicht was mit regex für? Wenigstens habe ich jetzt mal Schleifen, Vergleiche und Zuweisungen geübt ;)

Code: [Select]

#!/bin/bash
# Aufruf ./hugo extension unwort

extension=$1
search=$2

willi=$(find . -iname \*.$extension)
harry=$(grep $search $willi | awk -F \: '{print $1}')

#echo $willi
#echo
#echo $harry
#echo

for i in $willi
do
  j="false"
  for k in $harry
  do
    if [ $i = $k ]; then
      j="true"
    fi
  done
  if [ $j = "false" ]; then
    l+=$i' '
  fi
done

echo $l
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

Offline ralul

  • User
  • Posts: 1.814
Re: Ausschlussliste erstellen
« Reply #2 on: 2011/07/21, 00:59:41 »
Code: [Select]

#!/bin/bash
for f in $(find . -iname \*.$extension); do
    grep $such $f >/dev/null || echo $f
done
experiencing siduction runs better than my gentoo makes me know I know nothing

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #3 on: 2011/07/21, 01:13:29 »
Bedankt. In anderen Worten - entweder ich iteriere das mehr oder weniger durch oder ich gehe über temporäre Files und nehme comm -3 auf sortierten Listen. Mist. Ich habe gehofft, da ohne Script oder Makro auszukommen. So per Handaufleg und alles ist schön.

Auf jeden Fall sieht Dein Script wesentlich kürzer und eleganter aus. Danke.

Hintergrund der Aktion: Suche alle Files in einem Projekt, in die noch kein ordentlicher Disclaimer eingetragen ist und/oder die Lizenzinfos fehlen.
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

DonKult

  • Guest
Ausschlussliste erstellen
« Reply #4 on: 2011/07/21, 14:05:25 »
Etwas wie
Code: [Select]
( commando-liste-1; commando-liste-2 ) | sort | uniq -u
könnte es auch tun -- unter der Annahme, dass commando-liste-2 keine Einträge generiert die nicht in commando-liste-1 vorkommen (was bei dir ja der Fall zu sein scheint). Wenn dem so ist wird sort die Ausgabe der beiden Kommandos so sortieren, dass die doppelten Einträge hintereinander stehen, 'uniq -u' wird dann nur noch Einträge anzeigen, die nur einmal vorkommen. Mit 'uniq -d' kann man das Spiel genau umdrehen und sehen was man bereits erreicht hat.

Bonustip:
Code: [Select]
grep -L 'unwort' $(find . -iname \*.txt )
Aber das muss man dann schon wirklich in der manpage nachlesen ;)

Offline ralul

  • User
  • Posts: 1.814
Ausschlussliste erstellen
« Reply #5 on: 2011/07/22, 13:27:10 »
DonKults "grep -L" ist natürlich das Performanteste, weil Einfachste, denn es werden sogar noch greps Ausgabe Funktionsaufrufe erspart.

Aber "(subshell;Befehle;in;der;Klammer;hintereinander;einsetzen;und)|zusammen|umleiten" ist ein genial universales Werkzeug. Subshells sind teuer in der Performance, jede Umleitung ist übrigens auch eine Subshell! Aber übersichtlicher und eindeutiger Code. Wenn Code nicht jede Minute tausend Mal läuft auf einem Server, ist Performance kein Argument.

Ich komme beim Scripten oft nie auf solche genialen Muster, weil ich sie noch nie eingesetzt habe, weil ich nie spontan drauf komme. Jeder hat so seine eigenen HackMuster, die er ohne groß zu überlegen einsetzt.
experiencing siduction runs better than my gentoo makes me know I know nothing

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #6 on: 2011/07/22, 13:39:52 »
Ich habe bei bash ein Problem. Weder kenne ich die Syntax, die Symantik noch habe ich die Zeit mich damit zu beschäftigen. Von daher wird mein Zeug je nach Grad des Wissenserwerbs so aussehen, das ich das möglichst ohne Probleme lesen kann. Ich könnte "cleveren" Code, den man auch einfach schreiben kann, hassen.
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

DonKult

  • Guest
Ausschlussliste erstellen
« Reply #7 on: 2011/07/22, 14:48:22 »
Viele Wege führen nach Rom - und bei so "einfachen" Problemen kann es ganz nützlich sein sich mal jeden Weg anzusehen.

An der Pipe mag ich am meisten, dass man sofort Zwischenergebnisse betrachten kann und immer in kleinen Schritten denken muss. Das macht die eigene Lösung eventuell "clever", aber man kann andere Lösungen recht einfach verstehen, weil man sich immer nur auf einen kleinen Teil konzertieren muss.
Die Belohnung für diesen Denkaufwand beim Entwickler ist dabei immer, dass die kleinen Schritte oft schon implementiert sind und man so nur noch legomäßig alles zusammenstecken muss. Die vielen kleines Tools wie sort und Co. kann man immer mal wieder gewinnbringend einsetzen, die Wiederverwendbarkeit von for-Schleifen ist geringer, da sie einfach näher am Problem sind. Durch diese Abstraktion hat man es oft leichter vorgefertigtes zu verwenden wodurch sich die Entwicklungszeit reduzieren kann was man allerdings gegen Performance auf der Ausführungsseite eintauscht. In beide Richtungen kann man es aber durchaus übertreiben. ;)


Und um noch mal altkluges Professorenwissen zu rezitieren: "Oft ersparen 6 Stunden drauflos programmieren dem Entwickler 1 Stunde Umsetzung eines Plans oder 5 Minuten Handbuch lesen."
Das man dafür erstmal einen Plan haben bzw. das Handbuch finden muss sagt da aber niemand. ;)

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #8 on: 2011/07/22, 15:41:20 »
Ein paar Worte von Dr. Zemlin, seines Zeichens promovierter Mathematiker und Informatiker seit 1965: "Meine Damen und Herren - programmieren sie einfach und dokumentieren Sie. Sonst stehen sie in einem halben Jahr da und fragen sich: Welcher Esel hat das verbrochen und was macht das eigentlich?"

Das war WS 89/90. Der Mann hatte recht. Das hat mir seitdem in schönster Regelmäßigkeit den Arsch gerettet. Die Sache mit dem nicht cleverer programmieren als man selbst ist, hattest Du bereits früher erwähnt. Auch eine Regel, an die ich mich seit 20 Jahren halte. Macht irgendwie Sinn und schafft Lebensqualität.

Dein Prof hatte recht, so ungefähr, eventuell 8:1 hätte ich das Verhältnis auch geschätzt. Manchmal hilft es aber auch durchaus, dass man raucht und Kaffee trinkt. Beides war in den Rechnerpools der Uni Bi nicht erlaubt. Das hat die Sache erheblich beschleunigt. .

Thema Performance. Bei solcher "Einmalprogrammierung" wie dem aktuellen Problem Werde ich den Weg des geringsten Widerstands wählen. Ich setze mich nicht hin und schreibe und optimiere 6 Stunden, nur um 10 s Laufzeit zu sparen. Politur auf Laufzeit mache ich grundsätzlich nur da, wo ich wirklich muss. Und wenn man das durch Rechenleistung erschlagen kann, ist dieser Weg auch der angenehmere. Bei Datenbanken sehe ich das ein wenig anders. Da bin ich ein kleines Penibelchen. vor allem wenn mehr als 2 Leute auf relativ großen Banken rumhacken. Da kann man sich über Datendesign und Kostenanalysen schon mal einige Tage und auch Wochen Gedanken machen. Am besten im Vorfeld, wenn die Anwendung noch nicht aus allen Nähten platzt.
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

Offline ralul

  • User
  • Posts: 1.814
Ausschlussliste erstellen
« Reply #9 on: 2011/07/22, 19:09:28 »
@agaida, hier der Bash Crashkurs:
- '(subshell;behfele;hintereinander;gereiht)' sind zu benutzen mit 'var=$(subBefehl)' oder '|' pipe.
- '&&' zwingendes "und" oder '||' ist ein "oder". Diese ersetzen "if" oder "if not"

und das Performanteste war eben, wie DonKult sagte, durch 5 Minuten "man grep" zu erreichen:
grep -L 'unwort' $(find . -iname \*.txt )

@DonKult, apropos man grep: Was sind eigentlich "fixed strings" bei fgrep, das habe ich nie verstanden?
experiencing siduction runs better than my gentoo makes me know I know nothing

DonKult

  • Guest
Ausschlussliste erstellen
« Reply #10 on: 2011/07/23, 09:04:03 »
Quote from: "ralul"
@DonKult, apropos man grep: Was sind eigentlich "fixed strings" bei fgrep, das habe ich nie verstanden?

Da die restlichen Modes alles regex's in irgendeiner Form sind sind 'fixed strings' keine. Sondern wirklich nur das geschriebene Wort.

Man nehme die Liste Namen.txt:
Code: [Select]
Da Mustea
Daniel Muster
Max Muster*
Jane Musterfrau

Und beackern sie wahlweise mit (-E, -G, -P oder gar nichts)
Code: [Select]
$ grep 'Muster*' Namen.txt
Da Mustea
Daniel Muster
Max Muster*
Jane Musterfrau

oder
Code: [Select]
$ grep -F 'Muster*' Namen.txt
Max Muster*

Möchte man also nach dem Cyborg mit Nachnamen 'Muster' suchen muss man drauf aufpassen, dass grep nicht anfängt die Eingabe als regex misszuverstehen.

Auch gut: Suchwort 'Wort.' um einen Satz zu suchen der mit Wort endet. Denkste. '.' ist im regex ein beliebiges Zeichen…

P.S.: Unter der Annahme, das man einen Cyborg mit einem Sternschen hinter seinem Namen makiert.

P.P.S.: Passiert natürlich weniger häufig wenn man grep mit der Hand bedient, aber wenn es sich irgendwo in einem Script versteckt…

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #11 on: 2011/07/23, 09:35:10 »
Das ist doch mal eine Erklärung, die sogar ich verstehe. Gibt es eigentlich was Einfaches zum Üben für regex - So in der Form Regex for Dummies? Irgendwas mit vielen trivialen Beispielen so a la Malen nach Zahlen, was man sich mal kurzfristig und intensiv reinziehen kann? Die meisten Seiten und Dokus waren mir irgendwie zu abgehoben, da waren die Grundlagen einfach zu abgehoben.
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen

DonKult

  • Guest
Ausschlussliste erstellen
« Reply #12 on: 2011/07/23, 10:12:40 »
Quote from: "agaida"
Gibt es eigentlich was Einfaches zum Üben für regex - So in der Form Regex for Dummies?


"/(bb|[^b]{2})/ a regex pro? That is the question." -- Shakespeare

txt2regex ist irgendwie ganz lustig, allerdings gehörig angestaubt als bash2 script. Regex ist so 'ne Sache, ich glaub wenn man Perl nicht programmiert lernt man das nicht, sondern benutzt immer nur die Brocken die man während des Fluchens mühsam gelernt hat.

Probieren geht über studieren - den auch wenn 'man 7 regex' sich bemüht, das Einfachste von der Welt ist es nicht…

Disclaimer: Ich hab eine (unbegründete?) Aversion gegen Perl und sehe RegEx als (teilweise notwendiges) Übel an. Ich kann Perl nicht und hab auch keine Intension daran was zu ändern…

Offline agaida

  • User
  • Posts: 1.760
    • http://g-com.eu
Ausschlussliste erstellen
« Reply #13 on: 2011/07/23, 12:38:47 »
Du hast ja so recht... Ich muss es leider ändern, ich bin in einem php-Projekt am Frickeln, dass 1:1 aus perl übernommen wurde. Da machen sich gewisse Grundkenntnisse ganz gut. Der Witz an regex ist ja, dass man mit einer relativ schmalen Grundlage an Wissen sehr gut funktionierende Sachen schreiben kann. Nur das Erweitern oder Analysieren ist ekelerregend. Dein Beispiel mit dem gepipedten grep war da schon passend. Dadurch, dass regex und perl aber vor oder nach erfolgter Verschlüsselung relativ gleich  aussehen, wird es nicht leichter.

Beispiel:
Code: [Select]

~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.

ASCII art?? I thought it was a regular expression!
There's this special biologist word we use for "stable". It's "dead". ~ Jack Cohen