Утилиты работы с текстом

Unix обладает богатым набором утилит для работы с текстом. Некоторые из них позволяют создать на основе текстовых файлов маленькое подобие базы данных. Все утилиты, рассматриваемые в этом разделе, могут работать как с файлами (наборами файлов), так и со стандартным вводом. Часть утилит может работать с двоичными файлами.

Будем рассматривать текстовые файлы как набор записей-строк, возможно, состоящих из полей, разделённых знаками препинания, слов, разделённых пробелами, и букв.

wc – подсчёт строк, слов и букв. По умолчанию выдаёт все три значения. Интересующую величину можно выбрать с помощью опции -l, -w, -c соответственно.

wc -w /etc/passwd # подсчёт слов в файле passwd
ls | wc -l  # подсчёт числа файлов в текущем каталоге

split – разбиение файла на меньшие, определённого размера. Может разбивать текстовые файлы по строкам и любые – по байтам. По умолчанию читает со стандартного ввода и создает файлы с именами вида xaa, xab и т.д. По умолчанию разбиение идёт по 1000 строк в файле.

cat – объединение файлов. Работает не только с текстовыми файлами, но и с двоичными. Возможно объединение содержимого файлов со стандартным вводом. В этом случае в качестве одного или нескольких имен файлов в командной строке указывается знак -. Пример:

echo "------------" | cat file1 - file2 #Вывод содержимого двух файлов, разделённого строкой из минусов

head – выборка первых строк (байтов) файла:

head -n 12 file  # первые  12 строк
head -c 12 file  # первые  12 байтов
head -n -12 file  # с начала, отбросив 12 строк с конца

tail – выборка последних строк (байтов) файла:

tail -n 12 file  # последние  12 строк
tail -c 12 file  # последние  12 байтов
tail -n +12 file # с 12-ой строки до конца

tail и head – объединение команд обеспечивает выборку диапазона строк:

# 24 строки, начиная с 12-ой (с 12 по 35)
tail -n +12 file | head -n 24
# или
head -n 35 file | tail -n 24

cut – выделение столбца. Довольно неудобная команда, ориентированная на файлы с колонками, разделёнными определённым символом (по умолчанию - символом табуляции), или на файлы с колонками в фиксированных позициях. Опции -f - номер колонки для вывода, -d - символ разделитель. Пример:

# Вывод списка домашних каталогов пользователей (шестое поле в файле passwd)
cut -f6 -d':' /etc/passwd

awk – альтернатива cut. Вообще-то, awk – это довольно развитый язык программирования, но в данном случае нас интересует способность awk разбирать строку на элементы, разделённые пробельными символами. Примеры:

awk '{print $9}' #Вырезание девятой колонки
awk '{print $5 $4 $3 $2 $1}'  #Перестановка местами первых пяти колонок

sort– сортировка строк. Полезные опции: -n - числовая сортировка, т.е. 2 идёт раньше чем 11; -kN - сортировка по колонке номер N. Колонки разделяются произвольным числом пробелов и табуляций. Пример:

ls -l | sort -n -k5 #Сортировка списка файлов по размеру (пятая колонка)

uniq – обработка повторяющихся строк. Умеет отбрасывать повторяющиеся строки и подсчитывать число повторов. Удобно применять вместе с sort. uniq может сравнивать строки целиком или начиная с некоторой позиции до конца строки.

grep – поиск строк по образцу. По умолчанию образец интерпретируется как регулярное выражение. Название программы происходит от команды редактора ed "g/re/p" - перейти к строке, содержащей регулярное выражение re и напечатать эту строку. Если нужно искать символы, имеющие особый смысл в регулярном выражении, то их нужно экранировать через слэш. Пример:

echo abc$ | grep c\\$  #Правильно
echo abc$ | grep 'c\$' #Правильно
echo abc$ | grep c$    #Строка не найдена

join – слияние файлов по ключевому полю. Файлы должны быть предварительно отсортированы. Пример слияния файлов file1 и file2, причем в первом файле ключ находится во второй колонке, а в о втором - ключ в третьей колонке:

join -1 2 -2 3 <(sort -k2 file1) <(sort -k3 file2)