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).

Добавить комментарий

Ваш адрес email не будет опубликован.