Управление последовательностью команд и конвейеры

LinuxBeginner
Практиковаться сейчас

Введение

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

Последовательное выполнение команд

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

Начнем с простого примера. Мы выведем текущую дату, а затем отобразим содержимое вашего домашнего каталога:

date && ls ~

Вот что делает эта команда:

  • date: показывает текущую дату и время.
  • &&: этот символ означает логическое «И». Он приказывает системе запустить следующую команду только в том случае, если первая завершилась успешно.
  • ls ~: выводит список содержимого вашего домашнего каталога (символ ~ является сокращением для домашней директории пользователя).

Введите эту команду в терминал и нажмите Enter. Вы увидите сегодняшнюю дату, а следом — список файлов и папок в вашем домашнем каталоге.

Если после даты список файлов не появился, не переживайте! Возможно, ваш домашний каталог просто пуст. Попробуйте выполнить ls /home/labex, чтобы гарантированно увидеть результат.

Условное выполнение команд

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

Сначала попробуем запустить условную команду с программой, которая еще не установлена:

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

В этой последовательности:

  • which cowsay проверяет наличие программы cowsay в системе.
  • && — логический оператор «И», который выполняет следующую команду только при успехе предыдущей.
  • cowsay "Hello, LabEx" выводит ASCII-графику коровы, произносящей фразу.
  • || — логический оператор «ИЛИ», который выполняет следующую команду только в случае ошибки предыдущей.
  • echo "cowsay is not installed" выводит сообщение о том, что программа не установлена.

Вы должны увидеть сообщение "cowsay is not installed", так как программа еще не установлена.

Теперь установим cowsay:

sudo apt-get update && sudo apt-get install -y cowsay

И запустим ту же команду снова:

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

На этот раз вы увидите корову, говорящую "Hello, LabEx".

Этот пример наглядно показывает работу && и ||. && означает «выполни, если всё прошло успешно», а || — «выполни, если произошла ошибка».

Разберем подробнее, что произошло:

  1. До установки:

    • which cowsay выполнилась (но ничего не нашла).
    • Из-за && была предпринята попытка запустить cowsay "Hello, LabEx", которая провалилась.
    • Поскольку cowsay не сработала, выполнилась команда после || (echo "cowsay is not installed").
  2. После установки:

    • which cowsay завершилась успешно, поэтому сработала команда cowsay "Hello, LabEx".
    • Выполнять команду после || системе не потребовалось.

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

Знакомство с конвейерами

Конвейеры (pipelines) — это мощная функция Linux, позволяющая передавать вывод одной команды на вход другой. Для этого используется символ | (вертикальная черта).

Начнем с простого примера:

ls -l /etc | less

Разбор команды:

  • ls -l /etc: выводит содержимое каталога /etc в подробном формате.
  • |: перенаправляет результат первой команды во вторую.
  • less: программа, позволяющая удобно пролистывать длинные тексты.

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

Теперь попробуем более сложный конвейер:

ls -l /etc | grep '^d' | wc -l

Эта команда подсчитывает количество подкаталогов в /etc. Вот как это работает:

  1. ls -l /etc: формирует подробный список содержимого /etc.
  2. grep '^d': фильтрует строки, оставляя только те, что начинаются с буквы 'd' (так помечаются директории).
  3. wc -l: подсчитывает количество полученных строк (что соответствует количеству папок).

На экране появится число — общее количество директорий в /etc.

Использование cut для извлечения полей

Команда cut незаменима, когда нужно вырезать определенные части из каждой строки файла. Мы используем её для извлечения имен пользователей и их домашних каталогов из файла /etc/passwd, где хранится информация об учетных записях системы.

Выполните следующую команду:

cut -d: -f1,6 /etc/passwd | head -n 5

Разберем параметры:

  • cut: команда для извлечения фрагментов строк.
  • -d:: задает : в качестве разделителя (символа, разделяющего поля).
  • -f1,6: указывает извлечь 1-е и 6-е поля (логин и домашний каталог).
  • |: передает результат дальше.
  • head -n 5: ограничивает вывод первыми пятью строками.

Вы увидите результат, похожий на этот:

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin

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

Сочетание grep с конвейерами и последовательностями

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

Для начала найдем все строки, содержащие "PATH" в вашем файле конфигурации .zshrc, и подсчитаем их количество:

grep "PATH" ~/.zshrc | wc -l

Здесь grep находит нужные строки, а wc -l считает их.

Теперь воспользуемся последовательностью команд, чтобы найти "PATH", и если поиск будет успешным, найти также "HOME":

