рассмотрите возможность использования -m 1для улучшения производительности сканирования. Возвращает при первом появлении.
Алик Эльзин-килака
1
если SomeStringсодержит специальные символы регулярного выражения (например .), вы можете получить неожиданные результаты. Всегда безопаснее использовать fgrep(или grep -F) (если только вам действительно не нужно регулярное выражение, в этом случае egrep(или grep -E), вероятно, лучший выбор)
Уолтер Тросс
Пример ifпримера неверен, так как он только проверяет, был ли код выхода не равен 0. Если происходит какая-либо ошибка, например, если файл не может быть прочитан, код выхода также не равен 0. Таким образом, вы должны сделать что-то подобное ec=$?, и проверить, если это 0(найдено), затем, если оно 1(не найдено), и затем, если это что-то еще (сбой).
ддеканы
40
В дополнение к другим ответам, в которых рассказывалось, как делать то, что вы хотели, я пытаюсь объяснить, что было не так (что вы и хотели).
В Bash ifследует команда. Если код выхода этой команды равен 0, то thenчасть выполняется, иначе выполняется elseчасть, если она есть.
Вы можете сделать это с помощью любой команды, как описано в других ответах: if /bin/true; then ...; fi
[[это внутренняя команда bash, предназначенная для некоторых тестов, таких как существование файла, сравнение переменных. Аналогичным образом [, это внешняя команда (обычно она находится в /usr/bin/[), которая выполняет примерно те же тесты, но нуждается ]в качестве окончательного аргумента, поэтому ее ]необходимо дополнить пробелом слева, а это не так ]].
Здесь вам не нужно [[ни [.
Другое дело, как вы цитируете вещи. В bash есть только один случай, когда пары кавычек вкладывают, это так "$(command "argument")". Но у 'grep 'SomeString' $File'вас есть только одно слово, потому что 'grep 'это единица в кавычках, которая соединяется с, SomeStringа затем снова соединяется с ' $File'. Переменная $Fileдаже не заменяется своим значением из-за использования одинарных кавычек. Правильный способ сделать это 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
Изменение каталога, как правило, не очень хорошая идея (и здесь совершенно не нужно, просто укажите имя файла с целевым каталогом). И то, что у вас есть, - это то же самое, что принятый ответ, только с меньшим количеством деталей.
if grep -q something file; then echo yes; else echo no; fi, Нет причин связываться $?вообще.
Чарльз Даффи
6
Если вы хотите проверить, соответствует ли строка всей строке и является ли она фиксированной строкой, вы можете сделать это следующим образом
grep -Fxq[String][filePath]
пример
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
Из файла man:
-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.)
Я нерешительно воздерживаюсь от этого, но переполнение стека не должно увековечивать подобную логику кренделя. grepвозвращает статус выхода по очень веской причине; Захват вывода в строку потенциально может сохранить большой объем текста в буфере, чтобы вы могли сказать, что он не пустой.
tripleee
-1
Я сделал это, кажется, работает нормально
if grep $SearchTerm $FileToSearch;then
echo "$SearchTerm found OK"else
echo "$SearchTerm not found"fi
... не только так и должно быть $?, но в этом вообще нет необходимости - вы могли бы просто сделать этоif grep -q ...
Чарльз Даффи
1
Более того, foo && truthy_action || falsey_actionэто не настоящий троичный оператор - если truthy_actionне получится, то falsey_actionзапустится дополнительно .
Чарльз Даффи
В целом, цель в ifэто запустить команду и проверить ее код выхода. Вы должны очень редко должны исследовать $?явно.
command
: stackoverflow.com/questions/12375722/...Ответы:
Вам не нужно
[[ ]]
здесь. Просто запустите команду напрямую. Добавить-q
опцию, когда вам не нужна строка, отображаемая, когда она была найдена.Команда
grep
возвращает 0 или 1 в коде выхода в зависимости от результата поиска. 0 если что-то было найдено; 1 иначе.Вы можете указать команды как условие
if
. Если команда возвращает 0 в своем коде выхода, это означает, что условие истинно; иначе ложно.Как видите, вы запускаете здесь программы напрямую. Никаких дополнительных
[]
или[[]]
.источник
grep
и доступные опции в asnwer stackoverflow.com/a/4749368/1702557-Fxq
параметры, как в stackoverflow.com/a/4749368/544721-m 1
для улучшения производительности сканирования. Возвращает при первом появлении.SomeString
содержит специальные символы регулярного выражения (например.
), вы можете получить неожиданные результаты. Всегда безопаснее использоватьfgrep
(илиgrep -F
) (если только вам действительно не нужно регулярное выражение, в этом случаеegrep
(илиgrep -E
), вероятно, лучший выбор)if
примера неверен, так как он только проверяет, был ли код выхода не равен 0. Если происходит какая-либо ошибка, например, если файл не может быть прочитан, код выхода также не равен 0. Таким образом, вы должны сделать что-то подобноеec=$?
, и проверить, если это0
(найдено), затем, если оно1
(не найдено), и затем, если это что-то еще (сбой).В дополнение к другим ответам, в которых рассказывалось, как делать то, что вы хотели, я пытаюсь объяснить, что было не так (что вы и хотели).
В Bash
if
следует команда. Если код выхода этой команды равен 0, тоthen
часть выполняется, иначе выполняетсяelse
часть, если она есть.Вы можете сделать это с помощью любой команды, как описано в других ответах:
if /bin/true; then ...; fi
[[
это внутренняя команда bash, предназначенная для некоторых тестов, таких как существование файла, сравнение переменных. Аналогичным образом[
, это внешняя команда (обычно она находится в/usr/bin/[
), которая выполняет примерно те же тесты, но нуждается]
в качестве окончательного аргумента, поэтому ее]
необходимо дополнить пробелом слева, а это не так]]
.Здесь вам не нужно
[[
ни[
.Другое дело, как вы цитируете вещи. В bash есть только один случай, когда пары кавычек вкладывают, это так
"$(command "argument")"
. Но у'grep 'SomeString' $File'
вас есть только одно слово, потому что'grep '
это единица в кавычках, которая соединяется с,SomeString
а затем снова соединяется с' $File'
. Переменная$File
даже не заменяется своим значением из-за использования одинарных кавычек. Правильный способ сделать этоgrep 'SomeString' "$File"
.источник
Если вы хотите проверить, не содержит ли файл определенную строку, вы можете сделать это следующим образом.
источник
источник
Кратчайшая (правильная) версия:
можно также записать как
но вам не нужно явно проверять это в этом случае, так же как с:
источник
if grep -q something file; then echo yes; else echo no; fi
, Нет причин связываться$?
вообще.Если вы хотите проверить, соответствует ли строка всей строке и является ли она фиксированной строкой, вы можете сделать это следующим образом
пример
Из файла man:
источник
Статус выхода
0
(true), если шаблон был найден; в противном случае пустая строка.источник
пример
источник
Попробуй это:
источник
grep
возвращает статус выхода по очень веской причине; Захват вывода в строку потенциально может сохранить большой объем текста в буфере, чтобы вы могли сказать, что он не пустой.Я сделал это, кажется, работает нормально
источник
grep
.источник
$?
, но в этом вообще нет необходимости - вы могли бы просто сделать этоif grep -q ...
foo && truthy_action || falsey_action
это не настоящий троичный оператор - еслиtruthy_action
не получится, тоfalsey_action
запустится дополнительно .if
это запустить команду и проверить ее код выхода. Вы должны очень редко должны исследовать$?
явно.