Существует довольно много способов извлечь слова и подстроки из строк текста в системе 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 предоставляет множество команд, которые помогут вам манипулировать текстом. Команды awk, cut, grep, expr, sed и xargs наряду с расширением параметров bash предоставляют вам множество полезных опций.