grep "PATH" ~/.zshrc && grep "HOME" ~/.zshrc

Строки с "HOME" отобразятся только в том случае, если в файле было найдено хотя бы одно упоминание "PATH".

Рассмотрим более сложный пример. Найдем строки, содержащие "bin" в файле /etc/passwd, отсортируем их и выведем первые 5:

grep "bin" /etc/passwd | sort | head -n 5

Этот конвейер выполняет три действия:

  1. Ищет строки с упоминанием "bin".
  2. Сортирует их по алфавиту.
  3. Показывает только первые 5 результатов.

Наконец, объединим всё изученное. Мы поищем строки с "sh" в /etc/passwd, посчитаем их, и в зависимости от результата либо выведем их на экран, либо покажем сообщение:

grep "sh" /etc/passwd | wc -l | {
  read count
  [ $count -gt 5 ] && grep "sh" /etc/passwd || echo "Found $count lines, not enough to display."
}

Эта сложная конструкция делает следующее:

  1. Ищет строки с "sh".
  2. Считает их количество.
  3. Если количество больше 5, выводит сами строки.
  4. Если 5 или меньше — выводит сообщение с указанием найденного количества.

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

Попробуйте запустить эти команды и поэкспериментируйте с собственными комбинациями!

Подсчет с помощью wc

Команда wc (word count) предназначена для подсчета количества строк, слов и байтов в тексте.

Сначала посчитаем количество строк в файле /etc/passwd:

wc -l /etc/passwd

Опция -l указывает на подсчет строк. Вы увидите число и имя файла.

Теперь посчитаем количество слов в первых 10 строках того же файла:

head -n 10 /etc/passwd | wc -w

Этот конвейер работает так:

  1. head -n 10 /etc/passwd: берет первые 10 строк файла.
  2. wc -w: считает количество слов в этом фрагменте.

На выходе вы получите число, соответствующее количеству слов.

Сортировка с помощью sort

Команда sort используется для упорядочивания строк текста. Давайте отсортируем файл /etc/passwd по третьему полю (идентификатор пользователя — UID):

sort -t: -k3 -n /etc/passwd | head -n 5

Разбор параметров:

  • -t:: использовать : как разделитель полей.
  • -k3: сортировать по третьему полю.
  • -n: сортировать как числа (а не по алфавиту).
  • | head -n 5: показать только первые 5 строк.

Вы увидите первые пять записей из /etc/passwd, упорядоченных по возрастанию UID.

Удаление дубликатов с помощью uniq

Команда uniq используется для удаления или поиска повторяющихся строк в отсортированном тексте. Давайте найдем все уникальные типы оболочек (shells), используемые в системе:

cut -d: -f7 /etc/passwd | sort | uniq

Этот конвейер выполняет три шага:

  1. cut -d: -f7 /etc/passwd: извлекает 7-е поле (путь к оболочке).
  2. sort: сортирует строки по алфавиту (обязательно для работы uniq).
  3. uniq: удаляет повторяющиеся строки.

Вы увидите список уникальных путей к оболочкам.

Теперь посчитаем, сколько пользователей используют каждую из оболочек:

cut -d: -f7 /etc/passwd | sort | uniq -c

Опция -c добавляет перед каждой строкой число её повторений. Вы увидите количество пользователей для каждой оболочки.

Резюме

Поздравляем! Вы успешно завершили практическое занятие по выполнению команд и обработке текста в Linux. Давайте подведем итоги того, что вы изучили:

  1. Команды можно запускать последовательно с помощью && и настраивать условия выполнения через ||.
  2. Конвейеры (|) позволяют связывать несколько команд, передавая вывод одной на вход следующей.
  3. cut отлично подходит для извлечения конкретных частей строк из файла.
  4. grep помогает искать заданные шаблоны в тексте.
  5. wc позволяет считать строки, слова и символы.
  6. sort упорядочивает строки текста в нужном порядке.
  7. uniq удаляет дубликаты из отсортированного текста и может подсчитывать количество совпадений.

Эти инструменты являются базовыми для обработки текста в Linux. Продолжая свое знакомство с системой, вы найдете бесчисленное множество способов комбинирования этих команд для решения сложных задач. Не бойтесь экспериментировать и пробовать новые сочетания!

Помните: практика — залог мастерства. Попробуйте использовать эти команды с другими файлами и опциями. Если вы забудете, как работает та или иная команда, вы всегда можете воспользоваться справочником man (например, man grep).

Удачи в дальнейшем изучении Linux!