В этом отрывке вы узнаете про множество интересных и полезных команд по работе с текстовыми данными в Linux. Также даны основы работы с потоками ввода-вывода в bash.
Ранее в этой серии руководств, мы видели пример использования >, оператора для перенаправления вывода команды в файл, как показано ниже:
Помимо перенаправления вывода в файл, мы можем воспользоваться такой мощной фишкой оболочки как каналы (пайпы). Используя пайпы, мы можем передать вывод одной команды на вход другой. Рассмотрим следующий пример:
Символ | используется для подключения выхода команды слева, ко входу команды справа от него. В примере выше, команда echo печатает в вывод «hi there» с символом перевода строки в конце. Этот вывод обычно появляется в терминале, но канал перенаправляет его на вход команде wc, которая показывает количество строк, слов и символов.
Вот другой простой пример:
В этом случае, ls -s обычно вывела бы текущую директорию на терминал, с указанием размера перед каждым файлом. Однако вместо этого, мы передаем вывод программе sort -n, которая численно отсортирует его. Это очень удобно для поиска файлов, которые занимают в директории больше всего места.
Следующие примеры посложнее, они демонстрируют мощь и удобство, которые можно получить используя каналы. Далее мы используем команды, которые еще не были рассмотрены, однако не заостряйте на них свое внимание. Вместо это, сконцентрируйтесь на понимании того, как работают пайпы и как вы можете использовать их в своей повседневной работе с Linux.
Для разархивации и распаковки файла, вы могли бы сделать следующее:
Недостаток такого метода — это создание промежуточного, разархивированного файла на диске. Поскольку tar может читать данные напрямую со своего входа (вместо указанного файла), мы можем получить тот же конечный результат используя пайп:
Вуухуу! Сжатый тарбол был распакован и мы обошлись без промежуточного файла.
Вот еще один пример пайпа:
Мы используем 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». Это позволяет давать входные данные команде в виде набора строк с последующей командой, означающей окончание ввода последовательности значений. Проще всего это показать на примере:
В приведенном выше примере, мы вводим слова apple, cranberry и banana, с последующим «END» для указания окончания ввода. Затем программа sort возвращается наши слова в алфавитном порядке.
Можно ожидать, >> будет в чем-то похожа на <<, но это не так. Она позволяет просто добавить вывод в файл, а не перезаписывать его каждый раз, как это делает >. Пример:
Уупс! Мы потеряли часть с «Hi»! А вот что мы имели ввиду:
Так то лучше!
Спасибо Dmitry Minsky (Dmitry.Minsky@gmail.com) за перевод.
Продолжение...
Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.
Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.
Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Навигация по основам Linux от основателя Gentoo:
Часть I
- BASH: основы навигации (вступление)
- Управление файлами и директориями
- Ссылки, а также удаление файлов и директорий
- Glob-подстановки (итоги и ссылки)
Часть II
- Регулярные выражения (вступление)
- Назначения папок, поиск файлов
- Управление процессами
- Обработка текста и перенаправления
- Модули ядра (итоги и ссылки)
Обработка текста
Возвращаемся к перенаправлению
Ранее в этой серии руководств, мы видели пример использования >, оператора для перенаправления вывода команды в файл, как показано ниже:
$ 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. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».