Linux: основы работы в терминале

Базовые понятия

Системы ввода и вывода оперируют потоками т.е. результат работы программы будь-то это успешная обработка данных или ошибка все это выводится в поток. Успешный результат выводится в stdout, а ошибки выводятся в stderr. Потоки не бездонные, потому информация может задерживаться в памяти, тогда она выводится позже, чем надо. Такое поведение называют буферизацией. Эти потоки могут быть перенаправлены из одной программы в другую и это называется Pipeline (обычно сокращают до pipe).

Любая команда в терминале это программа. Например, если вы думали, что mkdir это какая-то абстракция, то нет. Это обычная программа с исходным кодом как и любая другая. Отсюда и понятие, что операционная система это просто набор базовых программ. Даже символ "|" (она же называется pipe) является программой, которая передает поток из одной программы в другую не без помощи буферизации в памяти.

Работа с директориями

Создадим три директории:

mkdir {test1,test2,test}

Создадим еще одну директорию внутри которой создадим еще одну:

mkdir -p test4/blabla

Переименуем директорию:

mv test/blabla test/blabla2

Удалим директории:

rm -rf test*

Посмотрим в какой директории в данный момент находимся:

pwd

Работа с файлами

Создадим файл и запишем в нее строку:

touch test.txt
echo 'this is a test text' > test.txt

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

echo 'second line' >> test.txt

Чтобы посмотреть содержимое файла достаточно выполнить:

cat test.txt
this is a test text
second line

Теперь используем pipe и программу grep, чтобы считать вторую строку:

cat test.txt|grep 'second'
second line

Теперь допишем сразу три строки:

echo "string one
string two
string three" >> test.txt

Выведем из файла только первые слова строк:

cat test.txt|awk '{print $1}'
this
second
string
string
string

Изменим в потоке слова string на line во всех строках без модификации оригинального файла:

cat test.txt|sed 's/string/line/g'
this is a test text
second line
line one
line two
line three

Читаем лог веб-сервера:

less /usr/local/nginx/logs/access.log

Читаем лог веб-сервера в реальном времени:

tail -f /usr/local/nginx/logs/access.log

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

ln -s /usr/local/nginx/logs/access.log .
tail -f access.log

Создадим файл и сразу удалим:

touch test2.txt && rm -f test2.txt

Основы текстового редатора Vim

Открываем файл:

vi test.txt

Стрелками перемещаемся туда сюда. Если хотим ввести текст, то это можно сделать следующим образом. Если надо вводить с того места, где установлен курсор то нажмите "i" и начните вводить. Если надо вводить сместив курсор на один символ, то нажмите "a". Чтобы завершить ввод нажмите "esc".

Если надо переместиться в конец файла, то нажмите shift+g. Если надо переместиться в конец строки, то нажмите shift+4. Чтобы переместиться на определенную строку наберите номер строки, затем нажмите shift+g (например, 12 shift+g, чтобы переместиться на строку 12). Чтобы заменить слова или строки наберите :s/word/new_word/g, а для поиска слов нажмите / и начните набирать искомое слово (например, /abrakadabra, чтобы найти слово abrakadabra).

Чтобы сохранить наберите :w, а чтобы выйти :q. Чтобы сделать и то и другое одновременно наберите :wq.

Bash скрипты

Практически любые скрипты начинаются с строки, в которой указывается путь до интерпретатора (ее же называют shebang). Запустить скрипты можно двумя способами. Способ первый заключается в том, чтобы запускать скрипт как аргумент интерпретатора (пример: bash test.sh). Второй способ заключается в том, чтобы сделать файл испольняемым и испольнить его, тогда отработает shebang и скрипт будет успешно интерпретирован (пример: делаем исполняемым chmod +x test.sh и запускаем ./test.sh).

Давайте напишем простой скрипт, который проверяет доступность habr.com:

#!/usr/bin/env bash

SITE="https://habr.com"
STATUS=`curl -Is $SITE|grep 'Found'|wc -l`

if [ "$STATUS" -eq "1" ]; then
	echo "True"
else
	echo "False"
fi

Чтобы получить False поменяйте значение переменной SITE скажем на https://habr.cow ну или дождитесь, когда упадет habr.

Разберем скрипт по косточкам. Curl это утилита для дампа данных, но она довольно многофункциональна и с ее помощью можно не только качать. В нашем случае передаем ей параметры -I, который возвращает строку HTTP/1.1 302 Found и другие строки, а -s скрывает progressbar. Далее через grep находим интересующую нас строку. Утилита wc помогает нам вернуть количество строк в числовом представлении. Таким образом если нашли нужную строку, то переменная STATUS будет равна 1. Далее уже делаем проверку равна ли единице переменная STATUS и если да, то пишем True, иначе False.