Практическое написание сценариев командной оболочки Bash/Код-сниппеты: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 922:
==== Утилита column ====
 
Одной из утилит пакета [[w:util-linux|util-linux]] является утилита <code>column</code>. Данная утилита позволяет представлять данные колонками. Это очень удобный инструмент для быстрого формирования простых таблиц. К сожалению, данная утилита имеет отличия в реализации между Debian-подобными дистрибутивами и Cent OS подобными. В основном отличие кроется в интерпретации строки разделителей полей.
;Код
<source lang=bash>
 
Для примера пусть мы имеем следующий файл со списком контактов. Наша задача представить его таблицей.
</source>
<source>
# File: contacts.txt
Alice Brown :1989/04/03 :Accountant :555-1268
Samanta Smith :1995/12/01 :Copywriter :555-1233
John Berkley :1969/06/12 :Boss :555-1201
 
Matthew Tucker :1988/11/01 :Technician : 555-1230
;Описание
 
</source>
Следующей командой
<source lang=bash>
$ (printf "NAME:DATE OF BIRTH:POSITION:PHONE\n"; sed '1d' contacts.txt) | column -t -s ':'
</source>
мы получим
<source>
NAME DATE OF BIRTH POSITION PHONE
Alice Brown 1989/04/03 Accountant 555-1268
Samanta Smith 1995/12/01 Copywriter 555-1233
John Berkley 1969/06/12 Boss 555-1201
Matthew Tucker 1988/11/01 Technician 555-1230
</source>
Здесь шапку для таблицы мы формируем сами. В качестве разделителя мы используем символ двоеточия <code>:</code>, чтобы можно было использовать пробелы в строках с данными. Обратите внимание что команда будет строить таблицу только с опцией <code>-t</code>. Разделитель мы указываем через опцию <code>-s</code>.
 
Обратите внимание, что пустые строки по умолчанию игнорируются, что в общем то нам и нужно (отключается через <code>-e</code>). Единственное, что невозможно исправить без дополнительного программирования, это обрезание лидирующих и завершающих пробелов в полях (обратите внимание на телефон Matthew Tucker). Через разделитель это сделать нельзя, потому что имя у нас строится из двух слов. Кроме того, в заголовках тоже есть пробелы.
;Примеры
 
==== Своя реализация утилиты column ====