Linux. Есть ли слово в строке. Есть ли подстрока в строке.
Довольно частой задачей является узнать, встречается ли в строке какое-нибудь слово или же, в более общем случае, подстрока.
Для решения можно воспользоваться внутренними механизмами bash, но я покажу более башенезависимый способ, с помощью grep
. Благо он есть практически везде, даже в каких-нибудь системах, основанных на BusyBox, а вот вместо bash может встретится и просто sh, и что-нибудь более экзотическое.
Предположим, что в переменной
STR
имеется строка:STR="cat lynx lion coguar"
В переменную
SUBSTR
запишем первый параметр командной строки скрипта ($1
):SUBSTR="$1"
Выводим содержимое переменной
$STR
, передаем вывод grep
с нужными параметрами, а результат сохраняем в переменную-счетчик:CNTR=`echo "$STR" | grep -w -c "$SUBSTR"`
В данной команде более всего интересны параметры
grep
:-w
- искать целое слово.Примечание: Словом по умолчанию считается все, что отделено от других символов пробелом(-ами) табуляцией(-ами) или переводом(-ами) строки.
-с
- подсчитать количество строк с нужным вхождениемПримечание: Ключ
-с
заставляет grep
подсчитывать строки, а не сами вхождения, так что количество вхождений слова в строку, так посчитать не получится.В итоге в переменной
CNTR
оказывается 0
, если совпадений нет, и 1
, если совпадение есть, остается только проверить:if [ "$CNTR" -ne 0 ];then
echo "Exist"
else
echo "Not exist"
fi
Демо-скрипт на GitHub
Примеры работы:
./exist-word lion
Вывод:
Exist
./exist-word dog
./exist-word li
Вывод:
Not exist
Под подстрокой имеется любой набор символов, идущих подряд.
Задача решается аналогично предыдущей, только из параметров
grep
удаляется ключ -w
Если из вышеуказанного скрипта удалить ключ
-w
grep
'а, то вывод будет таким:./exist-word li
Вывод:
Exist
Т.е. теперь была найдена подстрока
li
(часть слова lion
).Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/07/02/linu