Автор: Лукас Вестерман (Lucas Westermann)

Вэтом выпуске мы расскажем об основных возможностях форматирования вывода с помощью команд grep, sed, awk, cat и cut. Это может быть очень полезным, если соединять вместе такие вещи как Conky или скрипты, которые отображают информацию в терминале.

Сначала рассмотрим работу команды cut. Если бы мы хотели отобразить название дистрибутива в нашем скрипте, мы нашли бы его в /etc/issue. Если мы выполним cat /etc/issue, мы увидим много длинных строк со множеством экранирующих символов в них. Так, если мы выполним cat /etc/issue | head -n 1, мы уберём дополнительные строки, сузив вывод команды cat с помощью команды head, которая оставит только первую строку вывода. Пока всё хорошо, но что насчёт специальных символов? Для таких случаев у нас есть cut. Чтобы её использовать, мы должны указать разделитель, а затем сказать ей, что с ним делать. Мы могли бы выполнить следующую команду:

cat /etc/issue|head -n 1|cut –-delimiter=' ' -f 1,2

Эта команда говорит cut использовать в качестве разделителя знак пробела, и показать первые два поля (по существу, cut делит вывод на сегменты в соответствии с разделителем, поэтому поля 1 и 2 - это первые два поля до и после разделителя, в нашем случае это Ubuntu 8.10). Cut также можно использовать для отображения только определённого числа символов, используя флаг -c.

То же самое можно сделать и с помощью команды sed:

cat /etc/issue|sed '{s/\\n// ; s/\\l// ; /^$/d}'

Это может показаться лишним, но первые два выражения (каждое из них разделено точкой с запятой) говорят sed заменить “\n” на “” (ничего), и то же самое для “\l”, убирая эти символы из вывода. Команда “/^$/d” говорит sed удалить все пустые строки (“^$” - это регулярное выражение для строки, которая начинается и заканчивается пустым символом, и посередине тоже ничего нет - т.е. пустая строка). Так 's/\\n\b//' просто говорит sed заменить (“s/”) “\n” (“\\n”) на “” (“//”). Причина, по которой эта команда в скобках, в том, что мы применяем три выражения на выходе, и хотим, чтобы результат появился только один раз, поэтому мы поместили выражения в скобки (“{}”), и разделили точкой с запятой.

В заключение, такой же результат мы можем получить с помощью awk:

cat /etc/issue|awk '/\\n/ {print $1,$2}'

Эта команда тоже использует регулярные выражения, но её легче понять, чем sed. Команда awk '/\n/ {print $1, $2}' ищет любую строку, в которой есть “\n”, и затем печатает первые два поля (разделитель по умолчанию - это пробел, но вы можете определить свой с помощью флага -F). Это позволяет нам отбросить лишнюю строку и \l из вывода команды. Вы можете также отказаться от обрезания вывода в команде cat /etc/issue (или любой другой), так как они все могут быть применены к определенному файлу в конце команды. Я использовал cat для того, чтобы оставить команды более понятными.

Это всё рассматривается только как поверхностный взгляд на возможности awk, sed и cut. Из-за их гибкой реализации сложно написать краткое вводное руководство для всех них. Пояснения приведены, чтобы показать, как команды работают, а не описывать их полный потенциал. В реальном мире использование этих команд будет в первой половине любого собственного скрипта (ниже приведен пример, который также выводит информацию о скрипте, но часть не обязательно подходит к этой статье; она оставлена, чтобы оставить скрипт завершённым). Пример также содержит вызов для каждого, кто желает его попробовать: сообразите, как использовать одну из трёх команд, чтобы убрать параграф в памятной части скрипта, и, если вы хотите больше практики, попробуйте заменить каждое использование cut, sed или awk на другую команду, делающую то же самое (т.е. заменить команду cut на awk). Конечно, никакого приза нет, но это хорошая практика, чтобы понять внутреннюю работу этих команд.

http://fullcirclemagazine.org/issue-21-shell-script/

Дополнительная информация:

sed - http://www.grymoire.com/Unix/Sed.html

awk - http://www.linuxjournal.com/article/8913 или http://www.linuxfocus.org/English/September1999/article103.html

cut - http://learnlinux.tsf.org.za/courses/build/shell-scripting/ch03s04.html

Инструкцию по использованию любой команды можно посмотреть так:

man [command]

это очень полезно, если вы не уверены, как правильно выполнять команду.

Lucas научился всему, что знает, ломая систему, которую потом приходится учиться восстанавливать. Когда есть время, он также ведёт блог* http://lswest-ubuntu.blogspot.com.