ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как работать с подстроками в Linux

Как работать с подстроками в Linux

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

 

Полные слова или части строк

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

 

Полные слова и подстроки

Один из самых простых способов выделить слово из сегмента текста на основе его позиции (например, 3-етретье слово) – это использовать команду awk. Например, чтобы извлечь третье слово из фразы, вы могли бы использовать команду awk, подобную этой:

$ echo "Focus on Peace" | awk '{print $3}'
Peace

 

$ 3 представляет третье слово во фразе, поскольку пробел является разделителем по умолчанию.

Чтобы сделать то же самое с помощью команды cut, вам нужно будет включить разделитель с параметром -d в команду, подобную этой, где -f3 представляет третье слово:

$ echo "Focus on Peace" | cut -d' ' -f3
Peace

 

Вы также можете выбрать несколько полей с помощью команды cut, как показано в следующих примерах:

$ echo "Focus on Peace on Earth" | cut -d' ' -f3,5
Peace Earth
$ echo "one two three 4 5 6" | cut -d' ' -f1-3,6
one two three 6

 

Чтобы использовать альтернативный разделитель (в данном случае двоеточие), используйте команду, подобную этой:

$ cut -d':' -f1-3,5,6 /etc/passwd | tail -n 5
justme:x:1004:JustMe:/home/justme
lola:x:1006::/home/lola
dumdum:x:1007::/home/dumdum

 

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

$ cat file
Monday:1 Tuesday:2 Wednesday:3 Thursday:4 Friday:5
$ awk -F'[: ]' '{OFS=" ";print $1,$3,$4}' file
Monday Tuesday 2

 

Выбор подстрок

Чтобы выбрать произвольную последовательность или символы из строки, вы можете использовать команду awk, подобную приведенной ниже, в которой $0 представляет всю фразу целиком, 10 представляет первую позицию символа, которую нужно захватить, а 5 – длину строки, которая будет отображаться.

$ echo "Focus on Peace" | awk '{print substr($0,10,5)}'
Peace

 

Чтобы проделать то же самое с помощью команды вырезать, вам следует использовать команду, подобную этой, в которой из фразы извлекаются и отображаются символы с 13-го по 22-й буквы. ………… и выводятся символы.

$ echo "Linux is an impressive OS" | cut -c 13-22
impressive

 

В следующей команды команда cut выводит на экран 7– й-12тыс. символов из строк в файле. Команда head просто ограничивает отображение первыми 4 строками вывода.

$ cut -c 7-12 sayings | head -4
with 3
and ov
nd be
and be

 

Использование grep

Вы можете использовать команду grep для выбора нескольких слов из файла. В этом примере отображаются только выбранные слова, а не целые строки. Это связано с тем, что используется опция -o (отображать только совпадающие элементы).

$ cat sayings | grep -o "quarrel\|empty"
quarrel
quarrel
empty

 

Без опции -o вы бы увидели полные строки.

$ cat sayings | grep "quarrel\|empty"
They do not quarrel,
So no one quarrels with them.
Is that an empty saying?

 

Вы также можете выбирать фразы из нескольких слов, как показано в этом примере:

$ cat sayings | grep -o "never falter\|do not quarrel"
never falter
do not quarrel

 

Использование expr

Команда expr также может использоваться для выбора части фразы, указывая ее начальную позицию и длину.

$ str="Learning to use Linux is fun"
$ expr substr "$str" 13 9
use Linux

 

Использование sed

Команда sed предоставляет очень удобный способ замены слов в строке.

$ echo "They never falter" | sed 's/falter/forget/'
They never forget

 

Вы также можете использовать эту команду для замены нескольких слов, как в этом примере:

$ echo "They never falter" | sed 's/never falter/always forget/'
They always forget

 

Использование xargs

Чтобы удалить пробелы в начале и конце фраз, используйте команду xargs.

$ echo "  Keep your nose to the grindstone " | xargs
Keep your nose to the grindstone

 

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

$ cat eg


           Keep your nose to the grindstone
$ cat eg | xargs
Keep your nose to the grindstone

 

Использование расширения параметров bash

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

$ string="Happy days are here again"
$ echo ${string:1:10}
appy days
$ echo ${string:0:9}
Happy days

 

Обратите внимание, что приведенный выше пример ясно показывает, что этот метод начинает нумерацию позиций с 0. Итак, в следующем примере 7 представляет восьмой символ в строке, а -2 означает удаление последних 2 символов. В результате подстрока в первом примере ниже содержит один символ, а во втором – все, кроме последних двух.

$ string="1234567890"
$ echo ${string:7:-2}
8
$ echo ${string:0:-2}
12345678

 

В следующем примере мы сначала создаем переменную с помощью “set –”, а затем используем команду echo для отображения восьмого и девятого символов. Другими словами, он начинается с восьмого символа (7), а затем отображает два символа.

$ set -- 01234567890abcdef
$ echo ${1:7:2}
78

 

ПРИМЕЧАНИЕ: Вы могли бы отобразить строку, созданную с помощью set”, просто используя команду “echo $1”. Это то, на что ссылается “1” в приведенном выше примере.

$ set -- 01234567890abcdef
$ echo $1
01234567890abcdef

 

Подведение итогов

Linux предоставляет множество команд, которые помогут вам манипулировать текстом. Команды awkcutgrepexprsed и xargs наряду с расширением параметров bash предоставляют вам множество полезных опций.

Exit mobile version