Linux. Командная строка. Лучшие практики - Дэниел Джей Барретт - E-Book

Linux. Командная строка. Лучшие практики E-Book

Дэниел Джей Барретт

0,0

Beschreibung

Перейдите на новый уровень работы в Linux! Если вы системный администратор, разработчик программного обеспечения, SRE-инженер или пользователь Linux, книга поможет вам работать быстрее, элегантнее и эффективнее. Вы научитесь создавать и запускать сложные команды, которые решают реальные бизнес-задачи, обрабатывать и извлекать информацию, а также автоматизировать ручную работу. Узнайте, что происходит внутри командной оболочки Linux. Вне зависимости от используемых команд, вы повысите эффективность работы в Linux и станете более конкурентоспособным специалистом.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 274

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Дэниел Джей Барретт
Linux. Командная строка. Лучшие практики

Переводчик А. Гаврилов

Дэниел Джей Барретт

Linux. Командная строка. Лучшие практики. — СПб.: Питер, 2023.

ISBN 978-5-4461-2300-1

© ООО Издательство "Питер", 2023

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

Предисловие

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

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

Командная строка — самый простой и вместе с тем самый сложный из интерфейсов. Он прост, потому что содержит только приглашение командной строки, которое ждет ваших действий1:

$

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

$ ls

так и для более сложных, например:

$ paste <(echo {1..10}.jpg | sed 's/ /\n/g') \

        <(echo {0..9}.jpg | sed 's/ /\n/g') \

  | sed 's/^/mv /' \

  | bash

Если вы смотрите на предыдущую команду и думаете: «Чтоэто, черт возьми?» или «Мне бы никогда не понадобилась такая сложная команда», то эта книга для вас2.

Чему вы научитесь

Эта книга поможет вам быстро и эффективно освоить три основных навыка:

• Выбор и создание команд для решения текущей задачи.

• Эффективный запуск команд.

• Удобная навигация по файловой системе Linux.

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

• Построение сложных команд из простых, шаг за шагом, для решения практических задач, например управления паролями или создания тысяч тестовых файлов.

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

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

• Управление из командной строки теми операциями в Linux, которые обычно выполняются мышкой. Например, копирование и вставка с помощью буфера обмена или получение и обработка веб-данных. И все это, не отрывая рук от клавиатуры.

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

Чем эта книга не является

Эта книга не поможет оптимизировать и не сделает эффективнее ваш компьютер с установленной операционной системой Linux. Она лишь сделает вас более эффективными при использовании Linux.

