if grep -q SomeString"$File";thenSomeActions# SomeString was foundfi
Du brauchst [[ ]]hier nicht. Führen Sie den Befehl einfach direkt aus. -qOption hinzufügen, wenn die Zeichenfolge nicht angezeigt werden muss, als sie gefunden wurde.
Der grepBefehl gibt je nach Suchergebnis 0 oder 1 im Exit-Code 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 angeben if. Wenn der Befehl in seinem Exitcode 0 zurückgibt, bedeutet dies, dass die Bedingung erfüllt 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, führen Sie hier die Programme direkt aus. Keine zusätzlichen []oder [[]].
Erwägen Sie die Verwendung -m 1, um die Scanleistung zu verbessern. Gibt beim ersten Auftreten zurück.
AlikElzin-Kilaka
1
Wenn SomeStringRegex-Sonderzeichen (wie .) enthalten sind, erhalten Sie möglicherweise unerwartete Ergebnisse. Es ist sicherer, immer fgrep(oder grep -F) zu verwenden (es sei denn, Sie benötigen wirklich einen regulären Ausdruck. In diesem Fall ist egrep(oder grep -E) wahrscheinlich die beste Wahl)
Walter Tross
Das Beispielbeispiel ifist falsch, da nur geprüft wird, ob der Exit-Code nicht 0 war. Wenn ein Fehler auftritt, z. B. dass die Datei nicht gelesen werden kann, ist der Exit-Code ebenfalls ungleich 0. Sie müssen also so etwas tun ec=$?und prüfen, ob es 0(gefunden) ist, ob es 1(nicht gefunden) ist und ob es etwas anderes ist (fehlschlagen).
ddekany
40
Neben 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 ifsoll ein Befehl folgen. Wenn der Exit-Code dieses Befehls gleich 0 ist, wird das thenTeil ausgeführt, andernfalls wird das elseTeil ausgeführt, falls vorhanden.
Sie können dies mit jedem Befehl tun, wie in anderen Antworten erläutert: if /bin/true; then ...; fi
[[ist ein interner Bash-Befehl, der einigen Tests gewidmet ist, z. B. dem Vorhandensein von Dateien und Variablenvergleichen. In ähnlicher Weise [handelt es sich um einen externen Befehl (der sich normalerweise in befindet /usr/bin/[), der ungefähr dieselben Tests ausführt, jedoch ]als letztes Argument benötigt wird, weshalb er ]mit einem Leerzeichen auf der linken Seite aufgefüllt werden muss, was bei nicht der Fall ist ]].
Hier müssen Sie nicht [[noch [.
Eine andere Sache ist die Art und Weise, wie Sie Dinge zitieren. In Bash gibt es nur einen Fall, in dem Anführungszeichenpaare verschachtelt sind "$(command "argument")". Aber in 'grep 'SomeString' $File'dir hast du nur ein Wort, denn es 'grep 'ist eine zitierte Einheit, die mit verkettet SomeStringund dann wieder verkettet wird ' $File'. Die Variable $Filewird aufgrund der Verwendung von einfachen Anführungszeichen nicht einmal durch ihren Wert ersetzt. Der richtige Weg, das zu tun, ist grep 'SomeString' "$File".
##To check for a particular string in a file
cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directoryFile=YOUR_FILENAME
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File";##note the space after the string you are searching forthen
echo "Hooray!!It's available"else
echo "Oops!!Not available"fi
Ein Verzeichniswechsel ist normalerweise keine gute Idee (und hier völlig unnötig, qualifizieren Sie einfach den Dateinamen mit dem Zielverzeichnis). Und was Sie dann haben, ist genau das Gleiche wie die akzeptierte Antwort, nur mit weniger Details.
if grep -q something file; then echo yes; else echo no; fi. Kein Grund, sich überhaupt anzulegen $?.
Charles Duffy
6
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.)
Ich verzichte zögernd darauf, dies abzulehnen, aber Stack Overflow sollte diese Art von Brezel-Logik nicht aufrechterhalten. grepgibt aus einem sehr guten Grund einen Exit-Status zurück; Durch das Erfassen der Ausgabe in einer Zeichenfolge wird möglicherweise eine große Menge Text in einem Puffer gespeichert, sodass Sie sagen können, dass er nicht leer ist.
Tripleee
-1
Ich habe das getan, scheint gut zu funktionieren
if grep $SearchTerm $FileToSearch;then
echo "$SearchTerm found OK"else
echo "$SearchTerm not found"fi
... es ist nicht nur beabsichtigt $?, es ist überhaupt nicht nötig - Sie könnten es einfach tunif grep -q ...
Charles Duffy
1
Außerdem foo && truthy_action || falsey_actionist es kein echter ternärer Operator - wenn er truthy_actionausfällt, falsey_actionwird er zusätzlich ausgeführt .
Charles Duffy
Im Allgemeinen besteht der Zweck von ifdarin, einen Befehl auszuführen und seinen Exit-Code zu überprüfen. Sie sollten sehr selten $?explizit prüfen müssen .
command
: stackoverflow.com/questions/12375722/…Antworten:
Du brauchst
[[ ]]
hier nicht. Führen Sie den Befehl einfach direkt aus.-q
Option hinzufügen, wenn die Zeichenfolge nicht angezeigt werden muss, als sie gefunden wurde.Der
grep
Befehl gibt je nach Suchergebnis 0 oder 1 im Exit-Code zurück. 0 wenn etwas gefunden wurde; 1 sonst.Sie können Befehle als Bedingung für angeben
if
. Wenn der Befehl in seinem Exitcode 0 zurückgibt, bedeutet dies, dass die Bedingung erfüllt ist. sonst falsch.Wie Sie sehen, führen Sie hier die Programme direkt aus. Keine zusätzlichen
[]
oder[[]]
.quelle
grep
und verfügbare Optionen finden Sie unter asnwer stackoverflow.com/a/4749368/1702557-Fxq
Parameter wie in stackoverflow.com/a/4749368/544721-m 1
, um die Scanleistung zu verbessern. Gibt beim ersten Auftreten zurück.SomeString
Regex-Sonderzeichen (wie.
) enthalten sind, erhalten Sie möglicherweise unerwartete Ergebnisse. Es ist sicherer, immerfgrep
(odergrep -F
) zu verwenden (es sei denn, Sie benötigen wirklich einen regulären Ausdruck. In diesem Fall istegrep
(odergrep -E
) wahrscheinlich die beste Wahl)if
ist falsch, da nur geprüft wird, ob der Exit-Code nicht 0 war. Wenn ein Fehler auftritt, z. B. dass die Datei nicht gelesen werden kann, ist der Exit-Code ebenfalls ungleich 0. Sie müssen also so etwas tunec=$?
und prüfen, ob es0
(gefunden) ist, ob es1
(nicht gefunden) ist und ob es etwas anderes ist (fehlschlagen).Neben 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
if
soll ein Befehl folgen. Wenn der Exit-Code dieses Befehls gleich 0 ist, wird dasthen
Teil ausgeführt, andernfalls wird daselse
Teil ausgeführt, falls vorhanden.Sie können dies mit jedem Befehl tun, wie in anderen Antworten erläutert:
if /bin/true; then ...; fi
[[
ist ein interner Bash-Befehl, der einigen Tests gewidmet ist, z. B. dem Vorhandensein von Dateien und Variablenvergleichen. In ähnlicher Weise[
handelt es sich um einen externen Befehl (der sich normalerweise in befindet/usr/bin/[
), der ungefähr dieselben Tests ausführt, jedoch]
als letztes Argument benötigt wird, weshalb er]
mit einem Leerzeichen auf der linken Seite aufgefüllt werden muss, was bei nicht der Fall ist]]
.Hier müssen Sie nicht
[[
noch[
.Eine andere Sache ist die Art und Weise, wie Sie Dinge zitieren. In Bash gibt es nur einen Fall, in dem Anführungszeichenpaare verschachtelt sind
"$(command "argument")"
. Aber in'grep 'SomeString' $File'
dir hast du nur ein Wort, denn es'grep '
ist eine zitierte Einheit, die mit verkettetSomeString
und dann wieder verkettet wird' $File'
. Die Variable$File
wird aufgrund der Verwendung von einfachen Anführungszeichen nicht einmal durch ihren Wert ersetzt. Der richtige Weg, das zu tun, istgrep 'SomeString' "$File"
.quelle
Im Fall , wenn Sie möchten , zu überprüfen , ob Datei nicht nicht eine bestimmte Zeichenfolge enthält, können Sie tun , es folgt wie.
quelle
quelle
Kürzeste (richtige) Version:
kann auch geschrieben werden als
In diesem Fall müssen Sie es jedoch nicht explizit testen.
quelle
if grep -q something file; then echo yes; else echo no; fi
. Kein Grund, sich überhaupt anzulegen$?
.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
Beispiel
Aus der Man-Datei:
quelle
Der Exit-Status ist
0
(true), wenn das Muster gefunden wurde. sonst blankstring.quelle
Beispiel
quelle
Versuche dies:
quelle
grep
gibt aus einem sehr guten Grund einen Exit-Status zurück; Durch das Erfassen der Ausgabe in einer Zeichenfolge wird möglicherweise eine große Menge Text in einem Puffer gespeichert, sodass Sie sagen können, dass er nicht leer ist.Ich habe das getan, scheint gut zu funktionieren
quelle
grep
.quelle
$?
, es ist überhaupt nicht nötig - Sie könnten es einfach tunif grep -q ...
foo && truthy_action || falsey_action
ist es kein echter ternärer Operator - wenn ertruthy_action
ausfällt,falsey_action
wird er zusätzlich ausgeführt .if
darin, einen Befehl auszuführen und seinen Exit-Code zu überprüfen. Sie sollten sehr selten$?
explizit prüfen müssen .