Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #73, ЯНВАРЬ 2005 г.

Поставь все на конвейер!

j1m (j1m@list.ru)

Хакер, номер #073, стр. 073-100-1


Анализ и преобразование текстовых потоков

*nix славится своими программами-фильтрами. Множество маленьких программок, каждая из которых выполняет только одну определенную функцию, наполняют каталоги /bin и /usr/bin. С помощью таких фильтров, как cut, grep, sed, можно привести к нужному виду практически любой поток текстовой информации. Появившись около тридцати лет назад, они и по сей день активно применяются, что доказывает эффективность конвейерной обработки информации.

Маленькие помощники

Две наиболее часто выполняемые над текстом операции - сортировка и поиск. Начнем с сортировки, а поиск рассмотрим позже. Для сортировки строк применяется команда sort(1) (кто бы мог подумать :), которая читает входной поток и пишет отсортированные строки в выходной поток. У программы есть несколько интересных флагов: -f - игнорировать регистр букв, -d - сортировать только по буквам и цифрам, -n - сортировать по цифрам, -r - обратная сортировка.

Команде можно указать, по какому полю выполнять сортировку. Поля - это последовательности символов, разделенные пробелом или табуляцией. Для этого достаточно указать флаг +номер_поля. Так, можно отсортировать список файлов по размеру:

$ ls -l | sort +5 -n

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

$ echo UNIXLinuxBSD | cut -c 5-10

На экран будет выведено «Linux». Как это работает? С помощью флага -c мы задали диапазон позиций символов, которые хотим увидеть. Слово «Linux» как раз и занимает позиции с пятой по десятую в строке «UNIXLinuxBSD». Одним из основных достоинств cut является способность работать с полями. Для этого предусмотрено два флага: -d разделитель_полей и -f список_полей. С помощью первого можно указать символ, который будет использоваться в качестве разделителя полей (по умолчанию знак табуляции), а с помощью второго - список выводимых полей. Пример:

$ date

Сбт Ноя 13 17:57:08 GMT+6 2004

$ date | cut -d " " -f 4

17:57:08

Здесь мы указали в качестве разделителя полей знак пробела и вывели на STDOUT четвертое поле.

Довольно интересной и полезной программой является tr(1). Она заменяет символы, указанные в первом аргументе, на соответствующие символы во втором аргументе. Так, команда

$ cat file | tr a e

заменит все буквы «a» на «e». Можно использовать диапазоны:

$ cat file | tr 'a-z' 'A-Z'

и заменить все строчные буквы прописными - это, кстати, наиболее частое применение этой команды. Указав флаг -d, можно удалять символы из текста.

Часто бывает необходимо просто подсчитать количество строк или слов в тексте. Это легко проделать при помощи простенькой программки wc(1). По дефолту она печатает количество строк, слов и символов во входном потоке. С помощью флагов можно указать, что именно необходимо вывести на экран: -c - символы, -l - строки или -w - слова.

Отдельно стоит упомянуть о двух программах: head(1) и tail(1). Первая используется для просмотра первых десяти строк файла, а вторая - последних десяти. Программы очень похожи и управляются идентичными флагами. Так, с помощью флага -n можно изменить количество печатаемых строк, а флаг -c позволяет измерять порцию выводимых данных не в строках, а в байтах. Помимо этих ключей, tail принимает очень полезный (и полюбившийся админам) флаг -f. После запуска с этим флагом программа не закончит свою работу, а продолжит выводить данные по мере их поступления. Для слежения за логами лучшего решения не найти.

Содержание  Вперед на стр. 073-100-2
<<< НАЗАД ||| ГЛАВНАЯ