ubuntuusers.de

Verständnisfrage zu grep

Status: Gelöst | Ubuntu-Version: Lubuntu 18.04 (Bionic Beaver)
Antworten |

Rosika

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo zusammen,

kann mir jemand bzgl. einer bestimmten Aufgabenstellung helfen? Anscheinend habe ich grep noch nicht komplett begriffen.

Ich wollte folgendes tun:

die man-pages von "clamscan" in eine Datei (veränderlich2.txt) schreiben (zur späteren Referenz) und gleichzeitig auf dem Terminal alle Fundstellen anzeigen, die mit "-r" oder"-R" beginnen.

Ich habe fish als default shell.

Dafür verwendete ich folgenden Befehl, welcher aber falsch war:

man clamscan > veränderlich2.txt; and grep -i "-r" veränderlich2.txt # "; and" entspricht "&&" in bash

Hier die verkürzte Ausgabe:

Übereinstimmungen in Binärdatei .local/share/gvfs-metadata/home
.local/share/fish/fish_history:- cmd: ls -l /lib/udev/rules.d/ > veränderlich2.txt 
.local/share/fish/fish_history:- cmd: man byobu > veränderlich2.txt 
.local/share/fish/fish_history:- cmd: apt list --upgradable> veränderlich2.txt 
.local/share/fish/fish_history:- cmd: man playonlinux>veränderlich2.txt 
.local/share/fish/fish_history:- cmd: ubuntu-support-status --show-unsupported > veränderlich2.txt 
.local/share/fish/fish_history:- cmd: locate gcal > veränderlich2.txt 
.local/share/fish/fish_history:- cmd: locate okular>> veränderlich2.txt 
.local/share/fish/fish_history:- cmd: cat /var/log/syslog.1> veränderlich2.txt 
[...]
grep: .cache/dconf: Keine Berechtigung
^C⏎                                                                                                                                                                                                              rosika@rosika-Lenovo-H520e ~> 

rosika@rosika-Lenovo-H520e ~> echo $status
130

Kann mir jemand erklären, was der Befehl nun genau gemacht hat?

Meine Vermutung ist die:

-r ist ja auch ein Optionsschalter von grep:

-R -r --recursive liest alle Dateien unter jedem Verzeichnis rekursiv.

Da ich den Befehl aus meinem Home-Verzeichnis heraus gestartet habe, nimmt grep dieses als Startpunkt und liest alle Dateien in allen Unterverzeichnissen. Es wird nach dem Kriterium "veränderlich.txt" gesucht, anstatt dies als die Datei, in der er suchen soll, zu nehmen.

In .local/share/fish/fish_history befindet sich meine fish-history, und es werden alle Einträge mit "veränderlich.txt" aufgelistet.

Den Befehl habe ich händisch nach einer Weile gestoppt, da ein Ende nicht gleich abzusehen war; daher Exit-Code 130 (denke ich).

Falls meine Erklärung stimmt, ist mir eins noch nicht klar:

Ich dachte, wenn ich "-r" in Anführungszeichen setze, wird es nicht als Optionsschalter gesehen, sondern als Suchkriterium. Anscheinend falsch.

Den für meine Zwecke richtigen Befehl habe ich dann so gestaltet:

man clamscan > veränderlich2.txt; and grep -i "\-r" veränderlich2.txt


       -o, --suppress-ok-results
       -r, --recursive
       --remove[=yes/no(*)]
       --max-recursion=#n
       --max-dir-recursion=#n
       --max-rechwp3=#n
       --pcre-recmatch-limit=#n
              clamscan -r /home
              clamscan -d /tmp/newclamdb -r /tmp
              clamscan -r /var/spool/mail
rosika@rosika-Lenovo-H520e ~> echo $status
0

So hat´s funktioniert.

Was meint ihr; ist meine Erklärung richtig? Und warum haben die Anführungszeichen nicht wie gewollt funktioniert?

Vielen Dank im voraus.

LG. Rosika ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Rosika schrieb:

