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

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

Введение

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

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

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

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

date && ls ~

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

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

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

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

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

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

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

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

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

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

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

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

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

и снова выполним ту же команду:

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

На этот раз вы должны увидеть ASCII-арт коровы, говорящей "Hello, LabEx".

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

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

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

    • which cowsay завершилась с ошибкой, так как cowsay не была установлена.
    • Поскольку левая часть && не выполнилась, cowsay "Hello, LabEx" не была запущена.
    • Неудачное выражение which cowsay && cowsay "Hello, LabEx" активировало ||, поэтому выполнилась команда echo "cowsay is not installed".
  2. После установки:

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

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

Введение в конвейеры (pipelines)

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

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

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: показать только первые 5 строк вывода.

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

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

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

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

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

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

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

Этот конвейер сначала использует grep для поиска строк с "PATH", а затем передает вывод в wc -l для подсчета строк.

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

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

Опция -q заставляет первый grep работать в тихом режиме, поэтому он проверяет наличие совпадения, не выводя строки с "PATH". Если первая команда завершается успешно, второй grep выводит строки, содержащие "HOME".

Попробуем более сложный пример. Мы будем искать строки, содержащие "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 указывает wc подсчитывать строки. Вы должны увидеть число, за которым следует имя файла.

Теперь подсчитаем количество слов в первых 10 строках /etc/passwd:

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

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

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

Вы должны увидеть число, представляющее количество слов.

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

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

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

Вот что делает каждая часть:

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

Вы должны увидеть первые пять строк /etc/passwd, отсортированные по идентификатору пользователя (третье поле).

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

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

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

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

  1. cut -d: -f7 /etc/passwd: извлекает 7-е поле (оболочку) из каждой строки.
  2. sort: сортирует строки в алфавитном порядке.
  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. Продолжая свой путь в Linux, вы найдете бесчисленное множество способов комбинировать эти команды для решения сложных задач обработки текста. Не бойтесь экспериментировать и пробовать новые комбинации!

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

Продолжайте исследовать и удачного обучения Linux!