Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на shell и awk

  Все выпуски  

Шлифуем код — наводим блеск (про awk - 2)


Информационный Канал Subscribe.Ru

Выпуск #6

Шлифуем код — наводим блеск
(про awk - 2)

Давайте не будем откладывать и приведем примеры из предыдущего выпуска рассылки к «товарному виду». Что нам нужно улучшить?
  1. Обеспечить вывод информации по колонкам.
  2. Подавить влияние заголовка команд ls и ps на вывод наших сценариев:
    • заголовок команды ls (total ...) приводит к появлению пустой первой строки (см. пример 5.2);
    • заголовок команды ps (PID TTY TIME CMD) приводит к появлению строки-паразита '1 CMD' (см. пример 5.3).
Обе задачи решаются просто. Первая — путем форматирования вывода с помощью оператора printf:

$ ls -l /bin|awk '{printf "%-14s %9d\n", $9, $5}'

                       0
arch                2872
ash                94364
ash.static        472492
aumix-minimal      10524
awk                    4
basename           10524
bash              519964
bash2                  4
bsh                    3
 ...                                                           Пример 6.1
Вторая — путем использования команды sed (man-страница на русском: ln.com.ua/~openxs/projects/man/uw2/sed.html). Эта команда достойна отдельной рассылки, поэтому приведу сразу готовый рецепт для удаления первой строки (т. е. заголовка):

$ ps -e|sed 1d|awk '{s[$4]++};END {for (i in s) print s[i],i}'

1 syslogd
1 [kswapd]
1 drwebd
1 klogd
1 [mdrecoveryd]
1 gdm
4 login
1 in.telnetd:
6 mingetty
1 bee
1 [bdflush]
1 nmbd
1 xinetd
1 routed
1 smbd
1 [khubd]
1 init
1 ps
6 mgetty
1 bash
1 atd
1 crond
1 portmap
1 awk
3 -uucico
10 drweb
1 [kreclaimd]
1 [ksoftirqd_CPU0]
14 httpd
1 [ksoftirqd_CPU1]
1 [keventd]
1 su
1 -bash
12 sendmail:
8 uucico
1 [kupdated]                                                  Пример 6.2

Примечание.
В юниксах семейства BSD командy ps -e следует заменить на ps axc.

Давайте обсудим оператор printf подробнее. Синтаксис у него следующий:

printf "формат" [, выражение ...]

Форматирование выражений осуществляется в соответствии с указанным форматом — строкой, состоящей из предназначенных для вывода данных и спецификаций, описывающих преобразования, которые необходимо выполнить над выражениями.

Каждая спецификация открывается символом %, а оканчивается буквой — спецификатором преобразования:

c
одиночный символ
d
десятичное число
e
экспонтециальный формат
f
плавающая запятая
g
формат типа e или f с подавлением незначащих нулей
o
беззнаковое восьмиричное число
s
строка символов
x
беззнаковое шестнадцатиричное число
Между % и спецификатором преобразования могут присутствовать необязательные параметры:

[флаги][min_длина_поля][.точность]

В роли флагов могут выступать символы плюс, минус, пробел:

-
выравнивать по левому краю
+
показывать знак числа (плюс для положительных чисел и минус для отрицательных)
пробел
предварять вывод положительных чисел пробелом (а отрицательных минусом)
0
дополнять нулями
Параметр min_длина_поля задает общую длину поля для вывода выражения. Если для его вывода размер поля недостаточен, то поле будет автоматически расширено.

Параметр точность задает либо число отбражаемых после запятой знаков (спецификаторы преобразования f и e), либо число отбражаемых символов (спецификатор преобразования s).

Для вывода символа % необходимо указывать его дважды. Следует также упомянуть, что при описании формата вывода, не только символ % обладает особыми свойствами. Существует также ряд управляющих последовательностей, начинающихся с символа обратной наклонной черты (обратного слэша):

\a
звуковой сигнал (alarm)
\b
возврат на один символ (backspace)
\f
прогон до конца листа (formfeed)
\n
новая строка (newline)
\r
возврат каретки (return)
\t
табуляция
\mmm
символ с восьмеричным кодом mmm (m — цифра от 0 до 7)
Кроме того, символ \ используется для отмены специального действия (экранирования) различных зарезервированных символов. Например, для вывода символов \ и " их необходимо предварить обратной косой чертой: \\ и \".

Домашнее задание.

  1. Применить команду sed к примеру 6.1 и отформатировать вывод в примере 6.2 с помощью оператора printf.
  2. Объсните результаты (правая колонка) работы приведенных ниже операторов:
    printf  "%5.2s\n", 1.2345 |   1.
    printf  "%5.2f\n", 1.2345 | 1.23
    printf  "%5.2e\n", 1.2345 |1.23e+00
    printf "%05.2s\n", 1.2345 |0001.
    printf "%05.2f\n", 1.2345 |01.23
    printf "%05.2e\n", 1.2345 |1.23e+00
    

Ведущий рассылки Big Shadow

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное