Я хочу проверить, содержит ли файл определенную строку или нет в bash. Я использовал этот скрипт, но он не работает:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
Что не так в моем коде?
Я хочу проверить, содержит ли файл определенную строку или нет в bash. Я использовал этот скрипт, но он не работает:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
Что не так в моем коде?
if grep -q SomeString "$File"; then
Some Actions # SomeString was found
fi
Здесь вам не нужно [[ ]]
. Просто запустите команду напрямую. Добавьте -q
когда вам не понадобится строка, отображаемая при ее обнаружении.
Команда grep
возвращает 0 или 1 в коде выхода в зависимости от результата поиска. 0 если что-то найдено; 1 в противном случае.
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
Вы можете указать команды как условие if
. Если команда возвращает 0 в свой код выхода, это означает, что условие истинно; в противном случае - false.
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
Как вы можете видеть, вы запускаете здесь программы напрямую. Нет дополнительных []
или [[]]
.
В дополнение к другим ответам, в которых говорилось о том, как делать то, что вы хотели, я пытаюсь объяснить, что было не так (это то, что вы хотели.
В 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 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 available"
else
echo "Oops!!Not available"
fi
grep -q [PATTERN] [FILE] && echo $?
Статус выхода равен 0
(true), если шаблон был найден; в противном случае пустая строка.
Самая короткая (правильная) версия:
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
также можно записать как
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
но вам не нужно явно проверять его в этом случае, то же самое:
grep -q "something" file && echo "yes" || echo "no"
if grep -q [string] [filename]
then
[whatever action]
fi
Пример
if grep -q 'my cat is in a tree' /tmp/cat.txt
then
mkdir cat
fi
Если вы хотите проверить, что строка соответствует всей строке, и если она является фиксированной строкой, вы можете сделать это таким образом
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.)
Попробуйте следующее:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
Я сделал это, кажется, отлично работает
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi
Если вы хотите проверить, не содержит ли файл конкретную строку, вы можете сделать это следующим образом.
if ! grep -q SomeString "$File"; then
Some Actions # SomeString was not found
fi
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"