Bash: использование команды tree для отображения структуры папок

В этой статье описывается базовый синтаксис и приводится пример BASH скрипта с использование оператора CASE.

Что такое shell?

Shell (или «шелл», «командная оболочка») — это не только командный интерпретатор, который обеспечивает интерфейс взаимодействия между пользователем и ядром операционной системы, но и своеобразный язык программирования, в котором присутствуют такие конструкции, как операторы условного ветвления, циклы, переменные и многое другое.

Операционная система (ОС) запускает командную оболочку для каждого пользователя, когда тот входит в систему или открывает окно терминала. Терминал используется для доступа к командной оболочке. Пользователь вводит различные команды в терминал, командная оболочка запускает программы для пользователя, а затем отображает в терминале результат их выполнения. Команды могут быть либо введены непосредственно самим пользователем, либо считаны из файла, называемого shell-скриптом или shell-программой.

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

   разрешения, устанавливаемые по умолчанию для новых файлов;

   значения для переменных, используемых другими программами;

   пути поиска для соответствующих команд;

   различные пользовательские значения.

Команды, синтаксис и примеры

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

Пример передачи аргументов в скрипте Bash

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

sh список песен

Доступ к аргументам осуществляется внутри скрипта с использованием переменных $ 1 , $ 2 , $ 3 и т. Д. Переменная $ 1 ссылается на первый аргумент, $ 2 – на второй аргумент, а $ 3 – на третий аргумент. Это иллюстрируется в следующем примере:

FILE1 = $ 1 wc $ FILE1

Для удобства чтения назначьте переменную с описательным именем значению первого аргумента ( $ 1 ), а затем вызовите утилиту подсчета слов (wc) для переменной $ FILE1 ,

Если у вас есть переменное число аргументов, используйте переменную $ @ , которая является массивом всех входных параметров. Это использует цикл for для итеративной обработки каждого из них, как показано в следующем примере:

для FILE1 в «$ @» do wc $ FILE1 сделано

Вот пример того, как вызвать этот скрипт с аргументами из командной строки:

sh songlist1 songlist2 songlist3

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

sh ‘songlist 1’ ‘songlist 2’ ‘songlist 3’

Флаги Метод

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

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

Читайте также:  Отложенное и регулярное выполнение заданий

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash включает эту функцию с помощью функции getopts. Для приведенного выше примера используйте getopts следующим образом:

, пока getopts u: d: p: f: option do case «$ {option}» in u) USER = $ {OPTARG} ;; < br /> d) DATE = $ {OPTARG} ;; p) PRODUCT = $ {OPTARG} ;; f) FORMAT = $ OPTARG ;; esac выполнено < br />

Это цикл while, который использует функцию getopts и так называемую строку опций – в данном случае u: d: p: f: – для итерации аргументов. Цикл while проходит по строке optstring, которая содержит флаги, используемые для передачи аргументов, и присваивает значение аргумента, предоставленное для этого флага, переменной option . Затем оператор CASE присваивает значение переменной option глобальной переменной, которая используется после прочтения всех аргументов.

Значения для двоеточий

Двоеточие в строке опций означает, что значения необходимы для соответствующих флагов. В приведенном выше примере u: d: p: f: за всеми флагами следует двоеточие. Это означает, что все флаги нуждаются в значении. Если, например, флаги d и f , как ожидается, не будут иметь значения, строкой опций будет u: dp: f .

Двоеточие в начале строки опций (например, : u: d: p: f: ) имеет совершенно другое значение. Он обрабатывает флаги, которые не представлены в строке optstring. В этом случае значение переменной option установлено в ? и значение OPTARG устанавливается на неожиданный флаг. Это отображает подходящее сообщение об ошибке, информирующее вас об ошибке.

