Поставь все на конвейер! 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. После запуска с этим флагом программа не закончит свою работу, а продолжит выводить данные по мере их поступления. Для слежения за логами лучшего решения не найти. |