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. -> Потоки ввода-вывода.

Стандартные потоки 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'
  1. Напишите команду, которая выполняет ifconfig и перенаправляет стандартный вывод в файл ipaddress.txt .

  2. Напишите команду, которая выполняет ifconfig , перенаправляет стандартный вывод и дополняет им файл ipaddress.txt .

  3. Напишите команду, которая копирует все файлы из каталога /etc/a в каталог /etc/b и перенаправляет стандартные ошибки в файл copyerror.log

  4. Напишите команду, которая создает список каталогов ( ls ), находящихся в кор- невом каталоге, и направляет вывод в команду more.

  5. Напишите команду, которая исполняет mytask.sh и отправляет его в фоновый режим.

  6. Основываясь на следующем списке заданий, напишите команду, которая выво- дит задание по пингу 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 &

Основы работы с 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 - просмотреть сжатые файлы.