Аргументы, которым не предшествует флаг, игнорируются getopts. Если флаги, указанные в строке опций, не предоставляются при вызове скрипта, то ничего не происходит, если вы специально не обработаете этот случай в своем коде. Любые аргументы, не обрабатываемые getops, могут по-прежнему регистрироваться с помощью обычных переменных $ 1 , $ 2 и $ 3 .

Пример BASH Скрипта с Оператором CASE

#!/bin/bash printf ‘Какой Linux дистрибутив Вы знаете? ‘ read DISTR case $DISTR in ubuntu) echo «Я тоже знаю Ubuntu! Эта система основана на Debian.» ;; centos|rhel) echo «Эй! Это мой любимый серверный дистрибутив!» ;; windows) echo «Очень смешно…» ;; *) echo «Хмм, кажется я никогда не использовал этот дистрибутив.» ;; esac

Примеры работы скрипта:

$ ./ Какой Linux дистрибутив Вы знаете? centos Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? rhel Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? ubuntu Я тоже знаю ubuntu! Это операционная система, основанная на Debian. $ ./ Какой Linux дистрибутив Вы знаете? pfff Хмм, кажется я никогда не использовал этот дистрибутив.

Стандартный вывод

Стандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала.

При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке:

echo Пример

Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено:

Пример

При выполнении echo без каких-либо аргументов, возвращается пустая строка.

Пример

Команда объединяет три файла: file1, file2 и file3 в один файл bigfile:

cat file1 file1 file1 > bigfile

Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile.

Синтаксис grep и find

Начнём с оператора find. Синтаксис файловой поисковой команды выглядит так:

Читайте также:  Команда chage в Линукс - синтаксис и примеры

find [где искать] [параметры] [-опции] [действия]

Некоторые употребительные параметры:

  • -depth : поиск в текущей папке и подкаталогах;
  • -version : вывести версию команды;
  • -print : показывать полные имена файлов (в Linux они могут быть сколь угодно большими);
  • -type f : поиск исключительно файлов;
  • -type d – поиск только директорий (папок).
Синтаксис grep и find

Перечень доступных опций (указываются через дефис):

  • name : файловый поиск по имени;
  • user : поиск по имени владельца файла;
  • perm : по атрибуту «режим доступа»;
  • mtime : по времени последнего изменения (редактирования) файла;
  • group : по группе;
  • atime : по дате последнего открытия файла;
  • newer : поиск файла с датой, более новой, чем заданная в шаблоне директивы;
  • size : по размеру файла в байтах;
  • nouser : поиск файлов, не имеющих введённого атрибута «владелец».

Синтаксис grep:

grep [опции] шаблон [где искать]

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

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

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

Синтаксис grep и find

Рассмотрим наиболее употребительные параметры grep:

  • -b : выводить номер блока перед выдачей результирующей строки;
  • -c : необходимо подсчитать число вхождений искомого фрагмента;
  • -i : поиск без учёта регистра;
  • -n : выдавать на стандартное устройство вывода номер строки, в которой найден искомый фрагмент или шаблон;
  • – l : в результате выдачи должны присутствовать только имена файлов с найденным поисковым фрагментом;
  • -s : игнорировать вывод ошибок;
  • -w : поиск фрагмента, опоясанного с двух сторон пробелами;
  • -v : инвертированный поиск, то есть отображение всех строк, не содержащих заданный фрагмент;
  • -e : параметр указывает, что далее следует регулярное выражение, имеющее собственный синтаксис;
  • -An : вывод искомого фрагмента и предыдущих n строк;
  • -Bn : то же, но со строками, идущими после шаблона.

Теперь имеет смысл перейти от теоретической части к практической.3

Утилита MTR

MTR – это альтернатива программе traceroute. Объединяя функции ping и traceroute, mtr позволяет постоянно опрашивать удаленный сервер и отслеживать изменения задержки и производительности с течением времени.

Синтаксис утилиты также несложный:

$ mtr опции адрес_узла

Например:

$ mtr