die man-pages von "clamscan" in eine Datei (veränderlich2.txt) schreiben (zur späteren Referenz) und gleichzeitig auf dem Terminal alle Fundstellen anzeigen, die mit "-r" oder"-R" beginnen.

Ich habe fish als default shell.

Oh, die kenne ich nicht. Wenn es also deshalb ein Problem gibt, müssen wir auf einen fish-User warten.

man clamscan > veränderlich2.txt; and grep -i "-r" veränderlich2.txt # "; and" entspricht "&&" in bash

Das Problem ist, dass Du nach "-r" suchen willst, das aber auch eine gültige grep-Option ist. Damit sucht grep nämlich in allen Dateien eines Verzeichnisbaums. Damit wird "veränderlich2.txt" zum Suchmuster und da keine weiteren Argumente folgen, sucht grep im aktuellen Verzeichnis und allen Unterverzeichnissen. Du musst dem "-r" ein "-e" voranstellen. Also

1
grep -i -e -r veränderlich2.txt

Kann mir jemand erklären, was der Befehl nun genau gemacht hat?

s.o.

-r ist ja auch ein Optionsschalter von grep:

-R -r --recursive liest alle Dateien unter jedem Verzeichnis rekursiv.

Da ich den Befehl aus meinem Home-Verzeichnis heraus gestartet habe, nimmt grep dieses als Startpunkt und liest alle Dateien in allen Unterverzeichnissen. Es wird nach dem Kriterium "veränderlich.txt" gesucht, anstatt dies als die Datei, in der er suchen soll, zu nehmen.

Exakt.

Falls meine Erklärung stimmt, ist mir eins noch nicht klar:

Ich dachte, wenn ich "-r" in Anführungszeichen setze, wird es nicht als Optionsschalter gesehen, sondern als Suchkriterium. Anscheinend falsch.

Ja, die Quotes bestimmen nur, welche Expansion die Shell darauf macht. In diesem Fall machen die Quotes überhaupt keinen Unterschied - wie Du sehen kannst, kommt beim aufgerufenen Programm in beiden Fällen exakt dasselbe an:

1
2
3
4
5
6
$ args.sh -r
arg count: 1
arg[1]: '-r'
$ args.sh "-r"
arg count: 1
arg[1]: '-r'

Den für meine Zwecke richtigen Befehl habe ich dann so gestaltet:

man clamscan > veränderlich2.txt; and grep -i "\-r" veränderlich2.txt

So hat´s funktioniert.

Das funktioniert zwar, ist aber nicht "richtig": Zufällig klappt das hier, weil durch den Backslash das Argument nicht mehr mit einem Minuszeichen beginnt und somit von grep nicht mehr als Option erkannt wird. Außerdem hilft Dir, dass "\-" für grep kein Sonderzeichen ist und damit der Backslash einfach unter den Tisch fällt. Die richtige Lösung ist die mit dem "-e", weil sie verlässlicher funktioniert.

Was meint ihr; ist meine Erklärung richtig? Und warum haben die Anführungszeichen nicht wie gewollt funktioniert?

s.o.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9627

Wohnort: Münster

Rosika schrieb:

[…] ist meine Erklärung richtig?

Ja.

Und warum haben die Anführungszeichen nicht wie gewollt funktioniert?

Quotieren (z.B. mit Anführungszeichen) schützt ein Sonderzeichen (hier: „-“) vor der nicht gewünschten Interpretation durch die Shell. Damit erhält das aufgerufenen Programm (hier: grep) die Zeichenfolge als nicht quotiertes Literal. Damit ist aber die Quotierung erschöpft. Wenn nun das Programm das Zeichen „-“ ebenfalls als Sonderzeichen interpretiert (Wie grep und viele andere Programme es nun mal machen.), geht es auf dieser Ebene schief.

Die richtige Vorgehensweise ist die doppelte Quotierung, so wie Du es ja auch gemacht hast.

Alternativ kann man auch das Suchmuster für grep als solches markieren. Dies sollte funktionieren:

man clamscan | tee veränderlich2.txt | grep -i -e "-r" 

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

@rklm:

Hallo und allerherzlichsten Dank für Eure Antworten,

[fish shell] Oh, die kenne ich nicht. Wenn es also deshalb ein Problem gibt, müssen wir auf einen fish-User warten.

Keine Sorge, das hat mit der shell nichts zu tun. Wie gesagt, bei bash würde mit "&&" dasselbe Ergebnis herauskommen.

Ja, die Quotes bestimmen nur, welche Expansion die Shell darauf macht. In diesem Fall machen die Quotes überhaupt keinen Unterschied

Ah, so ist das.

Zufällig klappt das hier, weil durch den Backslash das Argument nicht mehr mit einem Minuszeichen beginnt und somit von grep nicht mehr als Option erkannt wird Die richtige Lösung ist die mit dem "-e", weil sie verlässlicher funktioniert.

Ja, ich verstehe. Danke. Hab´s auch gleich ausprobiert. Klappt verläßlich.

Da hab´ ich wieder etwas dazugelernt, was auch meine Absicht war. Deshalb frug ich hier nach.

Nochmals vielen Dank für Deine Hilfe. War echt klasse. 👍

LG. Rosika ☺

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

@kB:

Herzlichen Dank auch Dir für Deine Hilfe.

Quotieren (z.B. mit Anführungszeichen) schützt ein Sonderzeichen (hier: „-“) vor der nicht gewünschten Interpretation durch die Shell

Ja, das war meine Fehleinschätzung hier.

man clamscan | tee veränderlich2.txt | grep -i -e "-r" 

Ja, das ist elegant. Schade, daß ich nicht darauf gekommen bin.

Immerhin bin ich schon froh, daß ich mit meiner Einschätzung des Sachverhalts (also was da ablief) einigermaßen richtig lag.

Nochmals vielen Dank und LG. Rosika ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Rosika schrieb:

@kB:

Quotieren (z.B. mit Anführungszeichen) schützt ein Sonderzeichen (hier: „-“) vor der nicht gewünschten Interpretation durch die Shell

Ja, das war meine Fehleinschätzung hier.

man clamscan | tee veränderlich2.txt | grep -i -e "-r" 

Ja, das ist elegant. Schade, daß ich nicht darauf gekommen bin.

Aber es muss ganz klar sein: das Quoting ist in diesem Fall überflüssig. Das löst Dein Problem nicht, weil es gar nichts daran ändert, was grep als Kommandozeilenargumente übergeben bekommt.

Immerhin bin ich schon froh, daß ich mit meiner Einschätzung des Sachverhalts (also was da ablief) einigermaßen richtig lag.

Nicht nur einigermaßen. Das passt genau.

Nochmals vielen Dank und LG.

Bitte!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Oh, wir sind noch nicht fertig!

Viele Kommandos in der Shell interpretieren ein Doppelminus als Ende-der-Optionen-Marker, daher funktioniert auch:

1
grep -i -- -r veränderlich2.txt

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

@user_unknown:

Hi und vielen Dank für die Ergänzung.

Wow. Davon hatte ich bislang noch nicht gehört. Funktioniert einwandfrei.

Das hat mich jetzt so sehr interessiert, daß ich gleich mal weitergeforscht habe und bei https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean fündig geworden bin.

Toll, daß Du so etwas weißt. Mein Kompliment. 👍

Da habe ich erneut etwas dazugelernt. Bin auch sicher, daß ich das Doppelminus in Zukunft häufiger anwenden werde.

Nochmals herzlichen Dank und viele Grüße. Rosika ☺

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

@rklm:

man clamscan | tee veränderlich2.txt | grep -i -e "-r" 

Aber es muss ganz klar sein: das Quoting ist in diesem Fall überflüssig. Das löst Dein Problem nicht, weil es gar nichts daran ändert, was grep als Kommandozeilenargumente übergeben bekommt.

Ja, verstehe. Danke nochmals für die Aufklärung.

LG. Rosika

Antworten |