Песня Коронавируса (пародия на В. Цой — Прохожий)

Я гуляю по проспекту
Мне не надо ничего
Свои гены растопырил
Заражу я хоть кого

Эй прохожий проходи
Эх пока не заразил!

Эй прохожий проходи
Эх пока не заразил!

В помещеньях я хожу
Без билета
Осенью,весной хожу
Зимой и летом

Эй прохожий проходи
Эх пока не заразил!

Эй прохожий проходи
Эх пока не заразил!

Прихожу домой я ночью
И включаю интернет
А сосед за стенкой стонет
Кашляет, его уж нет

Эй прохожий проходи
Эх пока не заразил!

Эй прохожий проходи
Эх пока не заразил!

Эй прохожий проходи
Эх пока не заразил!

Эй прохожий проходи
Эх пока не заразил!

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

Тридцать три короны

В центре города Уханя,
Где травинки не растет,
Жил великий вирусолог,
Черный маг и руноплет.

Иногда ему Иные
Помогали, как могли
Даже, блин, грибы с Юггота
(Хоть им было неохота)
РНК ему дАли!

Тридцать три короны,
Тридцать три короны,
Тридцать три короны,
свежая строка

Тридцать три короны,
Вирь родился новый
Из куска Иного РНК!

В пять утра вставал он ровно,
Пентаграммочку чертил,
Заносил туда он колбы,
Чашки Петри заносил.

День за днём промчалось лето,
Звезды встали как должны.
Результат эксперимента
И побочные эффекты
Были всем нам явлены!

Тридцать три короны,
Тридцать три короны,
Тридцать три короны,
свежая строка

Тридцать три короны,
Вирь родился новый
Из куска Иного РНК!