View previous topic :: View next topic |
Author |
Message |
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Nov 17, 2007 2:52 pm Post subject: [Suche] Hilfe beim sed Befehl |
|
|
Hallo Zusammen,
Wie kann kann man mit sed in enen Shellscript feststellen, ob z.B. in der Datei: /var/beispiele/test.txt die Zeile : Dieses ist ein Beispieltext vorhanden ist oder nicht?
Ich habe mich auch auch schon hier umgesehen, aber irgendwie komme ich da nicht weiter...
Ich bin über jeden Tipp dankbar. |
|
Back to top |
|
|
franzf Advocate
Joined: 29 Mar 2005 Posts: 4565
|
Posted: Sat Nov 17, 2007 3:04 pm Post subject: |
|
|
Reicht dir denn da nicht grep?
Code: | $ grep EE /var/log/Xorg.0.log
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(II) Loading extension MIT-SCREEN-SAVER
$ echo $?
0
$ grep EEEE /var/log/Xorg.0.log
$ echo $?
1 |
|
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Nov 17, 2007 3:29 pm Post subject: |
|
|
hmmm....,
pinzipiell ist es völlig egal, mit welchem Befehl ich das abfrage....
Ich dachte da mehr an so etwas:
Code: | if [ xxx ] ;then
echo "Eintrag vohanden"
else
echo "Eintrag nicht vohanden"
fi |
Wobei ich eben bei xxx hänge.. |
|
Back to top |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3366 Location: de
|
Posted: Sat Nov 17, 2007 3:56 pm Post subject: |
|
|
An die Stelle von xxx schreibst du halt das grep rein. Problematisch wird das, wenn Dein Beispielsatz Sonderzeichen enthält.
Falls Dir grep nicht sympathisch ist, kannst du Zeichen(ketten) auch mit sed suchen lassen. |
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Sat Nov 17, 2007 4:01 pm Post subject: |
|
|
wenn ich mich nicht irre... :
Code: | if [ $(sed -n '/Dieses\ ist\ ein\ Beispieltext/p' /var/beispiele/test.txt | wc -l) -gt 0]; then
#mach was
else
#mach was anderes
fi |
oder halt
Code: | if [ $(grep 'Dieses ist ein Beispieltext' /var/beispiele/test.txt | wc -l) -gt 0]; then
#mach was
else
#mach was anderes
fi |
_________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Nov 17, 2007 6:16 pm Post subject: |
|
|
ich bekomme bei beiden Varianten von return13 folgende Fehlermeldung:
Code: | /usr/local/src/test.sh: line 3: [: missing `]' |
Was kann das sein? |
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Sat Nov 17, 2007 6:29 pm Post subject: |
|
|
schreib mal gerade was du getippt hast, damit ich dir sagen kann was falsch ist... _________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Nov 17, 2007 6:46 pm Post subject: |
|
|
return13 wrote: | schreib mal gerade was du getippt hast, damit ich dir sagen kann was falsch ist... |
Code: | #!/bin/sh
if [ $(grep "test der erste" /var/beispiele/test.txt | wc -l) -gt 0]; then
echo "testaugabe 1"
else
echo "testaugabe 2"
fi
exit
|
bzw:
Code: | #!/bin/sh
if [ $(sed -n '/test\ der\ erste /p' /var/beispiele/test.txt | wc -l) -gt 0]; then
echo "testaugabe 1"
else
echo "testaugabe 2"
fi
exit
|
|
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Sat Nov 17, 2007 7:03 pm Post subject: |
|
|
ich hab zwar herausgefunden wo der Fehler liegt, aber nicht warum.... - Hab einfach mal die Werte getauscht und es funktioniert...
Code: |
#!/bin/sh
if [ 0 -lt $(grep "test der erste" /var/beispiele/test.txt | wc -l) ]; then
echo "testaugabe 1"
else
echo "testaugabe 2"
fi
|
_________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
franzf Advocate
Joined: 29 Mar 2005 Posts: 4565
|
Posted: Sat Nov 17, 2007 7:06 pm Post subject: |
|
|
Es ist das fehlende Leerzeichen vor der schließenden eckigen Klammer... |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Nov 17, 2007 7:12 pm Post subject: |
|
|
Juhu,
jetzt gehts.
1000 Dank
franzf wrote: | Es ist das fehlende Leerzeichen vor der schließenden eckigen Klammer... |
Wusste gar nicht, dass Leerzeichen in der eckigen Klammer notwendig sind. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Sun Nov 18, 2007 12:17 pm Post subject: |
|
|
3PO wrote: | Juhu,
jetzt gehts.
1000 Dank
franzf wrote: | Es ist das fehlende Leerzeichen vor der schließenden eckigen Klammer... |
Wusste gar nicht, dass Leerzeichen in der eckigen Klammer notwendig sind. |
[ ] sind nur Teile von dem Kommando "test".
Und die Bash versteht es nunmal nicht, wenn du zwei Kommandos direkt aneinanderhängst.
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Sun Nov 18, 2007 1:18 pm Post subject: |
|
|
return13 wrote: | Code: | if [ $(grep "test der erste" /var/beispiele/test.txt | wc -l) -gt 0]; then |
Code: | if [ 0 -lt $(grep "test der erste" /var/beispiele/test.txt | wc -l) ]; then |
|
Was soll dieser Unsinn?
Code: | if grep -q "test der erste" /var/beispiele/test.txt; then |
|
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sun Nov 18, 2007 1:31 pm Post subject: |
|
|
mv wrote: | return13 wrote: | Code: | if [ $(grep "test der erste" /var/beispiele/test.txt | wc -l) -gt 0]; then |
Code: | if [ 0 -lt $(grep "test der erste" /var/beispiele/test.txt | wc -l) ]; then |
|
Was soll dieser Unsinn?
Code: | if grep -q "test der erste" /var/beispiele/test.txt; then |
|
Anscheinend führen mehrere Wege ans Ziel.
btw: Was macht denn grep -q??
In man steht nichts darüber.
Code: | vdr01 ~ # man grep
-Anzahl
gibt Anzahl Zeilen Kontext vor und nach jeder gefundenden Zeile aus
-V gibt die Versionsnummer auf die Standardfehlerausgabe
-b gibt die Position jeder gefundenen Stelle mit aus
-c gibt nur die Gesamtzahl der gefundenen Stellen aus
-e Ausdruck
sucht nach Ausdruck
-f Datei
Datei enthalt die Ausdrucke, nach denen gesucht werden soll.
-h unterdruckt die Dateinamen vor jeder Fundstelle
-i ignoriert GroB und Kleinschreibung
-l gibt nur die Dateinamen mit Fundstellen aus
-n gibt die Zeilennummer zu jeder Fundstelle aus
-s (silent) keine Ausgabe auBer Fehlermeldungen
-v gibt nur Zeilen aus, die den Ausdruck nicht enthalten
-w gibt nur Zeilen aus, in denen der Ausdruck als komplettes Wort vorkommt
-x gibt nur Zeilen aus, die den Ausdruck als ganze Zeile enthalten
BEISPIEL
Mit dem Kommando
grep '\( .... \).+\1' Handbuch.tex
wird in der Datei Handbuch.tex nach Zeilen gesucht, in denen ein Wort mit vier Buchstaben doppelt, aber nicht unmittel-
bar nach dem ersten vorkommt.
SIEHE AUCH
egrep(1) und das LunetIX Linuxhandbuch
AUTOR
Mike Haertel, James A. Woods und David Olson
|
|
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Sun Nov 18, 2007 1:55 pm Post subject: |
|
|
3PO wrote: | Anscheinend führen mehrere Wege ans Ziel. |
Deswegen gibt es ja die useless use of cat awards u.ä. - Du hast nicht nur einen useless use of test, sondern auch noch einen useless use of pipe, wc and redirection award gewonnen
Quote: | btw: Was macht denn grep -q?? |
...alles schneller, indem es die Ausgabe unterdrückt und nach dem ersten Match abbricht. Ohne die Option hätte man
Code: | if grep "test der erste" /var/beispiele/test.txt >/dev/null; then |
gebraucht.
Quote: | In man steht nichts darüber. |
Die deutschen man-pages sind also nicht nur hoffnungslos veraltet, sondern enthalten nicht einmal die Standard-Optionen. Die echte manpage Code: | LC_ALL=posix man grep | oder - besser - die allgemeingültigere posix-manpage dürfte die Frage beantworten. |
|
Back to top |
|
|
return13 Guru
Joined: 02 Feb 2004 Posts: 513 Location: Hamburg - Germany
|
Posted: Sun Nov 18, 2007 3:57 pm Post subject: |
|
|
man lernt doch immer dazu... _________________ Wer Recht erkennen will, muß zuvor in richtiger Weise gezweifelt haben.
Aristoteles (384-322), griech. Philosoph, Begründer d. abendländ. Philosophie |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sun Nov 18, 2007 5:09 pm Post subject: |
|
|
@ mv,
danke für die wirklich mehr als sehr ausführliche Antwort.
btw: mit grep --help hätte man es auch finden können:
Code: | vdr01 ~ # grep --help
Aufruf: grep [OPTION]... MUSTER [DATEI] ...
Suche nach MUSTER in jeder DATEI oder der Standardeingabe.
Beispiel: grep -i 'Hallo Welt' menu.h main.c
Auswahl und Interpretation regulärer Ausdrücke:
-E, --extended-regexp MUSTER ist ein erweiterter regulärer Ausdruck.
-F, --fixed-strings MUSTER ist eine Menge Newline-getrennter
Zeichenketten.
-G, --basic-regexp MUSTER ist ein regulärer Standardausdruck.
-P, --perl-regexp MUSTER ist ein regulärer Ausdruck,
wie Perl ihn akzeptiert.
-e, --regexp=MUSTER MUSTER als regulären Ausdruck verwenden.
-f, --file=FILE MUSTER aus DATEI lesen.
-i, --ignore-case Unterschied zwischen Groß- und Kleinschreibung
ignorieren.
-w, --word-regexp MUSTER paßt nur auf ganze Wörter.
-x, --line-regexp MUSTER paßt nur auf ganze Zeilen.
-z, --null-data Eine Zeile endet mit Nullbyte, nicht Newline.
Verschiedenes:
-s, --no-messages Fehlermeldungen unterdrücken.
-v, --revert-match Nicht-passende Zeilen anzeigen.
-V, --version Versionsnummer ausgeben und beenden.
--help Diese Hilfe ausgeben und beenden.
--mmap Wenn möglich, Eingabe in den Speicher mappen.
Ausgabekontrolle:
-m, --max-count=ZAHL Nach ZAHL Übereinstimmungen abbrechen.
-b, --byte-offset Byte-Offset anzeigen.
-n, --line-number Zeilennummer anzeigen.
--line-buffered Jede Zeile einzeln (ungepuffert) ausgeben.
-H, --with-filename Dateinamen bei jeder Übereinstimmung anzeigen.
-h, --no-filename Dateinamen nicht anzeigen.
--label=TEXT TEXT als Dateiname für Standardeingabe ausgeben.
-o, --only-matching Nur den Teil der Zeile anzeigen, die mit MUSTER
übereinstimmt.
-q, --quiet, --silent Alle normalen Ausgaben unterdrücken.
--binary-files=TYP Binärdateien als TYP annehmen. TYP kann
»binary«, »text« oder »without-match« sein.
-a, --text Entspricht --binary-files=text.
-I Entspricht --binary-files=without-match.
-d, --directories=AKTION Verarbeitung von Verzeichnissen festlegen.
AKTION ist 'read', 'recurse', oder 'skip'.
-D, --devices=AKTION Verarbeitung von Gerätedateien, FIFOs und
Sockets festlegt. AKTION ist »read« oder »write«.
-R, -r, --recursive Äquivalent zu --directories=recurse.
--include=MUSTER Dateien untersuchen, die auf MUSTER passen.
--exclude=MUSTER Dateien überspringen, die auf MUSTER passen.
--exclude-from=DATEI Dateien überspringen, die auf ein Muster
in DATEI passen.
-L, --files-without-match Nur Namen von Dateien ausgeben, die keine
Übereinstimmung enthalten.
-l, --files-with-matches Nur Dateinamen mit Übereinstimmungen ausgeben.
-c, --count Nur Zahl der passenden Zeilen pro Datei ausgeben.
-Z, --null Null-Byte nach jedem Dateinamen ausgeben.
Kontextkontrolle:
-B, --before-context=ZAHL ZAHL Zeilen von vorausgehendem Kontext anzeigen.
-A, --after-context=ZAHL ZAHL Zeilen von folgendem Kontext anzeigen.
-C, --context=ZAHL ZAHL Zeilen Kontext anzeigen,
-ZAHL Wie --context=ZAHL.
--color[=WENN],
--colour=[WENN] Passende Textfragmente markieren.
WENN kann »always«, »never« oder »auto« sein.
-U, --binary CR-Zeichen am Zeilenende belassen (MSDOS).
-u, --unix-byte-offsets Offsets ausgeben, als fehlten CR-Zeichen (MSDOS).
»egrep« bedeutet »grep -E«. »fgrep« bedeutet »grep -F«.
Wenn DATEI fehlt oder »-« ist, wird die Standardeingabe gelesen.
Weniger als zwei DATEIen implizieren -h. Status ist 0 bei
Übereinstimmungen, 1 ohne, 2 bei Problemen.
Fehlerberichte bitte an <bug-grep@gnu.org>.
vdr01 ~ #
|
|
|
Back to top |
|
|
STiGMaTa_ch Veteran
Joined: 28 Dec 2004 Posts: 1686 Location: Rüti ZH / Schweiz
|
Posted: Tue Nov 20, 2007 4:28 pm Post subject: |
|
|
mv wrote: | Was soll dieser Unsinn?
Code: | if grep -q "test der erste" /var/beispiele/test.txt; then |
|
Warum nicht ganz übersichtlich?
Code: | [ ! "`grep 'Das was ich suche' /var/beispiel/test.txt`" = "" ] && echo "Was ich suche ist vorhanden" |
Will man wirklich noch ein "nicht vorhanden ausgeben hängt man halt ein || drann...
Code: | [ ! "`grep 'Das was ich suche' /var/beispiel/test.txt`" = "" ] && echo "Was ich suche ist vorhanden" || echo "leider nicht gefunden" |
Lieber Gruss
STiGMaTa _________________ Ich bin Schuldknappe. Das bedeutet ich bin immer an allem Schuld. Und das nicht zu knapp! | Der alltägliche Familienwahnsinn auf meinem BLOG |
|
Back to top |
|
|
|