Журнал LinuxFormat - перейти на главную

LXF146:tut4

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Тренинги Linux

Часть 6: Освоив основы командной строки, пора перейти к продвинутым приемам

и технологиям.



Как мы узнали из предыдущей статьи, командная строка – не покрытый пылью старомодный способ работы с компьютером, необходимость в котором отпала с появлением графического интерфейса, а фантастически гибкая и мощная среда, где за секунды можно выполнить действия, эквивалентные сотням щелчков мыши. Кроме того, нельзя полагаться на то, что X Window System всегда будет работать правильно – и тогда знание командной строки жизненно необходимо; а если вы запускаете Linux на сервере, то не захотите, чтобы громоздкий графический интерфейс занимал место на диске.

Если вы только начали читать журнал и незнакомы с предыдущими уроками этого цикла, вы найдете их в формате PDF в разделе «Magazine» нашего диска. Читайте их в свое удовольствие, но чтобы вы смогли извлечь максимальную пользу из материала этого номера, советуем сперва прочесть материал предшествовавших уроков.

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


Раздел 1: Перенаправление вывода

При работе в командной строке в подавляющем большинстве случаев нужно выводить результаты на экран. Однако в самом экране нет ничего волшебного, и в терминах UNIX он аналогичен любому другому устройству.

На самом деле, благодаря концепции UNIX «все является файлом», вывод команды можно отправить в файл, а не на экран. Взгляните на эту команду:

uname -a > output.txt

Как мы узнали на предыдущем уроке, команда uname -a выводит информацию о работающей операционной системе. Сама по себе команда выводит результат на экран. Однако с помощью символа «больше» > результат можно не выводить на экран, а перенаправить в файл output.txt. Файл output.txt затем можно открыть в текстовом редакторе или вывести его содержимое на экран командой cat output.txt.

Теперь попробуйте такую команду:

df > output.txt

Заглянув в файл output.txt, вы увидите данные об использовании диска от команды df. Здесь важно отметить, что результат перезаписывается – следов выполнения предыдущей команды uname -a нет. Если вы хотите добавить результаты выполнения команды к содержимому файла, сделайте это так:

uname -a > output.txt
df >> output.txt

Во второй строке двойной знак «больше» >> означает, что данные нужно добавить, а не перезаписать. Таким способом можно сформировать выходной файл из результатов нескольких команд. Данный процесс называется перенаправлением. Однако с выводом команды можно сделать и кое-что другое – отправить ее результат напрямую другой программе, и этот процесс называется канализирование. Предположим, что некая команда, скажем, ls –la, выводит большой объем данных, и вам нужно его просмотреть. С предыдущей командой перенаправления это делается так:

ls -la > output.txt
less output.txt

Список направляется в файл, затем мы просматриваем его утилитой less, прокручивая его содержимое с помощью клавиш управления курсором, и нажимаем q для выхода. Но с помощью каналов эту схему можно упростить, опустив запись во вспомогательный файл:

ls -la | less

Символ канала | не всегда хорошо выглядит на бумаге; его положение бывает разным при разных раскладках клавиатуры, но обычно вы найдете его прервыистым, разделенным на две половинки, и чтобы его набрать, придется нажать Shift+Backslash. Символ канала говорит оболочке, что мы хотим отправить вывод одной команды другой команде – в данном случае, вывод команды ls -la – прямо в less. И less будет считывать не файл, а вывод команды, расположенной перед символом канала.

В ряде ситуаций может понадобиться использовать вывод одной команды как набор аргументов для другой. Например, представьте, что нужно открыть в GIMP все изображения JPEG в текущем каталоге и всех подкаталогах. Для начала создадим их список – это можно сделать командой find:

find . -name “*.jpg”

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

find . -name “*.jpg” | xargs gimp

Также иногда бывает необходимо вывести результат выполнения команды на экран и одновременно перенаправить его в файл. Этого можно добиться с помощью утилиты tee:

free -m | tee output.txt

Здесь результат команды free -m (который показывает потребление памяти, выраженное в мегабайтах) выводится на экран, но также направляется в файл output.txt для последующего просмотра. К команде tee можно добавить параметр -a, чтобы данные были добавлены к выходному файлу, а не перезаписаны.



Раздел 2: Обработка текста

UNIX всегда отлично справлялась с операциями над текстом (и в файлах, и с помощью каналов), и в Linux эта тенденция продолжена. В большинстве дистрибутивов для обработки текстовых потоков есть богатый набор графических утилит, позволяющих взять набор символов и преобразовать его во множество различных форматов. Они часто используются в каналах, и далее мы расскажем о самых важных утилитах, которые необходимо знать для прохождения сертификации LPI.

Сначала посмотрим, как создать поток текста. Если у вас есть файл words.txt со словами Foo bar baz, команда:

cat words.txt

выведет содержимое файла на экран. cat означает «сцепить» [concatenate], и ее можно использовать с перенаправлением или с каналами точно так же, как и команды, рассмотренные ранее. Часто бывает нужен только определенный фрагмент вывода команды, и его можно выделить командой cut [вырезать] таким образом:

cat words.txt | cut -c 5-7

Здесь мы отправляем содержимое words.txt команде cut и велим ей вырезать символы с 5 по (включая) 7. Учтите, что пробелы – тоже символы, и в результате мы увидим bar. Однако это очень частный случай, и вам может понадобиться слово, которое не обязательно начинается с пятого символа в строке (и имеет длину три символа).

К счастью, cut может разбивать текст различными способами. Рассмотрим команду

cat words.txt | cut -d “ “ -f 2

Здесь мы велим cut использовать в качестве разделителя (то есть символа, используемого для отделения полей в тексте) пробел, а затем вывести значение второго поля. Так как наш текст содержит Foo bar baz, в результате мы получим bar. Попробуйте изменить последнее число на 1, и вы получите Foo, или на 3, и вы получите baz.

Ну вот, мы можем задавать положение в отдельной строке текста, но как ограничить число строк в выводе команды? Для этого пригодятся утилиты head и tail. Допустим, вам нужно получить пять файлов наибольшего размера в текущем каталоге: воспользуйтесь ls -lSh для вывода списка файлов, отсортированных по размеру, с размерами в удобном для восприятия формате (т. е. в мегабайтах и гигабайтах, а не просто в байтах).

Однако список-то покажет все файлы, и для больших каталогов в нем легко запутаться. Сократим список командой head:

ls -lSh | head -n 6

Здесь мы велим head ограничить вывод шестью верхними строками; одна из них – заголовок total («Всего»), а за ним последуют пять имен файлов. Заклятый враг этой команды – команда tail, которая делает то же самое, но с конца текстового потока:

cat /var/log/messages | tail -n 5

Приведенная команда демонстрирует пять последних строк файла /var/log/messages. У команды tail есть особенно полезное свойство – возможность отслеживать изменения в файле и оперативно их отображать. Оно называется follow [отслеживание] и используется так:

tail -f /var/log/messages

Команда будет работать, пока вы не нажмете Ctrl+C, и будет постоянно отображать все обновления в файле журнала.

При работе с большими объемами текста часто нужно отсортировать его перед обработкой. На этот случай в любом стандартном дистрибутиве Linux есть команда sort.

Чтобы увидеть ее в действии, создайте файл list.txt со следующим содержимым:

ant
bear
dolphin
ant
bear

Выполнив команду cat list.txt, вы увидите содержимое файла как оно есть. Но стоит выполнить команду

cat list.txt | sort

и строки в файле автоматически выстроятся по алфавиту: две строки ant, две строки bear и одна dolphin. Если добавить опцию -r после команды sort, порядок сортировки будет обратным.

Все это прекрасно, но здесь есть дубликаты, и если они вам не нужны, зачем тратить время на их обработку? К счастью, выход есть – команда uniq и немного колдовства двух каналов. Попробуйте эту команду:

cat list.txt | sort | uniq

Здесь uniq удаляет повторы строк в текстовом потоке, оставляя нетронутыми исходные строки: встретив две или более строк ant, команда удалит все, кроме первой. uniq – невероятно мощная утилита, и у нее есть уйма опций для дальнейшего изменения вывода: например, uniq -u покажет только строки, которые никогда не повторялись, а uniq -c покажет номер строки рядом с каждой строкой. Команда uniq очень удобна при обработке файлов журналов и удалении лишних данных в выводе команд.

Вернемся к изменению формата текста. Откройте ранее использованный файл list.txt, скопируйте его содержимое и вставьте его несколько раз, чтобы в файле стало около 100 строк. Сохраните его и выполните команду:

cat list.txt | fmt

Здесь утилита fmt форматирует текст различными способами. По умолчанию, она берет наш список – разделенный символами перевода строки – и записывает результат как равномерный блок текста, форматируя его по ширине окна терминала. Шириной текста мы можем управлять флагом -w, например, cat list.txt | fmt -w 30. Теперь строки будут не шире 30 символов.

Если вы любитель статистики, вам понадобится способ подсчитывать строки в выходном потоке. Есть два способа это сделать, с помощью утилит nl и wc. Первая утилита – весьма непосредственный метод: номера строк просто добавляются к началу потока. Например, команда

cat /var/log/messages | nl

выводит текстовое содержимое файла /var/log/messages с номерами строк в начале каждой строки. Если вы хотите видеть не вывод, а только номера, примените утилиту wc следующим образом:

cat /var/log/messages | wc -l

(В конце – дефис и маленькая буква “L”.) wc – сокращение от word count (число слов), и если запустить утилиту без флага -l для показа строк, вы получите более подробную информацию по словам, строкам и символам в текстовом потоке.



Занимательное форматирование

Одна из задач, которую вам как подготовленному администратору Linux придется выполнять часто – сравнивать содержимое настройки и файлов журналов.

Если вы опытный программист, то прибегнете к утилите diff, но более простая утилита, которая показывает, какие строки совпадают в двух файлах – это join. Создайте текстовый файл file1 со строками bird, cat и dog. Затем создайте file2 с adder, cat и horse. Затем выполните команду:

join file1 file2

Выведется слово cat, т. к. только оно присутствует в обоих файлах. Чтобы сравнение было нечувствительным к регистру, используйте флаг -i.

Для разделения файлов есть команда под названием split – она годится и для текстовых, и для двоичных файлов. Для первых можно задать число строк, которые нужно выделить в файл, флагом -l, таким образом:

split -l 10 file.txt

Эта команда разобьет file.txt на отдельные файлы по 10 строк в каждом, с именами xaa, xab, xac и т. д. – их количество зависит от размера исходного файла. То же самое можно делать с нетекстовыми файлами – это удобно, когда нужно передать файл на носителях, не поддерживающих файлы большого размера. Например, USB-брелки, отформатированные под FAT32, имеют ограничение на размер файла в 4 ГБ, и если у вас есть файл в 6 ГБ, его придется разбить на две части – команда

split -b 4096m largefile

так и делает: первая часть, xaa, будет содержать фрагмент размером 4 ГБ (4096 МБ), а вторая – все остальное. После переноса этих фрагментов на целевой компьютер можно собрать их, добавив второй файл к первому таким образом:

cat xab >> xaa

Теперь xaa содержит исходные данные, и его можно переименовать.

И кое-что еще...

Наконец, упомянем еще несколько утилит, которые могут всплыть при сдаче экзамена LPI. Для просмотра двоичных данных файла пригодятся утилиты hd и od — для генерации шестнадцатеричного и восьмеричного потока соответственно. На страницах справки приведено большое количество доступных флагов и настроек.

Затем есть утилита paste, которая берет несколько файлов и размещает их строки друг рядом с другом, разделенные пробелами, и утилита pr, умеющая форматировать текст для печати. Наконец, есть еще tr, утилита для изменения или удаления отдельных символов в текстовом потоке.

Персональные инструменты
купить
подписаться
Яндекс.Метрика