Эта книга также не является исчерпывающим справочником по командной строке. Существуют сотни команд и функций, которые здесь не упомянуты. Эта книга об опыте. Она содержит тщательно отобранный набор практических знаний о командной строке для развития ваших навыков. В качестве справочного руководства используйте мою предыдущую книгу Linux Pocket Guide (издательство O'Reilly).

Для кого эта книга

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

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

• Создание и редактирование текстовых файлов с помощью редакторов vim (vi), emacs, nano, pico.

• Основные команды для работы с файлами, такие как cp (копирование), mv (перемещение или переименование), rm (удаление), chmod (изменение прав доступа).

• Основные команды для просмотра фалов, такие как cat (вывод содержимого файла) и less (постраничный вывод текста).

• Основные команды для работы с каталогами, такие как cd (переход в другой каталог), ls (вывод списка файлов и каталогов), mkdir (создание каталога), rmdir (удаление каталога), pwd (вывод пути к текущему каталогу).

• Основы сценариев командной оболочки: хранение команд Linux в файле, создание исполняемого файла (с помощью chmod 755 или chmod +x) и его запуск.

• Просмотр встроенной документации Linux, известной как man-страницы, с помощью команды man (например, man cat отображает документацию по команде cat).

• Умение стать суперпользователем с помощью команды sudo для полного доступа к операционной системе (например, команда sudo nano /etc/hosts позволяет редактировать файл /etc/hosts, изменение которого запрещено обычному пользователю).

Если вы также знакомы с общими функциями командной строки, такими как сопоставление имен файлов с шаблоном (символы * и ?), перенаправление ввода/вывода (< и >) и каналы (|), то вы уже хорошо подготовлены к изучению этой книги.

Ваша командная оболочка

Предполагается, что вашей командной оболочкой является bash, которая используется по умолчанию в большинстве дистрибутивов Linux. Под термином «оболочка» в тексте имеется в виду именно bash. Большинство идей, представленных в книге, применимы и к другим оболочкам, таким как zsh или dash (см. Приложение Б для перевода примеров в другие оболочки). Большая часть материала будет работать без изменений и в Apple Mac-терминале, который по умолчанию запускает zsh, но также может запускать и bash3.

Условные обозначения

В этой книге используются следующие условные обозначения.

Курсив

Курсивом выделены новые термины и важные понятия, а также имена файлов и каталогов.

Моноширинный шрифт

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

Моноширинный полужирный шрифт

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

Моноширинный курсив

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

Моноширинный шрифт в рамке

Используется для привлечения внимания к отдельным частям листингов.

Шрифт без засечек

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

   Этот рисунок указывает на совет или предложение.

   Этот рисунок указывает на примечание.

   Этот рисунок указывает на предупреждение.

Использование исходного кода примеров

Вспомогательные материалы (примеры кода, упражнения и т.д.) доступны для загрузки по адресу:https://efficientlinux.com/examples. Если у вас возникнут вопросы технического характера по использованию примеров кода, направляйте их по электронной почте на адрес [email protected].

В общем случае все примеры кода из книги вы можете использовать в своих программах и в документации. Вам не нужно обращаться в издательство за разрешением, если вы не собираетесь воспроизводить существенные части программного кода. Если вы разрабатываете программу и используете в ней несколько фрагментов кода из книги, вам не нужно обращаться за разрешением. Но для продажи или распространения примеров из книги вам потребуется разрешение от издательства O'Reilly. Вы можете отвечать на вопросы, цитируя данную книгу или примеры из нее, но для включения существенных объемов программного кода из книги в документацию вашего продукта потребуется разрешение.

Мы рекомендуем, но не требуем добавлять ссылку на первоисточник при цитировании. Под ссылкой на первоисточник мы подразумеваем указание авторов, издательства и ISBN.

За разрешением на использование значительных объемов программного кода из книги обращайтесь по адресу [email protected].

1 Для отображения приглашения командной строки в этой книге используется символ $. В вашей операционной системе этот символ может быть другим.

2 Вы узнаете назначение этой таинственной команды в главе 8.

3 Версия bash для macOS устарела, в ней отсутствуют важные функции. Чтобы обновить bash, см. статью Дэниела Вейбеля (Daniel Weibel) Upgrading Bash on macOS (https://oreil.ly/35jux).

Благодарности

Эту книгу было приятно писать. Спасибо замечательным людям из издательства O'Reilly, особенно редакторам Вирджинии Уилсон (Virginia Wilson) и Джону Девинсу (John Devins), редакторам производства Кейтлин Геган (Caitlin Ghegan) и Грегори Хайману (Gregory Hyman), контент-менеджеру Кристен Браун (Kristen Brown), редактору Киму Уимпсетту (Kim Wimpsett), редактору предметного указателя Сью Клефстад (Sue Klefstad) и всегда готовой помочь команде производственного отдела. Я также очень благодарен рецензентам книги Полу Байеру (Paul Bayer), Джону Бонезио (John Bonesio), Дэну Риттеру (Dan Ritter) и Карле Шредер (Carla Schroder) за ценные комментарии и критические замечания. Также спасибо Boston Linux Users Group за предложения по названию. Особая благодарность Мэгги Джонсон (Maggie Johnson) из Google за ее любезное разрешение написать книгу.

Я бы хотел выразить глубочайшую благодарность Чипу Эндрюсу (Chip Andrews), Мэтью Диазу (Matthew Diaz) и Роберту Странду (Robert Strandh), которые 35 лет назад учились со мной в Университете Джонса Хопкинса (The Johns Hopkins University). Они заметили мой растущий интерес к операционной системе Unix и, к моему крайнему удивлению, порекомендовали Департаменту компьютерных наук (Computer Science Department) нанять меня в качестве системного администратора. Их вера в меня изменила траекторию моей жизни (кстати, благодаря Роберту добавлен совет касательно навыков слепой печати в главе 3). Спасибо также тем, кто создает и поддерживает проекты Linux, GNU Emacs, Git, AsciiDoc и многие другие инструменты с открытым исходным кодом — без этих умных и щедрых людей моя карьера действительно была бы совсем другой.

Как всегда, спасибо моей замечательной семье, Лизе и Софии, за их любовь и терпение.

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected](издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

Часть 1. Основные понятия

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

Глава 1. Объединение команд

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

Командная строка в Linux работает по-другому. Вместо больших приложений с множеством функций Linux предоставляет тысячи небольших команд с ограниченным набором возможностей. Команда cat, например, выводит на экран содержимое файлов и больше ничего. ls отображает список файлов в каталоге, mv переименовывает файлы и т.д. Каждая команда имеет простую, четко определенную цель.

Что делать, если вам нужно произвести более сложные действия? Не волнуйтесь, Linux позволяет легко объединять команды, чтобы их функции работали вместе для достижения поставленной цели. Такой способ порождает совсем другое отношение к работе за компьютером. Вместо того чтобы спрашивать себя «Какое приложение мне запустить?» для достижения необходимого результата, возникает вопрос: «Какие команды мне объединить?»

В этой главе вы узнаете, как упорядочивать и запускать команды в различных комбинациях, чтобы решать поставленные задачи. Для простоты начнем с шести команд Linux и их основных способов применения. Это позволит сосредоточиться на более сложной и интересной части — их объединении — без долгого обучения. Это все равно, что учиться готовить, используя только шесть ингредиентов, или осваивать столярное дело с применением только молотка и пилы (дополнительные команды добавятся в ваш набор в главе 5).

Вы будете объединять команды, используя канал (pipe) — функцию Linux, которая соединяет вывод одной команды с вводом другой. При представлении каждой команды (wc, head, cut, grep, sort и uniq) мы сразу же будем рассматривать пример использования канала. Некоторые примеры будут полезны для повседневной работы в Linux, в то время как другие являются искусственно выдуманными для демонстрации важной функции.

Ввод, вывод и каналы

Большинство команд Linux считывают ввод с клавиатуры, отображают вывод на экране или делают и то, и другое. В Linux эти операции чтения и записи имеют собственные названия:

stdin (стандартный ввод, или стандартный входной поток)

Поток данных, который Linux считывает при вводе с клавиатуры. Когда вы вводите любую команду в терминале после приглашения командной строки, вы передаете данные в стандартный входной поток stdin.

stdout (стандартный вывод, или стандартный выходной поток)

Поток данных, который Linux выводит на ваш дисплей. Когда вы запускаете команду ls для печати имен файлов, результаты появляются в стандартном выходном потоке stdout.

Теперь самое интересное. Вы можете подключить стандартный вывод одной команды к стандартному вводу другой, чтобы первая команда передавала свои выходные данные во вторую. Давайте начнем со знакомой команды ls -l для просмотра большого каталога, такого как /bin, в длинном формате:

$ ls -l /bin

total 12104

-rwxr-xr-x 1 root root 1113504 Jun  6  2019 bash

-rwxr-xr-x 1 root root  170456 Sep 21  2019 bsd-csh

-rwxr-xr-x 1 root root   34888 Jul  4  2019 bunzip2

-rwxr-xr-x 1 root root 2062296 Sep 18  2020 busybox

-rwxr-xr-x 1 root root   34888 Jul  4  2019 bzcat

-rwxr-xr-x 1 root root    5047 Apr 27  2017 znew

Этот каталог содержит значительно больше файлов, чем, строк на вашем дисплее, поэтому вывод быстро прокручивается за пределы экрана. Жаль, что ls не может печатать информацию по одному экрану за раз, делая паузу, пока вы не нажмете клавишу для продолжения. Но постойте: у другой команды Linux есть такая возможность. Команда less отображает файл по одному экрану за раз:

$ less myfile

Вы можете соединить эти две команды, потому что ls передает данные в стандартный вывод, а less может считывать данные из стандартного ввода. Используем канал для отправки выходных данных ls на вход команды less:

$ ls -l /bin | less

Что такое команда?

Слово команда имеет три различных значения в Linux, представленные на рис. 1.1:

Программа

Исполняемая программа, названная и выполняемая одним словом, например ls, или аналогичная функция, встроенная в оболочку, например cd (встроенная команда оболочки)4.

Простая команда

Имя программы или встроенной команды оболочки, за которым могут следовать аргументы, например ls -l /bin.

Комбинированная команда

Несколько простых команд, рассматриваемых как единое целое, например конвейер ls -l /bin | less

Рис. 1.1. Программы, простые команды и комбинированные команды называются «командами»

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

Эта объединенная команда отображает содержимое каталога по одному экрану за раз. Вертикальная черта (|) между командами — это символ5 канала в Linux. Он соединяет стандартный вывод первой команды со стандартным вводом следующей. Командная строка, содержащая каналы, называется конвейером (pipeline).

Команды обычно не знают, что они являются частью конвейера. ls считает, что выводит данные на дисплей, хотя на самом деле ее вывод был перенаправлен на less. А less верит, что читает данные с клавиатуры, когда на самом деле получает вывод ls.

Шесть команд для начала

Использование каналов — неотъемлемая часть работы с Linux. Давайте развивать ваши навыки работы с каналами с помощью небольшого набора команд Linux. Когда вы столкнетесь с какими-то из этих команд в будущем, то будете готовы их объединять.

Команды wc, head, cut, grep, sort и uniq имеют множество опций и режимов работы, про которые пока умолчим, чтобы сосредоточиться на каналах. Если хотите узнать больше о конкретной команде, запустите команду man, которая отобразит полную документацию. Например:

$ man wc

Для демонстрации этих шести команд в действии будем использовать файл с именем animals.txt, в котором перечислены некоторые сведения из книг издательства O'Reilly. Содержимое файла представлено в примере 1.1.

Пример 1.1. Содержимое файла animals.txt

python    Programming Python        2010  Lutz, Mark

snail     SSH, The Secure Shell     2005  Barrett, Daniel

alpaca    Intermediate Perl         2012  Schwartz, Randal

robin     MySQL High Availability   2014  Bell, Charles

horse     Linux in a Nutshell       2009  Siever, Ellen

donkey    Cisco IOS in a Nutshell   2005  Boney, James

oryx      Writing Word Macros       1999  Roman, Steven

Каждая строка содержит четыре факта о какой-либо книге издательства O'Reilly, разделенные одним символом табуляции: животное на обложке, название книги, год публикации и имя первого автора.

Команда #1: wc

Команда wc выводит количество строк, слов и символов в файле:

$ wc animals.txt

  7 51 325 animals.txt

wc сообщает, что в файле animals.txt 7 строк, 51 слово и 325 символов. Если вы посчитаете символы, включая пробелы и табуляции, то найдете только 318  символов, но wc также учитывает скрытые символы новой строки.

Опции -l, -w и -c указывают wc печатать только количество строк, слов и символов соответственно:

$ wc -l animals.txt

7 animals.txt

$ wc -w animals.txt

51 animals.txt

$ wc -c animals.txt

325 animals.txt

Вывод параметров текста — настолько полезная и часто встречающаяся задача, что авторы wc разработали свою команду специально для работы с каналами. Если вы не указываете имя файла, она читает данные из стандартного ввода и отправляет данные в стандартный вывод. Давайте воспользуемся ls для вывода содержимого текущего каталога и используем wc для подсчета строк. Этот конвейер отвечает на вопрос «Сколько файлов в моем текущем каталоге?»:

$ ls -1

animals.txt

myfile

myfile2

test.py

$ ls -1 | wc -l

4

Опция -1, указывающая ls выводить результаты в один столбец, здесь не обязательна. Чтобы узнать, почему мы ее использовали, см. врезку «ls меняет свое поведение при перенаправлении вывода» на с. 23.

wc — это первая команда, с которой мы познакомились в этой главе, поэтому пока сложно использовать каналы. Ради интереса направим вывод wc самой себе, чтобы продемонстрировать, что одна и та же команда может появляться в конвейере более одного раза. Эта комбинированная команда сообщает, что количество слов в выводе wc равно четырем (три целых числа и имя файла):

$ wc animals.txt

  7 51 325 animals.txt

$ wc animals.txt | wc -w

4

Не будем останавливаться. Добавим третий вызов wc в конвейер и посчитаем количество строк, слов и символов в выводе 4:

$ wc animals.txt | wc -w | wc

     1       1       2

ls меняет свое поведение при перенаправлении вывода

В отличие от большинства других команд Linux, ls знает, выводит ли она данные на экран или перенаправляет в канал. Когда stdout — это экран, ls упорядочивает вывод в несколько колонок для удобства чтения:

$ ls /bin

bash      dir       kmod     networkctl       red      tar

bsd-csh   dmesg     less     nisdomainname    rm       tempfile

При перенаправлении stdoutls создает одну колонку. Убедимся в этом, передав вывод ls команде, которая воспроизводит свой ввод, такой как cat6:

$ ls /bin | cat

bash

bsd-csh

bunzip2

busybox

Это может привести к неожиданным результатам, как в следующем примере:

$ ls

animals.txt myfile myfile2 test.py

$ ls | wc -l

4

Первая команда ls выводит все имена файлов в одну строку, а вторая сообщает, что выводятся четыре строки. Если вы не знаете об особых свойствах ls, это несоответствие может удивить.

ls позволяет переопределить свое поведение по умолчанию. Вы можете заставить ls вывести на экран одну колонку с помощью параметра -1 или несколько колонок с параметром -C.

Вывод указывает на одну строку (содержащую число 4), одно слово (само число 4) и два символа. Почему два? Потому что строка 4 заканчивается скрытым символом новой строки.

Думаю, что достаточно простейших конвейеров с wc. По мере того как мы изучим больше команд, конвейеры станут более практичными.

Команда #2: head

Команда head выводит первые строки файла. Выведем первые три строки файла animals.txt, используя head с параметром -n:

$ head -n3 animals.txt

python   Programming Python       2010     Lutz, Mark

snail    SSH, The Secure Shell    2005     Barrett, Daniel

alpaca   Intermediate Perl        2012     Schwartz, Randal

Если вы запрашиваете больше строк, чем содержится в файле, head выведет весь файл (как это делает cat). Если вы опустите параметр -n, заголовок по умолчанию будет состоять из 10 строк (-n10).

Сама по себе функция head удобна для просмотра начала файла, когда вас не интересует остальное содержимое. Эта команда работает быстро и эффективно даже с очень большими файлами, поскольку ей не нужно считывать весь файл. Кроме того, head умеет считывать данные из стандартного ввода и использует стандартный вывод, что делает ее полезной в конвейерах. Подсчитаем количество слов в первых трех строках файла animals.txt:

$ head -n3 animals.txt | wc -w

20

Обычное использование head заключается в сокращении вывода данных от другой команды, когда вам не нужно видеть полную информацию, например длинный список каталогов. Перечислим первые пять имен файлов в каталоге /bin:

$ ls /bin | head -n5

bash

bsd-csh

bunzip2

busybox

bzcat

Команда #3: cut

Команда cut выводит одну или несколько колонок из файла. Например, выведем все названия книг, которые расположены во второй колонке файла animals.txt:

$ cut -f2 animals.txt

Programming Python

SSH, The Secure Shell

Intermediate Perl

MySQL High Availability

Linux in a Nutshell

Cisco IOS in a Nutshell

Writing Word Macros

Команда cut поддерживает два способа определения, что считать колонкой. Первый — разделение по полям (-f), когда входные данные состоят из строк (полей), каждая из которых разделена одним символом табуляции. Именно такой формат используется в файле animals.txt. Команда cut из предыдущего примера печатает второе поле каждой строки благодаря опции -f2.

Чтобы сократить вывод, передадим его в head. Выведем на экран только первые три строки:

$ cut -f2 animals.txt | head -n3

Programming Python

SSH, The Secure Shell

Intermediate Perl

Вы также можете вырезать несколько полей, разделив их номера запятыми:

$ cut -f1,3 animals.txt | head -n3

python  2010

snail   2005

alpaca  2012

или указав диапазон значений:

$ cut -f2-4 animals.txt | head -n3

Programming Python        2010    Lutz, Mark

SSH, The Secure Shell     2005    Barrett, Daniel

Intermediate Perl         2012    Schwartz, Randal

Также можно определить колонку для команды cut по положению символа в строке с использованием параметра -c. Выведем первые три символа из каждой строки файла, которые можно указать либо через запятую (1, 2, 3), либо в формате диапазона (1–3):

$ cut -c1-3 animals.txt

pyt

sna

alp

rob

hor

don

ory

Теперь, когда вы ознакомились с основными функциями, попробуем сделать что-нибудь более практичное с помощью команды cut и с использованием каналов. Допустим, что файл animals.txt состоит из нескольких тысяч строк и вам нужно извлечь только фамилии авторов. Сначала выделим четвертое поле — имя и фамилия автора:

$ cut -f4 animals.txt

Lutz, Mark

Barrett, Daniel

Schwartz, Randal

Затем передадим выходные данные снова в команду cut, используя параметр -d (delimiter — разделитель), чтобы изменить символ-разделитель на запятую вместо табуляции. Это позволит выделить только фамилии авторов:

$ cut -f4 animals.txt | cut -d, -f1

Lutz

Barrett

Schwartz

Экономьте время благодаря истории команд и редактированию

Приходилось ли вам набирать одни и те же команды заново? Вместо этого несколько раз нажмите клавишу со стрелкой вверх, чтобы просмотреть команды, которые вы запускали ранее (эта функция оболочки называется историей команд). Когда дойдете до нужной команды, нажмите Enter, чтобы немедленно запустить ее, или сначала отредактируйте, используя клавиши со стрелками влево и вправо для позиционирования курсора и клавишу Backspace для удаления (эта функция называется редактирование командной строки). В главе 3 мы узнаем о значительно более мощных функциях истории команд и редактирования.

Команда #4: grep

grep — чрезвычайно мощная команда, но пока скроем большую часть ее возможностей и ограничимся тем, что она печатает строки, соответствующие заданному шаблону (более подробная информация будет представлена в главе 5). Например, следующая команда отображает строки из файла animals.txt, содержащие текст Nutshell:

$ grep Nutshell animals.txt

horse    Linux in a Nutshell          2009    Siever, Ellen

donkey   Cisco IOS in a Nutshell     2005    Boney, James

Также можно вывести строки, которые не соответствуют заданному шаблону, с опцией -v. Обратите внимание, что строки, содержащие Nutshell, отсутствуют:

$ grep -v Nutshell animals.txt

python       Programming Python       2010    Lutz, Mark

snail        SSH, The Secure Shell    2005    Barrett, Daniel

alpaca       Intermediate Perl        2012    Schwartz, Randal

robin        MySQL High Availability  2014    Bell, Charles

oryx         Writing Word Macros      1999    Roman, Steven

Таким образом, команда grep полезна для поиска определенного текста в некотором списке файлов. Следующая команда печатает строки, содержащие текст Perl, в файлах с расширением .txt:

$ grep Perl *.txt

animals.txt:alpaca       Intermediate Perl    2012    Schwartz, Randal

essay.txt:really love the Perl programming language, which is

essay.txt:languages such as Perl, Python, PHP, and Ruby

В данном случае команда grep нашла три соответствия — в одной строке файла animals.txt и в двух строках файла essay.txt.

grep читает стандартный ввод и записывает стандартный вывод, что делает эту команду идеальной для конвейеров. Допустим, мы хотим узнать, сколько подкаталогов находится в каталоге /usr/lib. Нет простой команды Linux для получения ответа, поэтому создадим конвейер. Начнем с команды ls –l:

$ ls -l /usr/lib

drwxrwxr-x    12 root root   4096 Mar  1  2020 4kstogram

drwxr-xr-x    3 root root    4096 Nov 30  2020 GraphicsMagick-1.4

drwxr-xr-x    4 root root    4096 Mar 19  2020 NetworkManager

-rw-r--r--    1 root root   35568 Dec  1  2017 attica_kde.so

-rwxr-xr-x    1 root root     684 May  5  2018 cnf-update-db

Обратите внимание, что ls -l помечает каталоги буквой d в начале строки. Используем cut, чтобы вывести первый столбец:

$ ls -l /usr/lib | cut -c1

d

d

d

-

-

Затем используем grep, чтобы оставить только строки, содержащие букву d:

$ ls -l /usr/lib | cut -c1 | grep d

d

d

d

Наконец, подсчитаем строки с помощью команды wc — и мы получим ответ, созданный конвейером из четырех команд: /usr/lib содержит 145 подкаталогов:

$ ls -l /usr/lib | cut -c1 | grep d | wc -l

145

Команда #5: sort

Команда sort сортирует строки файла в порядке возрастания (по умолчанию):

$ sort animals.txt

alpaca       Intermediate Perl         2012    Schwartz, Randal

donkey       Cisco IOS in a Nutshell   2005    Boney, James

horse        Linux in a Nutshell       2009    Siever, Ellen

oryx         Writing Word Macros       1999    Roman, Steven

python       Programming Python        2010    Lutz, Mark

robin        MySQL High Availability   2014    Bell, Charles

snail        SSH, The Secure Shell     2005    Barrett, Daniel

или в порядке убывания (с параметром -r):

$ sort -r animals.txt

snail        SSH, The Secure Shell     2005    Barrett, Daniel

robin        MySQL High Availability   2014    Bell, Charles

python       Programming Python        2010    Lutz, Mark

oryx         Writing Word Macros       1999    Roman, Steven

horse        Linux in a Nutshell       2009    Siever, Ellen

donkey       Cisco IOS in a Nutshell   2005    Boney, James

alpaca       Intermediate Perl         2012    Schwartz, Randal

sort может сортировать строки в алфавитном порядке (по умолчанию) или в числовом порядке (с опцией -n). Продемонстрируем это на примере конвейеров, которые вырезают третье поле (год публикации) в animals.txt:

$ cut -f3 animals.txt    несортированный

2010

2005

2012

2014

2009

2005

1999

$ cut -f3 animals.txt | sort -n    по возрастанию

1999

2005

2005

2009

2010

2012

2014

$ cut -f3 animals.txt | sort -nr    по убыванию

2014

2012

2010

2009

2005

2005

1999

Чтобы узнать год выхода самой новой книги в animals.txt, направим вывод sort на ввод head и напечатаем только первую строку:

$ cut -f3 animals.txt | sort -nr | head -n1

2014

Максимальные и минимальные значения

sort и head — мощные партнеры при работе с числовыми данными, если они расположены по одному в каждой новой строке. Вы можете вывести максимальное значение с помощью такого конвейера:

... | sort -nr | head -n1

а минимальное значение с помощью следующего:

... | sort -n | head -n1

Рассмотрим другой пример с использованием файла /etc/passwd, содержащего список пользователей, которые могут запускать процессы в системе7. Создадим список всех пользователей в алфавитном порядке. Первые пять строк выглядят примерно так:

$ head -n5 /etc/passwd

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

smith:x:1000:1000:Aisha Smith,,,:/home/smith:/bin/bash

jones:x:1001:1001:Bilbo Jones,,,:/home/jones:/bin/bash

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

$ head -n5 /etc/passwd | cut -d: -f1

root

daemon

bin

smith

jones

а затем отсортировать их:

$ head -n5 /etc/passwd | cut -d: -f1 | sort

bin

daemon

jones

root

smith

Создадим сортированный список всех имен пользователей, а не только первых пяти из них, заменив head на cat:

$ cat /etc/passwd | cut -d: -f1 | sort

Чтобы определить, есть ли у данного пользователя учетная запись в системе, сопоставим его логин с помощью grep. Пустой вывод означает отсутствие учетной записи:

$ cut -d: -f1 /etc/passwd | grep -w jones

jones

$ cut -d: -f1 /etc/passwd | grep -w rutabaga          пустой вывод

Параметр -w указывает команде grep сопоставлять только слова целиком, а не их части. Если в системе имеется имя пользователя, содержащее jones, например sallyjones2, то команда из примера выше его не отобразит.

Команда #6: uniq

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

$ cat letters

A

A

A

B

B

A

C

C

C

C

$ uniq letters

A

B

A

C

Обратите внимание, что команда uniq сократила первые три строки A до одной A, но оставила последнюю A на месте, потому что она не была соседней с первыми тремя.

С помощью параметра -c можно подсчитать количество повторяющихся строк:

$ uniq -c letters

      3 A

      2 B

      1 A

      4 C

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

$ cat grades

C       Geraldine

B       Carmine

A       Kayla

A       Sophia

B       Haresh

C       Liam

B       Elijah

B       Emma

A       Olivia

D       Noah

F       Ava

Нам нужно вывести на экран оценку, которую получила большая часть студентов (если будет равное количество у нескольких оценок, в вывод попадет первая из них). Начнем с извлечения столбца с оценками с помощью команды cut:

$ cut -f1 grades | sort

A

A

A

B

B

B

B

C

C

D

F

Затем используем команду uniq для подсчета совпадающих строк:

$ cut -f1 grades | sort | uniq -c

      3 A

      4 B

      2 C

      1 D

      1 F

Затем отсортируем строки в порядке убывания, чтобы переместить наиболее часто встречающуюся оценку в верхнюю строку:

$ cut -f1 grades | sort | uniq -c | sort -nr

      4 B

      3 A

      2 C

      1 F

      1 D

и оставим только первую строку с помощью команды head:

$ cut -f1 grades | sort | uniq -c | sort -nr | head -n1

      4 B

И наконец, поскольку нам нужна только буквенная оценка, а не количество, извлечем ее с помощью cut:

$ cut -f1 grades | sort | uniq -c | sort -nr | head -n1 | cut -c9

B

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

Обнаружение дубликатов файлов

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

$ ls

image001.jpg image005.jpg image009.jpg image013.jpg image017.jpg

image002.jpg image006.jpg image010.jpg image014.jpg image018.jpg

Ответить на этот вопрос можно с помощью конвейера. Нам понадобится еще одна команда, md5sum, которая проверяет содержимое файла и вычисляет 32-символьную строку, называемую контрольной суммой:

$ md5sum image001.jpg

146b163929b6533f02e91bdf21cb9563 image001.jpg

Контрольная сумма данного файла по математическим законам с очень большой вероятностью будет уникальной. Если два файла имеют одинаковую контрольную сумму, то они почти наверняка являются копиями. Здесь md5sum указывает, что первый и третий файлы являются копиями друг друга:

$ md5sum image001.jpg image002.jpg image003.jpg

146b163929b6533f02e91bdf21cb9563 image001.jpg

63da88b3ddde0843c94269638dfa6958 image002.jpg

146b163929b6533f02e91bdf21cb9563 image003.jpg

Повторяющиеся контрольные суммы легко обнаружить на глаз, когда файлов всего три, но что делать, если их три тысячи? На помощь приходят каналы. Вычислим все контрольные суммы, с помощью cut изолируем первые 32 символа каждой строки и отсортируем строки, чтобы дубликаты располагались рядом друг с другом:

$ md5sum *.jpg | cut -c1-32 | sort

1258012d57050ef6005739d0e6f6a257

146b163929b6533f02e91bdf21cb9563

146b163929b6533f02e91bdf21cb9563

17f339ed03733f402f74cf386209aeb3

Далее добавим команду uniq для подсчета повторяющихся строк:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c

      1 1258012d57050ef6005739d0e6f6a257

      2 146b163929b6533f02e91bdf21cb9563

      1 17f339ed03733f402f74cf386209aeb3

      ⋮

Если нет дубликатов, все результаты подсчета, выведенные на экран командой uniq, будут равны 1. Отсортируем результаты по убыванию, и значения, которые больше 1, будут выведены в верхней части списка:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr

      3 f6464ed766daca87ba407aede21c8fcc

      2 c7978522c58425f6af3f095ef1de1cd5

      2 146b163929b6533f02e91bdf21cb9563

      1 d8ad913044a51408ec1ed8a204ea9502

      ⋮

Теперь давайте удалим все недублированные элементы. Их контрольным суммам предшествуют шесть пробелов, число 1 и один пробел. Мы используем grep -v для удаления этих строк8:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr | grep -v "      1 "

      3 f6464ed766daca87ba407aede21c8fcc

      2 c7978522c58425f6af3f095ef1de1cd5

      2 146b163929b6533f02e91bdf21cb9563

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

Эта команда была бы еще полезней, если бы отображала имена файлов, но для этой операции требуются функции, которые мы еще не обсуждали, вы узнаете о них в разделе «Улучшенный способ обнаружения дубликатов файлов» на с. 112. А пока что идентифицируем файлы с заданной контрольной суммой, выполнив поиск с помощью grep:

$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563

146b163929b6533f02e91bdf21cb9563 image001.jpg

146b163929b6533f02e91bdf21cb9563 image003.jpg

и почистим вывод с помощью cut:

$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563 | cut -c35-

image001.jpg

image003.jpg

Резюме

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

4 Стандарт POSIX называет такие команды утилитами.

5 На стандартной клавиатуре символ вертикальной черты находится на той же клавише, что и обратная косая черта (\), обычно расположенная между клавишами Enter и Backspace или между левой клавишей Shift и Z.

6 В зависимости от ваших настроек ls может использовать также другие функции форматирования, например изменение цвета при выводе на экране. Но не при перенаправлении вывода.

7 Некоторые системы Linux хранят информацию о пользователе в другом месте.

8 Технически команда sort -nr не нужна в этом конвейере, потому что grep удаляет все недублированные элементы.

9 Некоторые команды не используют stdin и stdout и поэтому не могут читать из каналов или записывать в них. Примеры: mv и rm. Однако конвейеры могут использовать эти команды другими способами, примеры рассмотрены в главе 8.