Существует довольно много способов извлечь слова и подстроки из строк текста в системе 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 для выбора нескольких слов из файла. В этом примере отображаются только выбранные слова, а не целые строки. Это связано с тем, что используется опция -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 также может использоваться для выбора части фразы, указывая ее начальную позицию и длину.
$ str="Learning to use Linux is fun" $ expr substr "$str" 13 9 use Linux
Команда 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.
$ 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 вы можете указать начальную и конечную позиции для текста, который вы хотите извлечь. Например, вы можете создать переменную, присвоив ей значение, а затем использовать синтаксис, подобный показанному ниже, для выбора ее части.
$ 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 предоставляют вам множество полезных опций.