wie bekomme ich eine Und-Verknüpfung mit grep hin.
Eine oder funktioniert:
grep -l 'von\|nach' *
Ich möchte es erreichen, daß wenn in einer Datei ein
'von' und ein 'nach' stehen, der grep mir die Datei ausgibt.
Gruß
Knut
Kann mit einem einfachen grep nicht gehen, weil grep ZEILENWEISE
arbeitet, also sich nicht merken kann, dass es schon eines der
beiden Woerter gefunden hat.
Eine Verkettung macht das Gewuenschte, wegen des mehrfachen
Auftretens des Dateinamens muss aber eine Schleife drum:
for file in *; do grep von $file >/dev/null && grep -l nach $file; done
GNU grep hat eine quiet option -q, dann gehts auch so:
for file in *; do grep -q von $file && grep -l nach $file; done
Analog haben egrep und fgrep die silent option -s.
Gruezi,
Robert
--
--------------------------------------------------------
Robert Wirth, Hauptstrasse 316, 66740 Saarlouis, Germany
office: +49-681-302-5078 priv: +49-6831-69484 or -964570
email: wi...@dfki.de <URL>: http://www.dfki.de/~wirth/
--------------------------------------------------------
Einen UND-Operator kenne ich in REs nicht.
Aber man kann -e RE -e RE -e RE schreiben, ob das UND
ist, weiß ich im Moment nicht.
Ich denke, da mußt Du schon einen richtigen Algo
programmieren.
Aber nicht einfach 'nach' oder so, denn 'demnach' würde
ja auch passen ...
--
Mit freundlichen Grüßen
Helmut Schellong po...@schellong.de po...@schellong.com
http://www.schellong.de http://www.schellong.com
http://home.t-online.de/home/schellong sche...@t-online.de
> Ich möchte es erreichen, daß wenn in einer Datei ein
> 'von' und ein 'nach' stehen, der grep mir die Datei ausgibt.
Nicht elegant, sollte aber funktionieren:
grep -l von * | xargs grep -l nach
> Gruß
> Knut
.. Robert
und wieso nicht
grep von * | grep nach
Bis auf das "nach" nicht im Dateinamen vorkommen sollte, sonst
matcht alles auf von dieser datei, geht das.
Juergen
--
J...@lrz.fh-muenchen.de - "This World is about to be Destroyed!"
> Aber man kann -e RE -e RE -e RE schreiben, ob das UND
> ist, weiß ich im Moment nicht.
Nein, es entspricht »Oder«.
Grüße,
Gunnar
> GNU grep hat eine quiet option -q, dann gehts auch so:
»-q« ist POSIX.2, nur im traditionellen »grep« nicht enthalten.
> Analog haben egrep und fgrep die silent option -s.
Nein, »-s« bewirkt nur die Unterdrückung von Fehlermeldungen. Das
Verhalten von v7 und älteren BSDs in diesem Fall ist Geschichte,
standardisiert ist die System V-Semantik.
Grüße,
Gunnar
Die Dateinameninformation geht aber flöten ...
Eben nicht.
Sie landen im Input des 2. grep, darum kann es auch zu fehlerhaften
matches fuehren, wenn das muster "nach" teil des Dateinamens ist.
Wo?
>>> grep von * <<<
liefert Dateinamen?!
grep -l ... liefert generell Dateinamen - nur die Namen.
grep ... liefert nur bei *mehreren* Dateiargs die Namen,
und das dann gemeinsam an allen Inhaltszeilen.
grep -h ... unterdrueckt dies.
> Robert Lange <robert...@gmx.net> wrote:
>> grep -l von * | xargs grep -l nach
> und wieso nicht
> grep von * | grep nach
Funktioniert nur, wenn "von" und "nach" in derselben Zeile
vorkommen. Außerdem könnten einige Dateien mehrfach aufgelistet
werden.
> Juergen
.. Robert
Dreimal darfst du raten was grep beim Aufruf 'grep bla *' zu sehen
bekommt.
> grep -h ... unterdrueckt dies.
bye Gerhard
--
Hi! I'm a .signature *virus*! Copy me into your ~/.signature to help me spread!
Du (urs) meintest am 31.07.01 zum Thema Re: Und-Verknuepfung mit grep:
> es waer nicht noetig gewesen _uns_ hier die manpage von grep
> nochmal verstuemmelt vorzukauen, _wir_ kennen sie.
Du bist eine multiple Persoenlichkeit?
Viele Gruesse!
Helmut
Obwohl er mehrfach vorhanden ist (12 Augen sehen mehr als 2)
hat er nicht geschnallt, daß ich zu denjenigen gehöre, die
den Quellkode eines grep mit regexp und vieler anderer
Kommandos entwickelt haben und somit ganz selbstverständlich
die manpage kennen...
Einige andere Dinge hat er ebenfalls übersehen.
> hat er nicht geschnallt, daß ich zu denjenigen gehöre, die
> den Quellkode eines grep mit regexp und vieler anderer
> Kommandos entwickelt haben und somit ganz selbstverständlich
> die manpage kennen...
Das konnte man in <3B669FB1...@t-online.de> bestens sehen.
Grüße,
Gunnar
Ich darf darauf aufmerksam machen, daß KEINE man-Page,
die ich kenne, über die Semantik mehrerer -e expr
aufklärt!
Da steht drin:
"Mehrere -e Optionen sind erlaubt." --Punkt.
"Bei mehreren -e Optionen werden alle diese verwendet." --Punkt.
Folglich KENNE ich die manpage sehr wohl.
Da ich mehrere -e... selbst noch nie konkret programmiert habe,
hatte ich seriöserweise gesagt, daß ich nicht weiß, ob
die UND-verknüpft sind.
Mir zu unterstellen, ich kennte die grep-manpage nicht,
macht mich unglücklich und pH-sauer.
> Ich darf darauf aufmerksam machen, daß KEINE man-Page,
> die ich kenne, über die Semantik mehrerer -e expr
> aufklärt!
Offenbar kannst Du nicht richtig lesen. Die UnixWare 7-Manualpage z.B.,
datiert »30 January 1998«, enthält ganz zu Anfang der »Description« den
folgenden Satz: »grep and egrep search files for patterns and print all
lines that contain a match to at least one of the patterns (in
expression and exprfile)«.
Für jemanden, der selbst programmiert, gibt es aber ohnehin nur eine
gültige Quelle: den Standard. ISO/IEC 9945-2:1993, 4.28.2, p. 295:
# The grep utility shall search the input files, selecting lines
# matching one or more patterns; the types of patterns shall be
# controlled by the options specified. The patterns are specified
# by the -e option, -f option, or the pattern_list operand. [...]
# By default, an input line shall be selected if any pattern,
# treated as an entire BRE [...] matches any part of the line [...]
4.28.3, p. 296:
# -e pattern_list
# Specify one or more patterns to be used during the search for input.
# [...] In the nonobsolescent forms, multiple -e and -f options shall
# be accepted by the grep utility. All of the specified patterns shall
# be used when matching lines, but the order of evaluation is unspecified.
Und wieder einmal sehen wir, daß man Dich als Entwickler einfach
nicht ernst nehmen kann.
> Da steht drin:
> "Mehrere -e Optionen sind erlaubt." --Punkt.
> "Bei mehreren -e Optionen werden alle diese verwendet." --Punkt.
Du »liest« deutsche Manualpages? Naja, bei Dir wundert mich sowieso
nichts mehr.
Grüße,
Gunnar
>> Ich darf darauf aufmerksam machen, daß KEINE man-Page,
>> die ich kenne, über die Semantik mehrerer -e expr
>> aufklärt!
In meiner HP-UX 10.20 man-page zu grep steht folgendes:
-e expression
Same as a simple expression argument, but useful
when the expression begins with a hyphen (-).
Multiple -e options can be used to specify multiple
patterns; an input line is selected if it matches
any of the specified patterns.
Die man-page von GNU grep hält sich da aber z.B. in der Tat sehr
bedeckt. Jedenfalls habe ich da auf die Schnelle nichts zu
multiplen -e Optionen finden können.
Beste Grüsse - Jürgen.
ist hier z.B. gar nicht beschrieben.
> Die man-page von GNU grep hält sich da aber z.B. in der Tat sehr
> bedeckt. Jedenfalls habe ich da auf die Schnelle nichts zu
> multiplen -e Optionen finden können.
Zum Beispiel.
Manche greps können grundsätzlich nur ein expr verarbeiten.
Das bezieht sich -exakt betrachtet- darauf, daß
expression == expr\nexpr\nexpr\nexpr
sein darf.
-e expression
Specify one or more patterns (regular expressions or strings)
to be used during the search for input. The patterns in
expression are separated by newline characters. Two adjacent
newlines indicate a null pattern. The last pattern does not
require a terminating newline. When multiple -e or -f options
are specified, all the patterns specified will be used.
Mehrere '-e expr' '-e expr' ...
können eine ganz andere Bedeutung haben.
(Ich persönlich würde so OR und AND realisieren.
Man denke an die find-Syntax -type -name ..., die verundet!)
Diese man-Page ist diesbez. schwammig und verunsichernd formuliert.
Ich würde hier erst probieren, bevor ich eine Aussage wagte.
OpenServer:
-----------
grep [ -E | -F ] [ -c | -l | -q ] [ -bhinsvxy ] [ -e expression ] [ -f
Commands of the grep family search the input files (or standard input if no
file argument is specified) for lines matching a pattern. Normally, each
matching line is copied to the standard output. If more than one file is
being searched, the name of the file in which each match occurs is also
written to the standard output along with the matching line (unless the -h
option is used, see below).
-e expression
Specify patterns to be used during the search. The patterns in the
list must be separated by a newline character. Multiple -e and -f
options are accepted. Unless the -E or -F options are specified,
grep treats the patterns as basic regular expressions.
Diese Page ist noch schlimmer.
> Für jemanden, der selbst programmiert, gibt es aber ohnehin nur eine
> gültige Quelle: den Standard. ISO/IEC 9945-2:1993, 4.28.2, p. 295:
Den hab ich nicht zur Verfügung, und werde ihn wohl nicht so
schnell oder sogar nie zur Verfügung haben.
Download-Drafts sind nämlich offenbar verschwunden...
>> Für jemanden, der selbst programmiert, gibt es aber ohnehin nur eine
>> gültige Quelle: den Standard. ISO/IEC 9945-2:1993, 4.28.2, p. 295:
>
> Den hab ich nicht zur Verfügung,
Was geht mich das an? Wenn Du nur minderwertige SCO-Dokumentation
verwendest, ist das Dein Problem.
Grüße,
Gunnar
> Manche greps können grundsätzlich nur ein expr verarbeiten.
Welche?
Beste Grüsse - Jürgen
Diejenigen auf etwas älteren Unices.
Genaugenommen (jedenfalls fast):
grep -l -e 'von.*nach\|nach.*von' *
Krümelkackend:
grep -l -e 'von.*nach\|nach.*von\|vonach' *
Wenn "von" immer vor "nach" steht (erscheint mir logisch), reicht auch
grep -l -e 'von.*nach' *
Gruß
Andreas
--
Those who desire to give up Freedom in order to gain Security,
will not have, nor do they deserve, either one. (T. Jefferson)
for i in * ; do
cat $i | tr -d "\n" | grep -q -e 'von.*nach\|nach.*von' && echo $i
done
In der "Krümelkackerversion" muß man tr -d "\n" durch tr "\n" " "
ersetzen, sonst matcht fälschlicherweise auch
vo
nach
Für den praktischen Einsatz sollten um "von" und "nach" Whitespaces
verlangt werden, damit es weniger "Fehltreffer" gibt. Auch dann ist
tr -d wieder ungeeignet.
> Andreas Riedel schrieb:
>> Knut Rauscher schrieb:
>>> grep -l 'von\|nach' *
>> grep -l -e 'von.*nach\|nach.*von' *
>
> cat $i | tr -d "\n" | grep -q -e 'von.*nach\|nach.*von' && echo $i
So oft Ihr »a\|b« auch postet, es ist und bleibt eine proprietäre
GNU-RE, die man tunlichst nicht benutzen sollte. Zweimal »-e« ist
zwar nicht perfekt, aber immerhin standardisiert. Die portabelste
Lösung dürfte
[...] | egrep 'von.*nach|nach.*von' >/dev/null && echo $i
sein.
Grüße,
Gunnar