Pull to refresh

Основы Linux от основателя Gentoo. Часть 2 (4/5): Обработка текста и перенаправления

Reading time 6 min
Views 35K
Original author: Daniel Robbins, Chris Houser, Aron Griffis
В этом отрывке вы узнаете про множество интересных и полезных команд по работе с текстовыми данными в Linux. Также даны основы работы с потоками ввода-вывода в bash.



Навигация по основам Linux от основателя Gentoo:

Часть I
  1. BASH: основы навигации (вступление)
  2. Управление файлами и директориями
  3. Ссылки, а также удаление файлов и директорий
  4. Glob-подстановки (итоги и ссылки)

Часть II
  1. Регулярные выражения (вступление)
  2. Назначения папок, поиск файлов
  3. Управление процессами
  4. Обработка текста и перенаправления
  5. Модули ядра (итоги и ссылки)



Обработка текста


Возвращаемся к перенаправлению


Ранее в этой серии руководств, мы видели пример использования >, оператора для перенаправления вывода команды в файл, как показано ниже:

$ echo "firstfile" > copyme

Помимо перенаправления вывода в файл, мы можем воспользоваться такой мощной фишкой оболочки как каналы (пайпы). Используя пайпы, мы можем передать вывод одной команды на вход другой. Рассмотрим следующий пример:

$ echo "hi there" | wc
1 2 9

Символ | используется для подключения выхода команды слева, ко входу команды справа от него. В примере выше, команда echo печатает в вывод «hi there» с символом перевода строки в конце. Этот вывод обычно появляется в терминале, но канал перенаправляет его на вход команде wc, которая показывает количество строк, слов и символов.

Пример с каналами (пайпами)


Вот другой простой пример:

$ ls -s | sort -n

В этом случае, ls -s обычно вывела бы текущую директорию на терминал, с указанием размера перед каждым файлом. Однако вместо этого, мы передаем вывод программе sort -n, которая численно отсортирует его. Это очень удобно для поиска файлов, которые занимают в директории больше всего места.

Следующие примеры посложнее, они демонстрируют мощь и удобство, которые можно получить используя каналы. Далее мы используем команды, которые еще не были рассмотрены, однако не заостряйте на них свое внимание. Вместо это, сконцентрируйтесь на понимании того, как работают пайпы и как вы можете использовать их в своей повседневной работе с Linux.

Распаковывающий канал


Для разархивации и распаковки файла, вы могли бы сделать следующее:

$ bzip2 -d linux-2.4.16.tar.bz2
$ tar xvf linux-2.4.16.tar


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

$ bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf -

Вуухуу! Сжатый тарбол был распакован и мы обошлись без промежуточного файла.

Канал подлиннее


Вот еще один пример пайпа:

$ cat myfile.txt | sort | uniq | wc -l

Мы используем cat для отправки содержимого myfile.txt команде sort. Когда sort получает данные на вход, она сортирует их построчно в алфавитном порядке, и отправляет в таком виде программе uniq. uniq удаляет повторяющиеся строки (кстати uniq, требует отсортированный список на входе) и отправляет результат на wc -l. Мы рассматривали команду wc ранее, но без ее опций. Когда указывается опция -l, то команда выводит только количество строк, количество слов и символов в этом случае не выводятся. Вы увидите, что такой пайп распечатает количество уникальных строк в текстовом файле.

Попробуйте создать пару файлов в вашем текстовом редакторе. Используйте на них данный пайп и посмотрите на результат который вы получите.

Буря обработки текста начинается!


Теперь мы приступим к беглому осмотру команд Linux для стандартной обработки текстов. Поскольку сейчас мы рассмотрим множество программ, у нас не будет места для примеров по каждой из них. Вместо этого, мы призываем вас прочитать man-станицы приведенных команд (набрав man echo, например) и изучить каждую команду с ее опциями, потратив некоторое время на игру с ними. Как правило, эти команды печатают результат обработки на терминал, а не производят модификацию непосредственно файла. После этого беглого обзора, мы поглубже рассмотрим перенаправление ввода-вывода. Так что да, уже виден свет в конце тунеля. :)

