it-swarm.com.de

So überprüfen Sie mithilfe von Bash, ob eine Datei eine bestimmte Zeichenfolge enthält

Ich möchte überprüfen, ob eine Datei eine bestimmte Zeichenfolge enthält oder nicht. Ich habe dieses Skript verwendet, aber es funktioniert nicht:

 if [[ 'grep 'SomeString' $File' ]];then
   # Some Actions
 fi

Was ist in meinem Code falsch?

219
Hakim
if grep -q SomeString "$File"; then
  Some Actions # SomeString was found
fi

Du brauchst hier nicht [[ ]]. Führen Sie einfach den Befehl direkt aus. Fügen Sie die Option -q hinzu, wenn die Zeichenfolge nicht angezeigt werden soll, als sie gefunden wurde.

Der Befehl grep gibt je nach Ergebnis der Suche im Exit-Code 0 oder 1 zurück. 0 wenn etwas gefunden wurde; 1 sonst.

$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0

Sie können Befehle als Bedingung für if angeben. Wenn der Befehl in seinem Exitcode 0 zurückgibt, bedeutet dies, dass die Bedingung wahr ist. sonst falsch.

$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$

Wie Sie sehen können Sie hier die Programme direkt ausführen. Kein zusätzlicher [] oder [[]].

404
Igor Chubin

Zusätzlich zu anderen Antworten, die Ihnen sagten, wie Sie tun sollen, was Sie wollten, versuche ich zu erklären, was falsch war (was Sie wollten).

In Bash soll if mit einem Befehl gefolgt werden. Wenn der Exit-Code dieses Befehls gleich 0 ist, wird der Teil then ausgeführt, anderenfalls der Teil else.

Sie können dies mit jedem Befehl tun, wie in den anderen Antworten erläutert: if /bin/true; then ...; fi

[[ ist ein interner Bash-Befehl, der für einige Tests wie das Vorhandensein von Dateien und den Vergleich von Variablen vorgesehen ist. Ähnlich ist [ ein externer Befehl (er befindet sich normalerweise in /usr/bin/[), der ungefähr dieselben Tests ausführt, jedoch ] als letztes Argument benötigt, weshalb ] sein muss links mit einem Leerzeichen aufgefüllt, was bei ]] nicht der Fall ist.

Hier brauchst du weder [[ noch [.

Eine andere Sache ist die Art und Weise, wie Sie Dinge zitieren. In Bash gibt es nur einen Fall, in dem sich Paare von Anführungszeichen verschachteln, nämlich "$(command "argument")". Aber in 'grep 'SomeString' $File' haben Sie nur ein Wort, weil 'grep ' eine zitierte Einheit ist, die mit SomeString und dann wieder mit ' $File' verkettet wird. Die Variable $File wird nicht einmal durch ihren Wert ersetzt, da einfache Anführungszeichen verwendet werden. Der richtige Weg dazu ist grep 'SomeString' "$File".

31
Benoit
##To check for a particular  string in a file

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME  
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi
9
grep -q [PATTERN] [FILE] && echo $?

Der Beendigungsstatus ist 0 (true), wenn das Muster gefunden wurde. ansonsten blankstring.

5
SupermanKelly

Kürzeste (richtige) Version:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

kann auch geschrieben werden als

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

sie müssen es in diesem Fall jedoch nicht explizit testen. Das Gleiche gilt für:

grep -q "something" file && echo "yes" || echo "no"
5
lzap
if grep -q [string] [filename]
then
    [whatever action]
fi

Beispiel

if grep -q 'my cat is in a tree' /tmp/cat.txt
then
    mkdir cat
fi
3
user5854766

Wenn Sie überprüfen möchten, ob die Zeichenfolge mit der gesamten Zeile übereinstimmt und ob es sich um eine feste Zeichenfolge handelt, können Sie dies auf diese Weise tun

grep -Fxq [String] [filePath]

beispiel

 searchString="Hello World"
 file="./test.log"
 if grep -Fxq "$searchString" $file
    then
            echo "String found in $file"
    else
            echo "String not found in $file"
 fi

Aus der Man-Datei:

-F, --fixed-strings

          Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of 

which is to be matched.
          (-F is specified by POSIX.)
-x, --line-regexp
          Select only those matches that exactly match the whole line.  (-x is specified by 

POSIX.)
-q, --quiet, --silent
          Quiet; do not write anything to standard output.  Exit immediately with zero 

status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages 

option.  (-q is specified by
          POSIX.)
3
Shubham Khatri

Versuche dies:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi
1
vgokul129

Wenn Sie prüfen möchten, ob die Datei nicht eine bestimmte Zeichenfolge enthält, können Sie dies wie folgt tun.

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi
0
Lahiru Chandima

Ich habe das getan, scheint gut zu funktionieren

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi
0
madarekrap