Hallo, Am Die, 14 Sep 2010, Andre Tann schrieb:
wie kann man denn elegant nach einer Datei suchen, die irgendwo in irgendeiner Reihenfolge bestimmte Stichworte enthält?
Sowas finde ich grausig:
grep -ril wort1 . | while read x; do grep -ril wort2 "$x"; done | while...
Gibts nicht was schöneres, wo jede Datei nur einmal gelesen werden muß?
==== find . -type f -exec gawk ' BEGIN { N = NUM_WORDS; } /wort1/ && ! words[1] { words[1]=1; } /wort2/ && ! words[2] { words[2]=1; } ... /wortN/ && ! words[N] { words[N]=1; } END { for(i in words) { n++; } if ( n == N ) { print FILENAME; } }' '{}' + ==== Alternativ: ==== find . -type f -exec gawk ' /wort1/ { words[1]=1; } /wort2/ { words[2]=1; } ... /wortN/ { words[N]=1; } END { if( words[1] && words[2] && ... && words[N] ) { print FILENAME; } }' '{}' + ==== Wobei beidemale "wort1" ... "wortN" für Regexe stehen (wie bei egrep). Und NUM_WORDS beim ersten in die Anzahl der Regexe. Den Krams mit den '/wortN/ { words[N] = 1; }' könnte man auch generieren, und das ganze dann an gawk -f verfüttern: ==== { echo 'BEGIN { print FILENAME; }' i=1 for regex in foo 'bar.*baz' qux; do printf '/%s/ { words[%s]=1; }\n' "$regex" "$i" i=$((i+1)) done echo -n 'END { if (' j=1 while test $j -lt $i ; do echo "words[$j] &&"; j=$((j+1)); done printf '1 ) {\n print FILENAME;\n}}' } > /tmp/t.awk find . -type f -exec gawk -f /tmp/t.awk '{}' + rm -f /tmp/t.awk ==== Zum Nachverfolgen noch ein 'cat /tmp/t.awk' vor dem 'find' einbauen. Und das find ggfs. auskommentieren. Das kann man dann noch so ausbauen, daß man 'for regex in "$@"; do' verwendet und in ein Script verpackt (dann sollte man allerdings 'mktemp' für ein sicheres tempfile verwenden!). Könnte man dann z.B. als ~/bin/multigrep abspeichern. Zur Erinnerung: sed kann alles was grep kann, awk kann alles was sed kann, perl kann (fast) alles was awk kann ;) (und jew. noch einiges mehr). HTH, noch Fragen? -dnh -- There is a green, multi-legged creature crawling on your shoulder. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org