Bash. Основные команды.
Основы работы с Linux. -> Команды ввода-вывода.
Основные команды.
Внешний вид приглашения.
username@compname$
$ - не является частью команды и означает что вы под обычным пользователем (# - под рутом)
Позиционные аргументы
Обычно при использовании командной оболочки и запуске команд мы передаем им аргументы или параметры.
Существует механизм извлечения этих параметров из скриптов с помощью $0 $1 $2 и т.д.
В $0 содержится название скрипта, в $1 первый параметр и так далее.
в $# содержится количество параметров.
Часто бывает необходимо переслать параметры из одной команды в другую.
Для этого используются сокращения $* или $@, которые содержат все аргументы.
Если их заключить в двойные кавычки то вместо названий $1, $2 и т.д. будут вставлены значения параметров.
Пример программы testvar.
echo $#
echo $0
echo $1
echo $3
Запуск.
./testvar bash is fun
Проверить чем является команда.
type pwd
type cat
type if
echo - вывод какого нибудь значения (строки или переменной) в стандартный поток вывода.
Запуск команды в фоновым режиме.
Используется символ &
ping 192.168.10.56 > ping.log &
Переменные оболочки и окружения.
Переменные окружения (или переменные среды или оболочки) - это набор пар ключ-значение, которые хранятся в вашем Linux и используются процессами для выполнения определенных операций. Окружение - это область, которую оболочка создает каждый раз при запуске сеанса, содержащего переменные, определяющие системные свойства. Например, это может быть часовой пояс в системе, пути к определенным файлам, приложения по-умолчанию, локали и многое другое. Переменные окружения также могут использоваться в программах оболочки или в подоболочках для выполнения различных операций. Часто в это пространство помещают такие переменные как доступы к БД (логин пароль) или пути к важным файлам и каталогам (например к java машине).
Переменные имеют следующий формат
KEY=value
Имена переменных чувствительны к регистру и вокруг не должно быть пробелов.
Переменные можно разделить на две категории:
Переменные окружения (Environmental Variables) - это переменные, которые определены для текущей оболочки и наследуются любыми дочерними оболочками или процессами. Переменные окружения используются для передачи информации в процессы, которые порождаются из оболочки.
Посмотреть
env
Переменные оболочки (Shell Variables) - это переменные, которые содержатся исключительно в оболочке, в которой они были установлены или определены. Они часто используются для отслеживания эфемерных данных, например, текущего рабочего каталога.
Посмотреть
set
Тут мы получим гигантский вывод, содержащий переменные и функции оболочки поэтому стоит использовать less, чтобы разделить содержимое на страницы:
set | less
Для того, чтобы подставить значение переменной в строку, необходимо использовать знак $ и включить переменную в строку в двойных кавычках.
echo "I am in $PWD dir"
Так же мы можем сохранить вывод командной оболочки с помощью символов $()
MYVAR=$(pwd)
Сдесь команда pwd выполнится в подоболочке и вместо вывода на экран присвоит значение переменной MYVAR
Справка по командам.
man less
Некоторые полезные переменные
USER: текущее имя пользователя, использующего систему
EDITOR: какая программа запускается для редактирования файла на вашем хосте
HOME: домашний каталог текущего пользователя
PATH: список каталогов, разделенных двоеточиями, в которых система ищет команды
PS1: основная строка приглашения (для определения отображения приглашения оболочки)
PWD: текущий рабочий каталог
Например в переменной $SHELL храниться значение командного интерпретатора по умолчанию.
Посмотреть так:
echo $SHELL
или так
printenv SHELL
В Linux у вас есть много разных способов установки переменных окружения в зависимости от того, хотите ли вы сделать их постоянными или нет.
export
Создают или изменяют переменные окружения.
Создать и экспортировать переменную.
export VAR="value"
Используя export, ваша переменная окружения будет установлена для текущего сеанса оболочки. Как следствие, если вы откроете другую оболочку или перезапустите свою систему, переменная окружения больше не будет доступна.
Однако она будет доступна всем процессам, которые порождены текущим терминалом (в отличии от простого присваивания)
Самый популярный способ постоянной установки переменных среды - это добавить их в файл .bashrc. Файл .bashrc - это скрипт, выполняемый всякий раз, когда вы инициализируете сеанс интерактивной оболочки.
После добавления новых переменных перегрузить .bashrc можно командой.
source ~/.bashrc
Существует еще один файл .bash_profile, который запускается при запуске login оболочек, требующих ввода логина и пароля, например ssh.
Чтобы установить общесистемные переменные окружения в Linux (для всех пользователей), вам нужно экспортировать переменные в файл /etc/environment.
Например, чтобы изменить редактор, используемый глобально, вы можете изменить переменную EDITOR в файле окружения.
export EDITOR="vi"
Установить переменную окружения в одной строке.
echo "export VAR="value"" >> ~/.bashrc && source ~/.bashrc
Удалить переменную можно командой unset.
unset USERNAME
Работа в командной строке
Точка (.) - важный символ в командной строке Linux, который обозначает текущий каталог.
Символ ~ - обозначает домашний каталог.
Относительный путь определяется относительно текущего каталога, а абсолютный путь – относительно корневого каталога.
Клавиша Tab используется для автодополнения команд и для вывода возможных вариантов частично введенных команд.
Оболочка bash имеет несколько операторов команд. Наиболее часто используются следующие операторы: < > | || & && ; ;; ()
pwd
Отображает текущий каталог. Аббревиатура от “print working directory”.
uname
Системная информация
uname -a
История команд.
history N - вывод последних N строк истории
!! - запуск последней команды
!string - Выполнение последней команды,
начинающейся со строки string
Ctrl+r - Вызывет обратный последовательный поиск по истории.
Хранится история для каждого пользователя в скрытом файле .bash_history
Переменная окружения HISTSIZE задает оболочке bash количество строк для сохранения в истории.
exec
Запуск команды, замена текущего окружения.
Некоторые полезные команды
Информация о процессоре
cat /proc/cpuinfo
lscpu
Свободное место на диске.
df -h
Обработка текстовых потоков.
cat
Вывод файлов или стандартного ввода в stdout. С помощью этой команды можно очень просто посмотреть содержимое небольшого файла, склеить несколько файлов и многое другое.
Если команде передать несколько файлов, то они выведутся вместе.
Синтаксис
cat опции файл1 файл2
Рассмотрим основные опции:
-b - нумеровать только непустые строки;
-E - показывать символ $ в конце каждой строки;
-n - нумеровать все строки;
-s - удалять пустые повторяющиеся строки;
-T - отображать табуляции в виде ^I;
-h - отобразить справку;
-v - версия утилиты.
Пример вывод лога с нумерацией строк
cat /var/log/nginx/access.log.1 -b
Пример ввода с клавиатуры и перенаправления в файл
cat > test
Для прекращения ввода нажимаем ctrl+D
Объединение файлов.
cat file1 file2 > file3
cut
Программа cut используется для выборки отдельных полей из строк файла. Выборка полей производиться заданием разделителей.
Команда cut позволяет вам вырезать данные по символам, по полю или по столбцу.
-c - символы для извлечения (позиция символа)
-d - разделитель полей (по умолчанию табуляция)
-f - поля для извлечения
Выборка первого столбца с разделитем пробел.
cut -d ' ' -f 1 /var/log/nginx/access.log.1
Вывести всех пользователей в системе.
cut -d: -f1 /etc/passwd
Фильтры текстовых потоков.
head - отображает первые строки
tail - отображает последние строки.
Отобразить последние строки интерактивно.
tail -f /var/log/nginx/access.log.1
sed
Утилиту sed называют потоковым текстовым редактором. В интерактивных текстовых редакторах, наподобие nano, с текстами работают, используя клавиатуру, редактируя файлы, добавляя, удаляя или изменяя тексты. Sed позволяет редактировать потоки данных, основываясь на заданных разработчиком наборах правил.
Схема вызова.
sed options file
По умолчанию sed применяет указанные правила к стандартному потоку ввода.
echo "blablabla" | sed 's/bla/mla/'
echo "blablabla" | sed 's/bla/mla/g'
Маркеры
s - substitute замена
g - глобально
i - без учета регистра
Параметры.
-i - редактировать файл
Передаем команде файл.
sed 's/test/another test' ./myfile
Sed не меняет данные в обрабатываемом файле (если не задан -i). Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в STDOUT.
Для выполнения нескольких действий с данными, используйте ключ -e при вызове sed. Например, вот как организовать замену двух фрагментов текста:
sed -e 's/This/That/; s/test/another test/' ./myfile
Воспользуемся флагом w, который позволяет сохранить результаты обработки текста в файл:
sed 's/test/another test/w output' myfile
Можно вызвать команду замены так, чтобы файл был обработан начиная с некоей строки и до конца:
sed '2,$s/test/another test/' myfile
Удаление строк.
sed '3d' myfile
удаляем диапазон строк
sed '2,3d' myfile
sed '3,$d' myfile
Удаление строк по шаблону.
sed '/test/d' myfile
С помощью sed можно вставлять данные в текстовый поток, используя команды i и a:
Команда i добавляет новую строку перед заданной.
Команда a добавляет новую строку после заданной.
echo "Another test" | sed 'i\First test '
Указание опорной строки.
sed '2i\This is the inserted line.' myfile
Замена строк.
sed '3c\This is a modified line.' myfile
Команда r позволяет вставлять в поток данные из указанного файла.
sed '3r newfile' myfile
Анализ
wc - подсчет
Ключи команды wc
-c - Количество символов в файле
-l - Количество переводов строк
-w - Количество слов
wc filename
nl
Нумерует строки в файле.
paste
Выводит построчно содержимое двух файлов бок о бок для стравнения или слияния.
join
Объеденяет строки в содержимом двух файлов.
join file1.txt file2.txt > newjoinfile.txt
sort
Ее можно использовать для сортировки текста из одного или нескольких файлов или c помощью нее может быть выполнена сортировка вывода linux для какой-либо команды.
Синтаксис
sort опции файл
Вот несколько принципов, по которым команда sort linux сортирует строки:
Строки с цифрами размещаются выше других строк
Строки, начинающиеся с букв нижнего регистра размещаются выше
Сортировка выполняется в соответствии алфавиту
Строки сначала сортируются по алфавиту, а уже вторично по другим правилам.
ОПЦИИ
-b - не учитывать пробелы
-d - использовать для сортировки только буквы и цифры
-i - сортировать только по ASCII символах
-n - сортировка строк linux по числовому значению
-r - сортировать в обратном порядке
-с - проверить был ли отсортирован файл
-o - вывести результат в файл
-u - игнорировать повторяющиеся строки
-m - объединение ранее отсортированных файлов
-k - указать поле по которому нужно сортировать строки, если не задано, сортировка выполняется по всей строке.
-f - использовать в качестве разделителя полей ваш символ вместо пробела.
Отсортируем файлы по дате создания
ls -l | sort -k8
по числовому значению (размеру)
Примеры.
Вывести наиболее большие файлы и директории.
du -a /var | sort -n -r | head -n 10
du -hsx * | sort -rh | head -10
Основы работы с Linux. -> Bash. Команды файловой системы.
Команды файловой системы
cd
Смена директории.
Запуск без параметров бросает в домашний каталог.
Трюк как переопределить поведение в .bashrc
cd () {
builtin cd ${1:+"$@"}
if [ -d "venv" ]
then
source ./venv/bin/activate
fi
}
touch
Изменяет временную метку или создает файл.
rm
Удаляет файл или директорию.
mv
Перемещает файлы или директории.
cp
Копирует файлы или директории.
mkdir
Создает директорию
-p - рекурсивно с поддиректориями
file
Идентификация типа файла. Особенно полезно когда у файла нет расширения. Анализируется “магическое число” (первый блок данных).
Параметры.
-f - читать список файлов для анализа.
-z - просмотреть сжатые файлы.
Основы работы с Linux. -> Потоки ввода-вывода.
Стандартные потоки Linux
Стандартный поток ввода stdin(0)
Стандартным потоком ввода (stdin) является клавиатура. В большинстве случаев, поток входных данных вводится именно через клавиатуру.
Стандартный поток вывода stdout(1)
Стандартный вывод (stdout) – это поток, в который программы выводят результаты работы. Обычно эти данные отображаются на экране монитора.
Стандартный поток ошибок stderr(2)
Стандартный поток ошибок (stderror) – поток, используемый для вывода сообщений об ошибках и диагностики. Этот поток независим от стандартного потока вывода и может перенаправляться отдельно.
Символы перенаправления.
- перенаправляет с заменой. Создает новый файл, содержащий данные стандартного потока вывода. Если указанный файл существует, то он перезаписывается.
- перенаправляет с дополнением. Создает новый файл, содержащий данные стандартного потока вывода. Если указанный файл существует, то он дописывается.
2> - перенапрявляет поток ошибок. Создает новый файл, содержащий данные стандартного потока ошибок. Если указанный файл существует, то он перезаписывается.
2>> - Добавляет информацию со стандартного потока вывода в существующий файл. Если указанный файл не существует, то он создается.
&> - Создает новый файл, содержащий данные стандартного потока вывода и потока ошибок. Если указанный файл существует, то он перезаписывается.
2>&1 - Выводит стандартные потоки вывода и ошибок в один файл.
< - Перенаправляет содержимое файла как стандартный поток ввода.
| - Перенаправляет стандартный поток вывода одной команды в стандартный поток ввода другой команды.
Если у вас есть программа handywork читающая ввод из stdin и отправляющая данные в stdout, то это можно легко переопределить.
К примеру такая программа на языке Python t.py.
#!/usr/bin/env python
d = input('name?')
print('Hello %s' % d)
Может быть запущена так:
t.py < in.dat > out.dat
если с ошибками то
t.py < in.dat > out.dat 2> err.dat
При перенаправлении результата с использованием символа > файл будет создан или обрезан (то есть из файла будет удалено содержимое). Если вы хотите заранее сохранить имеющееся содержимое данного файла, вам следует его дополнить, используя символ >> , как показано ниже:
Следующая строка:
t.py < data.in &>> results.out
позволяет выполнить t.py , а затем добавить и stdout, и stderr в файл results.out , не перезаписывая поверх существующего содержимого.
Команда tee
Если нужно одновременно увидель результаты и переправить вывод в файл используется команда tee
handywork < data.in | tee
использование параметра -a допишет в файл
Команда xargs
Команда xargs объединяет зафиксированный набор заданных в командной строке начальных аргументов с аргументами, прочитанными со стандартного ввода, и выполняет указанную команду один или несколько раз.
Означает что она может передавать вывод одной команды качестве аргумента другой команде.
Если команда не указана, xargs выполняет эхо вывод по умолчанию.
Таким образом преобразовать вывод множества строк из команды ls в одну строку, используя xargs следующим образом:
ls -1 | xargs
Или создать компактный вывод списка пользователей системы
cut -d: -f1 < /etc/passwd | sort | xargs
Посчитать количество символов и строк файлов
ls | xargs wc
Данная команда принимает на вход поток вывода от команды echo и отправляет его как аргументы в команду echo
echo A B C | xargs echo
Данная команда принимает на вход поток вывода от команды echo и отправляет его как аргументы в команду echo, запуская для каждой группы из одного параметра (т. е. для каждого параметра) отдельный процесс
echo A B C | xargs -n 1 echo
-n число - Выполнить команду, используя максимально возможное количество аргументов, прочитанных со стандартного ввода, но не более заданного числа.
-I зам_цеп - Режим вставки: команда выполняется для каждой строки стандартного ввода, причём вся строка рассматривается как один аргумент и подставляется в начальные_аргументы вместо каждого вхождения цепочки символов зам_цеп.
Основы работы с Linux. -> Домашнее задание.
Домашнее задание.
Добавить первой строку в каждый файл (копирайт) с расширением py в текущей директории.
Решение.
find . -type f -name '*.py' | xargs sed -i '1i\zdimon'
-
Напишите команду, которая выполняет ifconfig и перенаправляет стандартный вывод в файл ipaddress.txt .
-
Напишите команду, которая выполняет ifconfig , перенаправляет стандартный вывод и дополняет им файл ipaddress.txt .
-
Напишите команду, которая копирует все файлы из каталога /etc/a в каталог /etc/b и перенаправляет стандартные ошибки в файл copyerror.log
-
Напишите команду, которая создает список каталогов ( ls ), находящихся в кор- невом каталоге, и направляет вывод в команду more.
-
Напишите команду, которая исполняет mytask.sh и отправляет его в фоновый режим.
-
Основываясь на следующем списке заданий, напишите команду, которая выво- дит задание по пингу Amazon в приоритет:
[1] Running ping www.google.com > /dev/null & [2]- Running ping www.amazon.com > /dev/null & [3]+ Running ping www.oreilly.com > /dev/null &