# [Suche] Hilfe beim sed Befehl

## 3PO

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.   :Very Happy: 

----------

## franzf

Reicht dir denn da nicht grep?

```
$ 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
```

----------

## 3PO

hmmm....,

pinzipiell ist es völlig egal, mit welchem Befehl ich das abfrage....

Ich dachte da mehr an so etwas:

```
if [ xxx ] ;then

    echo "Eintrag vohanden"

    else

    echo "Eintrag nicht vohanden"

fi
```

Wobei ich eben bei xxx hänge..

----------

## musv

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.

----------

## return13

wenn ich mich nicht irre... : 

```
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 

```
if [ $(grep 'Dieses ist ein Beispieltext'  /var/beispiele/test.txt  | wc -l) -gt 0]; then

      #mach was

else

      #mach was anderes

fi
```

----------

## 3PO

ich bekomme bei beiden Varianten von return13 folgende Fehlermeldung:

```
/usr/local/src/test.sh: line 3: [: missing `]'
```

Was kann das sein?

----------

## return13

schreib mal gerade was du getippt hast, damit ich dir sagen kann was falsch ist...

----------

## 3PO

 *return13 wrote:*   

> schreib mal gerade was du getippt hast, damit ich dir sagen kann was falsch ist...

 

```
#!/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:

```
#!/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

```

----------

## return13

ich hab zwar herausgefunden wo der Fehler liegt, aber nicht warum.... - Hab einfach mal die Werte getauscht und es funktioniert...

```

 #!/bin/sh

  

 if [ 0 -lt $(grep "test der erste"  /var/beispiele/test.txt | wc -l) ]; then

    echo "testaugabe 1"

 else

       echo "testaugabe 2"

 fi

```

----------

## franzf

Es ist das fehlende Leerzeichen vor der schließenden eckigen Klammer...

----------

## 3PO

Juhu,

jetzt gehts.

1000 Dank   :Laughing:   :Wink: 

 *franzf wrote:*   

> Es ist das fehlende Leerzeichen vor der schließenden eckigen Klammer...

 

 :Arrow:  Wusste gar nicht, dass Leerzeichen in der eckigen Klammer notwendig sind.   :Idea: 

----------

## Finswimmer

 *3PO wrote:*   

> Juhu,
> 
> jetzt gehts.
> 
> 1000 Dank   
> ...

 

[ ] sind nur Teile von dem Kommando "test".

Und die Bash versteht es nunmal nicht, wenn du zwei Kommandos direkt aneinanderhängst.

Tobi

----------

## mv

 *return13 wrote:*   

> 
> 
> ```
> if [ $(grep "test der erste"  /var/beispiele/test.txt | wc -l) -gt 0]; then
> ```
> ...

 

Was soll dieser Unsinn?

```
 if grep -q "test der erste" /var/beispiele/test.txt; then
```

----------

## 3PO

 *mv wrote:*   

>  *return13 wrote:*   
> 
> ```
> if [ $(grep "test der erste"  /var/beispiele/test.txt | wc -l) -gt 0]; then
> ```
> ...

 

Anscheinend führen mehrere Wege ans Ziel.   :Wink: 

btw: Was macht denn grep -q??

In man steht nichts darüber.

```
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

```

----------

## mv

 *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   :Wink: 

 *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

```
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 

```
LC_ALL=posix man grep
```

 oder - besser - die allgemeingültigere posix-manpage 

```
man 1p grep
```

 dürfte die Frage beantworten.

----------

## return13

man lernt doch immer dazu...

----------

## 3PO

@ mv,

danke für die wirklich mehr als sehr ausführliche Antwort.     :Smile: 

 :Arrow:  btw: mit grep --help hätte man es auch finden können:   :Wink:   :Idea: 

```
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 ~ #

```

----------

## STiGMaTa_ch

 *mv wrote:*   

> Was soll dieser Unsinn?
> 
> ```
>  if grep -q "test der erste" /var/beispiele/test.txt; then
> ```
> ...

 

Warum nicht ganz übersichtlich?

```
[ ! "`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...

```
[ ! "`grep 'Das was ich suche' /var/beispiel/test.txt`" = "" ] && echo "Was ich suche ist vorhanden" || echo "leider nicht gefunden"
```

Lieber Gruss

STiGMaTa

----------