echo печатает свои аргументы на терминал. Используйте опцию -e если хотите включить в вывод управляющие последовательности; например echo -e 'foo\nfoo' напечатает foo, затем перейдет на новую строку, затем снова напечатает foo. Используйте опцию -n чтобы запретить echo добавлять символ новой строки в конец вывода, как это сделано по-умолчанию.

cat напечатает содержимое указанного файла на терминал. Удобна как первая команда пайпа, например, cat foo.txt | blah.

sort выведет содержимое файла, указанного в командной строке, в алфавитном порядке. Естественно, sort также может принимать ввод из пайпа. Наберите man sort чтобы ознакомиться с опциями команды, которые управлют вариантами сортировки.

uniq принимает уже отсортированный файл или поток данных (через пайп) и удаляет повторяющиеся строки.

wc выводит количество строк, слов и символов в указанном файле или во входном потоке (из пайпа). Введите man wc чтобы узнать, как настроить вывод программы.

head выводит первые десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться.

tail печатает последние десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться.

tac похожа на cat, но печатает все строки в обратном порядке, другими словами, последняя строка печатается в первую очередь.

expand конвертирует входные символы табуляции в пробелы. Опция -t указывает размер табуляции.

unexpand конвертирует входные пробелы в символы табуляции. Опция -t указывает размер табуляции.

cut используется для извлечения из входного файла или потока, полей разделенных указанным символом. (попробуйте echo 'abc def ghi jkl' | cut -d ' ' -f2,2 прим. пер.)

Команда nl добавляет к каждой входной строке ее номер. Удобно для распечатки.

pr разбивает файл на страницы и нумерует их; обычно используется для печати.

tr — инструмент трансляции (преобразования) символов; используется для отображения определенных символов во входном потоке на заданные символы в выходной поток.

sed — мощный потоко-ориентированный текстовый редактор. Вы можете узнать больше о sed из следующих руководств на сайте Funtoo:
Если вы планируете сдавать экзамен LPI, обязательно прочитайте первые две статьи этой серии.

awk — искуссный язык построчного разбора и обработки входного потока по заданным шаблонам. Чтобы узнать больше о awk прочитайте следующую серию руководств на сайте Funtoo:
od разработан для представления входного потока в восьмеричном, шестнадцатеричном и т.д. формате.

split — эта команда используется для разделения больших файлов на несколько небольших, более управляемых частей.

fmt используется, чтобы выполнить «перенос» длинных строк текста. Сегодня она не очень полезна, поскольку эта возможность встроена в большинство текстовых редакторов, хотя команда достаточно хороша, чтобы ее знать.

paste принимает два или несколько файлов в качестве входных данных, объединяет построчно и выводит результат. Может быть удобно для создания таблиц или колонок текста.

join похожа на paste, эта утилита позволяет объединять два файла по общему полю (по-умолчанию первое поле в каждой строке).

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

Буря закончилась! Перенаправление


Как и > в командной строке, вы можете использовать < для перенаправления файла, но уже на вход команде. Для многих команд, можно просто указать имя файла. К сожалению некоторые программы работают только со стандартным потоком ввода.

Bash и другие шелы поддерживают концепцию «herefile». Это позволяет давать входные данные команде в виде набора строк с последующей командой, означающей окончание ввода последовательности значений. Проще всего это показать на примере:

$ sort <<END
apple
cranberry
banana
END

apple
banana
cranberry


В приведенном выше примере, мы вводим слова apple, cranberry и banana, с последующим «END» для указания окончания ввода. Затем программа sort возвращается наши слова в алфавитном порядке.

Использование ">>"


Можно ожидать, >> будет в чем-то похожа на <<, но это не так. Она позволяет просто добавить вывод в файл, а не перезаписывать его каждый раз, как это делает >. Пример:

$ echo Hi > myfile
$ echo there. > myfile
$ cat myfile
there.


Уупс! Мы потеряли часть с «Hi»! А вот что мы имели ввиду:

$ echo Hi > myfile
$ echo there. >> myfile
$ cat myfile
Hi
there.


Так то лучше!

Спасибо Dmitry Minsky (Dmitry.Minsky@gmail.com) за перевод.

Продолжение...



Об авторах


Daniel Robbins


Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser


Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Aron Griffis


Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Tags:
Hubs:
+50
Comments 32
Comments Comments 32

Articles