Вывод похож на traceroute, но mtr имеет существенное преимущество – ее вывод постоянно обновляется. Это позволяет собирать средние показатели, а также отслеживать тенденции и изменения производительности сети. Как и с утилитой ping, mtr будет работать бесконечно. Чтобы прервать работу команды, нужно нажать специальную клавиатурную комбинацию <Ctrl+C>.

Пояснение вывода:

host — имя хоста; Loss% — процент потерь пакетов; Snt — количество отправленных пакетов; Last — время задержки последнего отправленного пакета в миллисекундах; Avg — среднее время задержки; Best — минимальное время задержки; Wrst — максимальное время задержки; StDev — среднеквадратичное отклонение времени задержки;

Полезные опции:

-c <число> — Количество циклов проверки (количество отправленных пакетов по сути); -r — Режим отчета. Программа выполнит указанное при помощи параметра -c количество циклов, выведет отчет и завершит свою работу; -w — Режим расширенного отчета. Результат такой же, как и при использовании опции -r, но длинные имена хостов обрезаться не будут; -s <количество-байт> — Установить размер пакетов для отправки; -n — Не использовать DNS для разрешения имен хостов и отображать вместо них IP-адреса; -o «список-полей» — Отображать только указанные поля и в таком порядке, в котором они были указаны; -p — Выводить информацию построчно, без перерисовки экрана, с разделением полей пробелом. Этот формат удобен, если вы используете какую-то дополнительную программу-парсер или скрипт для анализа, которому передаются данные. -a <IP-адрес> — Указать адрес интерфейса, с которого будут отправляться пакеты; -i <число-секунд> — Интервал между отправляемыми запросами; -u Использовать протокол UDP для отправки пакетов; -4 Использовать только IPv4; -6 Использовать только IPv6.

Читайте также:  Как измерить скорость Интернета на своем компьютере?

Пример № 3: Отображение файлов и каталогов вместе с их полными путями

Вместо того, чтобы отображать только имена файлов и каталогов, вы также можете узнать их точные пути. Вы можете сделать это, просто объединив команду «tree» с флагом «-f» следующим образом:

$ sudo tree –f

Пример № 3: Отображение файлов и каталогов вместе с их полными путями

Пути ко всем файлам и каталогам в нашем текущем рабочем каталоге показаны ниже в виде древовидной структуры. Если бы вы выполняли команду «tree» в каталоге, отличном от «Home», тогда концепция путей была бы более ясной. Однако в нашем случае, поскольку мы выполнили команду «tree», находясь в «домашнем» каталоге, именно поэтому вы можете видеть только «./» вместо пути к файлу или каталогу, поскольку он представляет «домашний» каталог.

Очистка временных файлов

В качестве примера команды trap, ниже показано, как вы можете удалить некоторые файлы и затем выйти, если кто-то попытается прервать программу из терминала —

$ trap «rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit» 2

С того момента, как в программе оболочки будет выполнена эта ловушка, два файла work1 $$ и dataout $$ будут автоматически удалены, если программа получит сигнал № 2.

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

Сигнал № 1 генерируется для зависания . Либо кто-то намеренно вешает трубку, либо она случайно отключается.

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

$ trap «rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit» 1 2

Теперь эти файлы будут удалены, если строка зависнет или будет нажата клавиша Ctrl + C.

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

Таким образом, в предыдущем примере значения WORKDIR и $$ будут подставлены во время выполнения команды trap. Если вы хотите, чтобы эта замена произошла во время получения сигнала 1 или 2, вы можете поместить команды в одинарные кавычки —

$ trap ‘rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit’ 1 2

Примеры использования

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

Поиск текста в файлах

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

User:x:1000:1000:User,,,:/home/User:/bin/bash

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

$ grep -A4 «EE» /var/log/

Выведет строку с вхождением и 4 строчки после нее.

$ grep -C2 «EE» /var/log/

Выведет по две строки с верху и снизу от вхождения.