Linux

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

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

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

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

Что такое Сед?

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

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

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

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

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

  эхо "Hello World" |  SED S / World / Dave 

sedawk-Дэйв

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

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

SED-Greg-СЭД

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

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

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

  кот tom.txt |  sed -f greg.sed 

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

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

SED-Greg-скрипт

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

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

  кот tom.txt |  sed / ^ Take / d 

SED-регулярное выражение-дубль

Сед, конечно, невероятно полезен. Но это еще более мощно, когда объединено с Awk.

Что такое Awk?

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

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

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

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

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

  длина awk '($ 0)> 80' tom.txt

AWK-длина

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

  {
  для (i = 1; i <= NF; i ++)
  частота [$ я] ++
 } 
  КОНЕЦ {
  для (слово в частоте)
  printf "% s \ t% d \ n", word, freq [word]
 } 

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

  awk -f WordCount.awk tom.txt 

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

Объединяя два

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

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

  awk 'длина ($ 0)> 20' tom.txt |  sed / ^ Take / d 

И производит это:

AWK-длина-СЭД

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

  кот tom.txt |  sed / ^ Take / d |  awk -f WordCount.awk 

AWK-WordCount-СЭД

Сила Седа и Пробуждения

Есть только так много, что вы можете объяснить в одной статье. Но я надеюсь, что я продемонстрировал, насколько неизмеримо сильны Сед и Аук. Проще говоря, они электростанция обработки текста.

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

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

Похожие посты
Linux

8 лучших окружений рабочего стола Linux

AndroidIphone и ipadLinuxWindows

Окончательное руководство по включению темного режима везде

LinuxКак сделать

Что такое Swappiness в Linux? (и как это изменить)

LinuxКак сделать

Как использовать команду ls для вывода списка файлов и каталогов в Linux