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

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Добро пожаловать в этот практический урок по выполнению команд 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 "Hello, LabEx", но она завершилась неудачей, так как cowsay не был установлен
    • Поскольку cowsay завершился неудачей, была выполнена команда после || (echo "cowsay is not installed")
  2. После установки:

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

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

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

Конвейеры (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", если "PATH" найден:

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 или меньше, показывает сообщение с количеством.

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

Подсчет с использованием 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!