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)