Каждый Linux-компьютерщик должен знать Sed и Awk. Вот почему …

Двумя наиболее недооцененными преступниками утилитами Linux являются Sed и Awk. Хотя, по общему признанию, они могут показаться немного загадочными, если вам когда-либо придется вносить повторяющиеся изменения в большие фрагменты кода или текста, или если вам когда-либо придется анализировать какой-то текст, Sed и Awk неоценимы.

Итак, что это? Как они используются? И как, будучи объединенными вместе, они упрощают обработку текста?

Что такое Sed?

Sed был разработан в 1971 году в Bell Labs легендарным пионер вычислительной техники Ли Э. МакМахон.

Название означает редактор потока , и это вроде как то, что он делает. Он позволяет редактировать тела или потоки текста программно с помощью компактного и простого, но полного по Тьюрингу языка программирования.

Принцип его работы прост: он считывает текст построчно в буфер. Для каждой строки он будет выполнять предопределенные инструкции, где это применимо.

Например, если кто-то должен был написать сценарий Sed, который заменил слово «пиво» ​​на «газировку», а затем передал текстовый файл, содержащий весь текст, в «99 бутылок с Пиво на стене », он просматривал этот файл построчно и распечатывал« 99 бутылок содовой на стене »и так далее.

Самый простой сценарий Sed — это сценарий Hello World. Здесь мы используем утилиту Unix Echo, которая просто выводит строки, чтобы напечатать «Hello World». Но мы передаем это Седу и приказываем ему заменить «World» на «Dave». Не требует пояснений.

 echo "Hello World" |  sed s/world/Dave 

Вы также можете комбинировать Sed инструкции в файлы, если вам нужно выполнить более сложное редактирование. Вдохновленный этой веселой веткой Reddit, я собираюсь взять текст песни A-Ha Take On Me и заменить каждое слово «I», «Me» и «My», с Грегом.

Сначала я помещу текст песни в текстовый файл с именем tom.txt . Затем я открою свой любимый текстовый редактор (мой любимый — Vim, но Nano и Gedit — отличный выбор) и добавлю следующие строки. Убедитесь, что создаваемый вами файл заканчивается на .sed.

Вы могли заметить, что в приведенном выше примере я повторил себя (например, s/me/Greg/и s/Me/Greg/). Это потому, что некоторые версии Sed, например та, которая поставляется с Mac OS X, не поддерживают сопоставление без учета регистра. В результате мы должны написать две инструкции Sed для каждого слова, чтобы оно распознавало версию с заглавной и без заглавной буквы.

Это не сработает идеально, как если бы вы заменили каждое вхождение «I», «Me» , и «Мой» вручную. Помните, мы просто используем это как упражнение, чтобы продемонстрировать, как вы можете сгруппировать инструкции Sed в один сценарий, а затем выполнить их с помощью одной команды.

Затем нам нужно вызвать файл. Для этого мы запускаем эту команду.

 cat tom.txt |  sed -f greg.sed 

Давайте притормози и посмотрим, что это делает. Внимательные читатели заметят, что мы не пользуемся здесь Echo. Мы используем Cat. Это потому, что, хотя Cat распечатает все содержимое файла, echo распечатает только имя файла. Вы также заметили, что мы запускаем Sed с флагом «-f». Это говорит ему открыть скрипт как файл.

Конечный результат таков.

Также стоит отметить, что Sed поддерживает регулярные выражения (REGEX ). Они позволяют определять шаблоны в тексте с использованием специального сложного синтаксиса.

Вот пример того, как это может работать. Мы собираемся взять текст из вышеупомянутой песни, но с помощью регулярного выражения распечатать каждую строку, которая не начинается с «Take».

 cat tom.txt |  sed/^ Take/d 

Sed, конечно, , невероятно полезно. Но в сочетании с Awk он становится еще более мощным.

What Is Awk?

Awk , как и Sed, это язык программирования, предназначенный для работы с большими объемами текста. Но в то время как Sed используется для обработки и изменения текста, Awk в основном используется как инструмент для анализа и отчетности .

Как и Sed, Awk был впервые разработан в Bell Labs в 1970-х годах. Его название происходит не от того, что делает программа , а от фамилий каждого из авторов — Альфреда Ахо, Питера Вайнбергера и Брайана Кернагана.

AWK работает, читая текстовый файл или входной поток по одной строке за раз. Каждая строка сканируется, чтобы увидеть, соответствует ли она заранее заданному шаблону. Если совпадение найдено, выполняется действие.

Но хотя Sed и Awk могут иметь схожие цели, это два совершенно разных языка с двумя совершенно разными дизайнами. философии. Awk больше похож на некоторые языки общего назначения, такие как C, Python и Bash.. В нем есть такие вещи, как функции, и более похожий на C подход к таким вещам, как итерация и переменные (Джеймс Брюс объяснил, как работает итерация). Проще говоря, это больше похоже на язык программирования.

Итак, попробуем. Используя текст Take On Me, мы напечатаем все строки, длина которых превышает 20 символов.

 awk 'length ($ 0)> 80' tom.txt 

Следующий пример, который я бессовестно скопировал из официальной документации Awk. . Но это отличный пример потенциала этого мощного, но крошечного языка. Это также отличная демонстрация того, как в нем работают такие вещи, как итерация и переменные. Сначала создайте файл с именем «WordCount.awk» и добавьте следующие строки.

 {

for (i = 1; i

freq [$ i] ++

}

 END {

для (слово в частоте)

printf "% s t% d n", слово, частота [слово]

}

Сохраните его, а затем запустите с помощью следующей команды.

 awk -f WordCount.awk tom.txt 

Круто, да? Вы, вероятно, заметите, что они не в каком-либо порядке. Вы можете отсортировать результаты с помощью утилиты сортировки Unix. Но мы оставим это на другой день. Мы собираемся сделать это простым.

Объединение двух

Awk и Седы в сочетании невероятно мощны. Вы можете сделать это с помощью каналов Unix. Это «|» биты между командами.

Давайте попробуем следующее: мы собираемся перечислить все строки в Take On Me, которые содержат более 20 символов, используя Awk. Затем мы удалим все строки, начинающиеся с «Take» . Вместе это выглядит так:

 awk 'length ($ 0)> 20' tom.txt |  sed/^ Take/d 

И производит следующее:

Теперь давайте перевернем это. Мы собираемся начать с удаления всех строк, начинающихся с Take, а затем передать их Awk, где мы посчитаем, сколько раз появляется каждое слово. Это выглядит примерно так:

 cat tom.txt |  sed/^ Take/d |  awk -f WordCount.awk 

Сила Sed и Awk

В одной статье вы можете объяснить очень много всего. Но я надеюсь, что я проиллюстрировал, насколько неизмеримо могущественны Sed и Awk. Проще говоря, они мощные системы обработки текста.

Итак, почему вас это должно волновать? Что ж, помимо того факта, что вы никогда не знаете, когда вам нужно внести предсказуемые, повторяющиеся изменения в текстовый документ, Sed и Awk отлично подходят для анализа файлов журналов. Это особенно удобно, когда вы пытаетесь отладить проблему на своем сервере LAMP или просматриваете журналы доступа, чтобы узнать, не был ли ваш сервер взломан.

Нашли ли вы интересное применение Sed и Awk? Есть ли какие-то другие утилиты Linux, которые, по вашему мнению, недооцениваются? Дайте мне знать в комментариях ниже, и мы поговорим.

.

Оцените статью
oilgasindustry.ru
Добавить комментарий