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

Автор оригинала: 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. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 32

    +3
    tac — это шикарно. Не знал )
      0
      В никсах вообще любят название команд в обратном порядке писать к примеру в баше: if fi, case esac…
        0
        я знаю, что любят ) Но конкретно про антипода cat не знал. Думал, что будет dog )
      0
      на самом деле tee для логов использовать не очень удобно, stder в файл не попадет. Хотя, это к пайпам наверное относится. Кстати, никто не знает, как это побороть?
        +2
        find /home -name '*.avi' 2>&1 | tee found-and-errors.log

        2>&1 перенаправляет stderr в stdin
          0
          моя проблема была в том, что не знал, что «2>&1» можно вначале воткнуть. спасибо.
          0
          В конце команды сначала добавьте конструкцию 2>&1 а потом уже общий вывод направляйте конвейером на tee или просто в файл. Конструкция 2>&1 перенаправит поток stderr в stdout, т.е. в stdout получится суммарный поток стандартного вывода и ошибок.

          Это работает одинаково и в линуксовых шеллах, и в виндовом cmd.exe
            0
            объединение потоков так прикольно
            blabla &> /dev/null
          0
          Такое бы руководство, да несколько лет назад!
            0
            Подожду пару дней комменты — потом в mht и на принтер )
            В папочке все предыдущие части уже )
            Потом можно в ванной читать. Хорошее с полезным.
              0
              tar кстати и сам уже умеет разжимать ;) -z -j. Но вот сжимать не всегда. А у bzip реализована работа с pipe?
                0
                Реализована вроде.
                  0
                  для xz уже есть опция -J :-)
                    0
                    но это только gnu tar, некоторые не GNU,
                    понимаю что это блог linux, но например в HP-UXовом, SunOS-вском tar сжималка не встроена.
                      0
                      Сжималка нигде не встроена. Ключи -z -j и -J буквально пропускают файл через соответствующую утилиту после/перед упаковкой/распаковкой соответственно.
                    0
                    вот кстати, если надо удалить дублирующеся строки, не стоит делать sort | uniq
                    сортировка большого файла — это дороговатое по времени удовольствие. куда быстрее окажется awk
                    awk '{ if (!x[$0]) { print $0; x[$0]=1 } }' duplicate.data > unique.data
                    допиленное awk-хакерами до такого:
                    awk '!x[$0]++' duplicate.data > unique.data
                      +1
                      > не стоит делать sort | uniq

                      действительно не стоит, ведь в sort уже есть ключик -u, который даст на выходе только уникальные строки (аналог uniq), и незачем перенаправлять на другую утилиту.
                        0
                        сортировка большого файла — это дороговатое по времени удовольствие. куда быстрее окажется awk

                      +1
                      Для тех кто поленится после прочтения читать маны на приведенные комманды работы с текстом, у tail есть замечательная опция -f которая выводит на экран последнее записаное содержимое файла в реальном времени.
                        0
                        Мне нравится многосмысленная фраза «живет в Нью-Мехико с двумя ЭНЕРГИЧНЫМИ дочерьми» — как хочешь, так и понимай :)
                          0
                          А жену куда-то вы дели. А как тут иначе можно понять? Две девчонки носятся по дому… дети, они такие дети.
                            0
                            Жену опустил для краткости.

                            А что касается как понять иначе — все дело в тонкостях языка. В русском в таком случае говорят «непоседы» или что-то подобное. А энергичные — совсем другой вкус слова.
                              0
                              Непоседа имеет негативный оттенок, нетерпеливый, суетливый.
                              В оригинале «two energetic daughters» и намека на это нет.
                                0
                                Есть устоявшеесе словосочетание «энергичный человек». Не понятно, почему дочери вас смутили.
                                  +2
                                  Напишите «с двумя дочерьми, обладающими высокой кинетической энергией» и все зануды будут удовлетворены… ;)
                                    0
                                    Оно меня не смутило, просто понравилось :) Непоседа про детей не имеет негативного оттенка.

                                    По факту — у русского и английского языка оттенки слов не совпадают. Впрочем, это надо чувствовать.
                                      0
                                      Вот с этим никак не соглашусь. Если бы про моего ребенка сказали, что он непоседа, мне бы это не понравилось. Так обычно называют детей, которые любят дурачится, хулиганить.

                                      Оттенки слов также зависят и от окружения, социального слоя, места действия и периода времени. Я допускаю, что, например, там где вы выросли слово непоседа применялось с положительным смыслом.
                              0
                              а как же grep ?? забыли?
                              за ссылки на sed и awk спасибо.
                                0
                                grep уже был в начале второй части.
                                habrahabr.ru/blogs/linux/102442/
                                  0
                                  Скажите, а когда будет переведена последняя часть?
                                    0
                                    Не могу сказать точно. Я и Дмитрий в настоящий момент довольно сильно загружены работой. Последний отрывок этой части может быть будет готов в ближайшие выходные, может быть на следующие. Затем потихоньку займемся следующей частью.
                                      0
                                      Огромное вам спасибо!!! Вы делаете очень полезную работу. Буду снетерпением ждать продолжения

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое