Как узнать, содержит ли строка Bash подстроку в Linux

Ноутбук Linux с приглашением bash

Иногда в сценариях Linux вам нужно знать, содержит ли текстовая строка определенную меньшую строку. Есть много способов сделать это. Мы покажем вам несколько простых и надежных методов.

Почему это полезно?

Обычным требованием является поиск в строке меньшей подстроки. Одним из примеров может быть чтение текста из файла или человеческого ввода и поиск в строке определенной подстроки, чтобы ваш сценарий мог решить, что делать дальше. Это может быть поиск метки или имени устройства в файле конфигурации или командной строки в строке ввода от пользователя.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Пользователи Linux наделены множеством утилит для работы с текстом. Некоторые из них встроены в оболочку Bash, другие предоставляются как отдельные утилиты или приложения. Есть причина, по которой операционные системы, производные от Unix, богато снабжены возможностями манипулирования строками.

Некоторые вещи, которые кажутся файлами, не являются простыми файлами. Они специальные файлы представляющие такие вещи, как аппаратные устройства и источники системной информации. Абстракция, выполняемая операционной системой, придает им внешний вид и характеристики файлов. Вы можете читать из них информацию — в виде текста, естественно — и в некоторых случаях писать в них, но это не обычные файлы.

Текст также используется в качестве ввода и вывода для команд в окне терминала. Это позволяет перенаправлять и передавать входные и выходные данные. Эта функциональность лежит в основе способности связывать последовательности команд Linux вместе, передавая выходные данные одной команды в качестве входных данных для следующей.

Независимо от происхождения, поиск в полученном тексте значимого слова, команды, метки или какого-либо другого индикатора является стандартной частью работы с текстовыми данными. Вот набор простых приемов, которые вы можете включить в свои собственные сценарии.

Поиск подстрок с помощью встроенных функций Bash

Двойные скобки “[[…]]» тест сравнения строк можно использовать в операторах if, чтобы определить, содержит ли одна строка другую строку.

Скопируйте этот сценарий в редактор и сохраните его в файл с именем «double.sh».

#!/bin/bash, если [[ “monkey” = *”key”* ]]; затем эхо “ключ находится в обезьяне” еще эхо “ключ не в обезьяне” fi

Вам нужно будет сделать скрипт исполняемым с помощью команды chmod. Это шаг, который всегда необходим для того, чтобы сделать любой скрипт исполняемым. Вам нужно будет делать это каждый раз, когда вы создаете файл сценария. Подставьте имя соответствующего скрипта в каждом случае.

chmod +x двойной.sh

создание исполняемого файла скрипта с помощью chmod

Запустим скрипт.

./двойной.ш

Запуск сценария double.sh

Это работает, потому что звездочка «*» представляет собой любую последовательность символов, включая отсутствие символов. Если подстрока «ключ» находится в целевой строке, с какими-либо символами впереди или позади нее или без них, тест вернет значение «истина».

В нашем примере перед подстрокой стоят символы. Они соответствуют первой звездочке. За подстрокой нет букв, но, поскольку звездочка также не соответствует ни одному символу, тест все равно проходит.

Для гибкости мы можем модифицировать наш скрипт, чтобы он обрабатывал переменные, а не литеральные строки. Это скрипт «double2.sh».

#!/bin/bash string=”Monkey” substring=”key” если [[ $string = *$substring* ]]; then echo “$substring найдена в $string” else echo “$substring не найдена в $string” fi

Посмотрим, как это работает.

./двойной2.ш

Запуск скрипта double2.sh

Это работает таким же образом, с тем преимуществом, что мы можем использовать имена переменных вместо буквальных строк. Превращение нашего небольшого решения в функцию обеспечит наибольшую гибкость.

Это скрипт «double3.sh».

#!/bin/bash shopt -s nocasematch string=”Monkey” substring=”Key” Capital=”London” check_substring () { if [[ $1 = *$2* ]]; then echo “$2 найдено в $1” else echo “$2 не найдено в $1” fi } check_substring “Обезьяна” “ключ” check_substring $string $substring check_substring $string “банан” check_substring “Уэльс” $capital

Мы вызываем нашу функцию check_substring, используя сочетание переменных и буквенных строк. Мы использовали shopt с опцией -s (set), чтобы установить nocasematch, чтобы совпадения не учитывали регистр.

Вот как это работает.

./double3.sh

Запуск скрипта double3.sh

Мы также можем использовать прием, заключающий подстроку в звездочки в операторах case. Это «case.sh».

#!/bin/bash shopt -s nocasematch string=”Wallaby” substring=”Wall” case $string in *$substring*) echo “$substring была найдена в $string” ;; *) echo “Ничего не соответствует: $string” ;; эсак

Использование операторов case вместо очень длинных операторов if может упростить чтение и отладку сценариев. Если вам нужно проверить, содержит ли строка одну из многих возможных подстрок, оператор case будет лучшим выбором.

./case.sh

Запуск сценария case.sh

Подстрока найдена.

Поиск подстрок с помощью grep

Помимо встроенных функций Bash, первым инструментом текстового поиска, к которому вы, вероятно, прикоснетесь, является grep. Мы можем использовать врожденную способность grep искать строку в строке для поиска наших подстрок.

Этот сценарий называется «subgrep.sh».

#!/bin/bash string=”кастрюля с кашей” substring=”хребет” if $(echo $string | grep -q $substring); then echo “$substring найдена в $string” else echo “$substring не найдена в $string” fi

Сценарий использует эхо для отправки строки в grep, которая ищет подстроку. Мы используем параметр -q (quiet), чтобы остановить запись grep в стандартный вывод.

Если результат команд в круглых скобках «(…)» равен нулю, это означает, что совпадение найдено. Поскольку в Bash ноль равен true, выполняется оператор if и выполняется предложение then.

Посмотрим, каков его выход.

./subgrep.sh

Запуск скрипта subgrep.sh

Поиск подстрок с помощью sed

Мы также можем использовать sed для поиска подстроки.

По умолчанию sed печатает весь введенный в него текст. Использование sed -n предотвращает это. Печатаются только совпадающие строки. Это выражение напечатает все строки, которые соответствуют или содержат значение $substring.

“/$подстрока/p”

Мы передаем значение $string в sed, используя перенаправление здесь, <<<. Это используется для перенаправления значений в команду в текущей оболочке. Он не вызывает подоболочку, как канал.

Первый -n – это тест. Он вернет true, если вывод команды sed не равен нулю. Единственный способ, которым вывод sed может быть ненулевым, — это найти совпадающую строку. Если это так, то $substring должна быть найдена в $string.

Это «subsed.sh».

#!/bin/bash string=”Sweden” substring=”eden” если [ -n “$(sed -n “/$substring/p” <<< $string)” ]; then echo “$substring найдена в $string” else echo “$substring не найдена в $string” fi

Мы получаем ожидаемый ответ при запуске скрипта.

./subsed.sh

Запуск скрипта subsed.sh

Мы можем проверить логику скрипта, отредактировав значение $substring так, чтобы сравнение не удавалось.

./subsed.sh

Запуск сценария subsed.sh с несовпадающей подстрокой

Хватит искать, нашел

Другие инструменты, такие как awk и Perl, могут находить подстроки, но простой вариант использования, такой как поиск подстроки, не гарантирует их дополнительной функциональности или дополнительной сложности. В частности, использование встроенных функций Bash для поиска подстрок выполняется быстро, просто и не требует внешних инструментов.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *