Базовые понятия
Системы ввода и вывода оперируют потоками т.е. результат работы программы будь-то это успешная обработка данных или ошибка все это выводится в поток. Успешный результат выводится в 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.