Искусство командной строки
Продвинутому использованию командной строки зачастую не уделяют достаточного внимания. О терминале говорят как о чем-то мистическом. На самом же деле, это умение очевидно (и не очевидно) увеличивает Вашу продуктивность в работе. Данный документ является подборкой заметок и советов, которые я нашел для себя полезными, работая с командной строкой в Linux. Некоторые из них – простые и очевидные, но некоторые - довольно сложные. И предназначены для решения конкретных задач. Это небольшая публикация, но если Вы уже знаете обо всем, что тут написано, и можете вспомнить, как это все использовать – вы много знаете!
Этот гайд является результатом работы большого числа авторов и переводчиков Многое из того, что тут написано, изначально появилось на Quora, начав идею там, похоже, что стоит развить ее на Github, где обитают люди, которые талантливее меня и могут предлагать улучшения данной подборки. Если Вы заметили ошибки (во всех вариантах перевода), пожалуйста оставьте тикет или добавьте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты).
Описание
Основное:
- Данная публикация предназначена как для новичков, так и для опытных людей. Цели: объемность (собрать все важные аспекты использования командной строки), практичность (давать конкретные примеры для самых частых юзкейсов) и краткость (не стоит углубляться в неочевидные вещи, о которых можно почитать в другом месте).
- Этот документ написан для пользователей Linux, за исключеним секций "OS X only" и "Windows only". Все остальное подходит и может быть установлено под все UNIX/OS X системы (и даже Cygwin).
- Фокусируемся на интерактивном Баше, но многие вещи также могут быть использованы с другими шеллами; и в общем применимы к Баш-скриптингу.
- Эта инструкция включает в себя стандартные Unix команды и те, для которых нужно устанавливать сторонние пакеты. Они настолько полезны, что стоят того, чтобы их установили.
Заметки:
- Для того, чтобы руководство оставалось одностраничным, вся информация вставлена прямо сюда. Вы достаточно умные для того, чтобы самостоятельно изучить вопрос более детально в другом месте. Используйте
apt-get,yum,dnf,pacman,pipилиbrew(в зависимости от вашей системы управления пакетами) для установки новых программ. - На Explainshell можно найти простое и подробное объяснение того, что такое команды, флаги, пайпы и т.д.
Основы
Выучите основы Баша. Просто возьмите и напечатайте
man bashв терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа, и Баш всегда под рукой (использование исключительно zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноутбуке, во многом Вас ограничивает, например, Вы не сможете использовать возможности этих шеллов на уже существующем сервере).Выучите как использовать хотя бы один консольный редактор текста. Идеально Vim (
vi), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если Вы постоянно сидите на Emacs/какой-нибудь тяжелой IDE или на каком-нибудь модном хипстерском редакторе).Знайте как читать документацию через
man(для любознательных –man man;manпо углам документа в скобках добавляет номер, например: 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для административных команд). Ищите мануалы черезapropos, и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить черезhelpиhelp -d. С помощьюtype commandможно определить, чем является команда - исполняемым файлом, алиасом или встроенной командой шелла.Узнайте о том, как перенаправлять ввод и вывод через
>и<и пайпы|. Помните, что>переписывает выходной файл, а>>дописывает в конец. Узнайте побольше про stdout и stderr.Узнайте побольше про раскрытие file glob элементов
*(а также?и{...}), кавычки, а также разницу между двойными"и одинарными'кавычками (больше о расширении переменных читайте ниже).Освойте управление процессами в Bash:
&, ctrl-z, ctrl-c,jobs,fg,bg,killи т.д.Знайте
sshи основы беспарольной аутентификации черезssh-agent,ssh-addи т.д.Основы работы с файлами:
lsиls -l(в частности, узнайте, что значит каждый столбец вls -l),less,head,tailиtail -f(или даже лучше –less +F),lnиln -s(узнайте разницу между символьными ссылками и жёсткими ссылками, и почему жёсткие ссылки лучше),chown,chmod,du(для быстрой сводки по использованию диска:du -hk *). Для менеджмента файловой системы,df,mount,fdisk,mkfs,lsblk. Узнайте что такое inodes (ls -iилиdf -i).Основы работы с сетью:
ipилиifconfig,dig.Освойте работу с системой контроля версий, например,
git.Хорошо знайте регулярные выражения и разные флаги к
grep/egrep. Такие флаги, как-i,-o,-v,-A,-Bи-Cстоит знать.Обучитесь использованию систем управления пакетами
apt-get,yum,dnfилиpacman(в зависимости от дистрибутива), чтобы искать и устанавливать пакеты и обязательно имейте установленымpipдля установки командных утилит, написанных на Python (некоторые из тех, что вы найдёте ниже, легче всего установить черезpip).
Ежедневное использование
Используйте таб в Баше для автодополнения аргументов к командам и ctrl-r для поиска по истории командной строки (после нажатия введите запрос, нажмите ctrl-r снова, чтобы найти следующее совпадение, нажмите Enter для выполнения текущей найденной команды или стрелку вправо, чтобы отредактировать команду).
Используйте ctrl-w в Баше для того, чтобы удалить последнее слово в команде; ctrl-u для того, чтобы удалить команду полностью. Используйте alt-b и alt-f для того, чтобы бегать между словами команды, ctrl-a и ctrl-e для того, чтобы переместиться к началу и концу строки соответственно, ctrl-k для того, чтобы удалить часть команды от текущей позиции до конца строки, ctrl-l для того, чтобы очистить экран. Гляньте на
man readline, чтобы узнать о всех клавиатурных сочетаниях Баша. Их много! Например, alt-. бежит по предыдущим аргументам команды, а alt-* раскрывает глоб (globbing).
Если Вам нравятся клавиатурные сочетания vim, сделайте
set -o vi(иset -o emacs, чтобы вернуться обратно).Для редактирования длинных команд после установки другого редактора (например
export EDITOR=vim), нажатие ctrl-x ctrl-e откроет текущую команду в редакторе для многострочного редактирования. Или, как в vi, escape-v.Для просмотра последних команд используйте
history. Повторить команду:!n(гдеn- порядковый номер истории). Также есть много сокращений, например,!$(последний аргумент) и!!(последняя команда) (сверьтесь со страницей man "HISTORY EXPANSION"). Впрочем, их часто проще заменить с помощью ctrl-r и alt-..Перейти в домашнюю директорию можно с помощью
cd. Для указания пути к файлам из домашней директории можно воспользоваться префиксом~(например,~/.bashrc). Вshскриптах для обращения к домашней директории можно использовать переменную$HOME.Для того, чтобы перейти к предыдущей рабочей директории, используйте
cd -.Если вы написали команду наполовину и вдруг передумали, нажмите alt-# для того, чтобы добавить
#к началу, и отправьте команду как комментарий (или используйте ctrl-a, #, enter). Потом вы сможете вернуться к ней через историю.Не забывайте использовать
xargs(илиparallel). Это очень мощная штука. Обратите внимание, что вы можете контролировать количество команд на каждую строку (-L), а также параллельность (-P). Если вы не уверены, что делаете что-то правильно, начните сxargs echo. Еще-I{}– полезная штука. Примеры:
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
pstree -p– полезный тип вывода дерева процессов.Используйте
pgrepилиpkillдля того, чтобы находить/слать сигналы к процессам по имени (-fпомогает).Знайте разные сигналы, которые можно слать процессам. Например, чтобы приостановить процесс, используйте
kill -STOP [pid]. Для полного списка посмотритеman 7 signal.Используйте
nohupилиdisown, чтобы процесс в фоне выполнялся бесконечно.Узнайте, какие процессы слушают порты через
netstat -lntpилиss -plat(для TCP; добавьте-uдля UDP).Используйте
lsofдля того, чтобы посмотреть открытые сокеты и файлы.Используйте
uptimeилиwдля того, чтобы узнать продолжительность работы системы.Используйте
alias, чтобы поименовать часто используемые команды. Например,alias ll='ls -latr'создаст новое сокращениеll.Сохраняйте псевдонимы (aliases), настройки оболочки и часто используемые сокращения в
~/.bashrc, и организуйте их подгрузку. Это сделает ваши настройки доступными во всех сессиях оболочки.Пропишите настройки переменных окружения и команды, которые должны быть выполнены при входе в систему в файл
~/.bash_profile. Отдельная настройка будет необходима для оболочек, которые запускаются из GUI иcron.Синхронизируйте ваши конфигурационные файлы (например,
.bashrcи.bash_profile) между разными компьютерами с помощью Git.Помните, что необходима осторожность при работе с переменными, которые содержат пробелы. Оберните свои переменные в кавычки, например
"$FOO". Предпочтительно использовать-0или-print0флаги, чтобы использовать нулевой символ для разделения имен файлов, например:locate -0 pattern | xargs -0 ls -alилиfind / -print0 -type d | xargs -0 ls -al. Для циклов, которые используют имена файлов, содержащие пробелы, установите IFS чтобы символом новой строки был только\n:IFS=$'\n'.В Баш-скриптах используйте
set -x(или вариантset -v, который логгирует сырой ввод, включая нераскрытые переменные и комментарии) для того, чтобы отлаживать вывод (output). Используйте строгие режимы везде, где возможно. Используйтеset -eдля того, чтобы прекращать выполнение при ошибках (ненулевой код возврата). Используйтеset -u, чтобы определять использование неинициализированных переменных. Используйтеset -o pipefailдля того, чтобы строго относиться к ошибкам (это немного глубокая тема). Для более сложных скриптов также используйтеtrapна EXIT или ERR. Полезная привычка - начинать скрипт примерно так (это поможет обнаружить ошибки и выведет предупреждение):
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
- В Баш-скриптах подоболочки (subshells) – удобный способ группировать команды. Один из самых распространенных примеров – временно передвинуться в другую рабочую директорию, вот так:
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
В Баше много типов пространства переменных. Проверить, существует ли переменная –
${name:?error message}. Например, если Баш-скрипту нужен всего один аргумент, просто напишитеinput_file=${1:?usage: $0 input_file}. Арифметическая область видимости:i=$(( (i + 1) % 5 )). Последовательности:{1..10}. Обрезка строк:${var%suffix}и${var#prefix}. Например, еслиvar=foo.pdfтогдаecho ${var%.pdf}.txtвыведетfoo.txt.Использование скобок
{...}может уменьшить необходиость повторно вводить схожий текст и автоматизирует комбинирование элементов. Это полезно, например, здесь:mv foo.{txt,pdf} some-dir(переместит оба файла),cp somefile{,.bak}(приведется кcp somefile somefile.bak) илиmkdir -p test-{a,b,c}/subtest-{1,2,3}(раскроет все возможные комбинации и создаст дерево каталогов).Вывод любой команды можно сохранить в файлоподобный контекст с помощью
<(some command). Например, сравнение локального файла `/etc/hosts с удалённым:
diff /etc/hosts <(ssh somehost cat /etc/hosts)
Знайте про heredoc-синтаксис в Баше, работает он так:
cat <<EOF ....В Баше перенаправляйте стандартный вывод, а также стандартные ошибки, вот так:
some-command >logfile 2>&1илиsome-command &>logfile. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять</dev/null.Используйте
man asciiдля просмотра хорошей ASCII таблицы с шестнадцатеричными и десятичными значениями. Для информации по основным кодировкам полезныman unicode,man utf-8иman latin1.Используйте
screenилиtmuxдля того, чтобы иметь несколько экранов в одном терминале. Это особенно полезно, когда вы работаете с удаленным сервером по ssh, тогда вы можете подключаться/отключаться от сессий.byobuможет улучшить использованиеscreenилиtmux, предоставляя больше информации и удобное управление. Более минималистичный подход для этого – использованиеdtach.В SSH полезно знать как сделать port tunnel с ключами
-Lи-D(и иногда-R). Например для того, чтобы зайти на сайт с удаленного сервера.Еще может быть полезно оптимизировать вашу SSH конфигурацию, например этот файл
~/.ssh/configсодержит настройки, которые помогают избегать потерянных подключений в некоторых сетевых окружениях. Используйте сжатие (которое полезно с scp через медленные подключения) и увеличьте количество каналов к одному серверу через этот конфиг, вот так:
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
Некоторые другие настройки SSH могут сильно повлиять на безопасность и должны меняться осторожно, например, для конкретной подсети или конкретной машины или в доверенных сетях:
StrictHostKeyChecking=no,ForwardAgent=yes.Рассмотрите
moshкак альтернативу SSH, которая использует UDP и позволяет избежать разрывов соединений и добавляет удобства (требует настройки со стороны сервера).Чтобы получить разрешения файла в восьмеричном виде, что полезно для конфигурации систем, но нельзя получить из
ls, можно использовать что-то типа:
stat -c '%A %a %n' /etc/timezone
Для интерактивного выделения результатов других команд используйте
percolилиfzf.Для работы с файлами, список которых дала другая команда (например,
git), используйтеfpp(PathPicker).Чтобы быстро поднять веб-сервер в текущей директории (и поддиректориях), который доступен для всех в вашей сети, используйте:
python -m SimpleHTTPServer 7777(если у вас Python 2 и вы хотите открыть сервер на порту 7777) илиpython -m http.server 7777(для Python 3 и порта 7777).Чтобы выполнить определённую команду с привилегиями, используйте
sudo(для рута) иsudo -u(для другого пользователя). Используйтеsuилиsudo bash, чтобы запустить шелл от имени этого пользователя. Используйтеsu -, чтобы эмулировать свежий логин от рута или другого пользователя.Знайте про ограничение 128Кб в командной строке. Ошибка "Argument list too long" часто бывает, когда маска по имени включает большое количество файлов (в таких случаях помогают варианты с
findилиxargs).В качестве простого калькулятора (и, конечно, вообще для работы с Python) используйте интерпретатор
python. Например,
>>> 2+3
5
Обработка файлов и информации
Для того, чтобы найти файл в текущей директории, сделайте
find . -iname '*something*'. Для того, чтобы искать файл по всей системе, используйтеlocate something(но не забывайте, чтоupdatedbмог еще не проиндексировать недавно созданные файлы).Для основного поиска по содержимому файлов (более сложному, чем
grep -r) используйтеag.Для конвертации HTML в текст:
lynx -dump -stdin.Для конвертации разных типов разметки (HTML, Markdown и др.) попробуйте
pandoc.Если нужно работать с XML, есть старая, но хорошая утилита –
xmlstarlet.Для работы с JSON используйте
jq.Для работы с YAML используйте
shyaml.Для работы с Excel и CSV-файлами используйте csvkit (программа предоставляет команды
in2csv,csvcut,csvjoin,csvgrepи т.д.)Для работы с Amazon S3 удобно работать с
s3cmdиs4cmd(последний работает быстрее). Для остальных сервисов Амазона используйте стандартныйawsили улучшенныйsaws.Знайте про
sortиuniq, включая флаги-uи-d, смотрите примеры ниже. Также попробуйтеcomm.Знайте про
cut,pasteиjoinдля работы с текстовыми файлами. Многие люди используютcut, забыв проjoin.Знайте о
wc: для подсчёта переводов строк (-l), для символов – (-m), для слов – words (-w), для байтового подсчёта – (-c).Знайте про
teeдля копирования из stdin и в stdout, и в файл, напримерls -al | tee file.txt.Для более сложных вычислений, включающих групповые операции с данными, преобразование матриц и статистические функции, имейте в виду
datamash.Не забывайте, что локализация вашей системы влияет на многие команды, включая порядки сортировки, сравнение и производительность. Многие дистрибутивы Linux автоматически выставляют
LANGили любую другую переменную в подходящую для Вашего региона. Из-за этого результаты функций сортировки могут работать непредсказуемо. Рутиныi18nмогут значительно снизить производительность сортировок. В некоторых случаях можно полностью этого избегать (за исключением редких случаев), сортируя традиционно побайтово, для этогоexport LC_ALL=C.Вы можете установить специфическое окружение для команды с помощью префикса перед ее вызовом, например
TZ=Pacific/Fiji date.Знайте основы
awkиsedдля простых манипуляций с данными. Например, чтобы получить сумму всех чисел, которые находятся в третьей колонке текстового файла, можно использоватьawk '{ x += $3 } END { print x }'. Скорее всего, это получится раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне.Чтобы заменить все вхождения подстроки в одном или нескольких файлах:
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
Для того, чтобы переименовать сразу много файлов по шаблону, используйте rename. Для сложных переименований может помочь repren. В некоторых ситуациях rename тоже позволяет совершать множественное переименование, но будьте осторожны, т.к. его функциональность может меняться в зависимости от дистрибутива.
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
# Recover backup files whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# Same as above, using rename, if available:
rename 's/\.bak$//' *.bak
- Как говорит man,
rsyncна деле - быстрая, с множеством возможностей, утилита для копирования файлов. Но она хороша не только для синхронизации между машинами, но и локально. Если есть доступ, тоrsync, в отличие отscp, позволяет возобновить процесс копирования, не начиная заново. Он также является самым быстрым способом удалить большое количество файлов:
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
Используйте
shuf, чтобы перемешать строки или выбрать случайную строчку из файла.Знайте флаги
sortа. Для чисел используйте-n, для работы с человекочитаемыми числами используйте-h(напримерdu -h). Знайте как работают ключи (-tи-k). В частности, не забывайте, что вам нужно писать-k1,1для того, чтобы отсортировать только первое поле;-k1- это сортировка, учитывая всю строчку. Также стабильная сортировка может быть полезной (sort -s). Например для того, чтобы отсортировать самое важное по второму полю, а второстепенное по первому, можно использоватьsort -k1,1 | sort -s -k2,2.Если вам когда-нибудь придётся написать код символа табуляции в терминале, например, для сортировки по табуляциям с флагом -t, используйте сокращение ctrl-v [Tab] или напишите
$'\t'. Последнее лучше, потому что его можно скопировать.Стандартные инструменты для патчинга исходников это
diffиpatch. Также посмотрите наdiffstatдля просмотра статистики изменений (диффа) иsdiffдля сравнения бок-о-бок (side-by-side).diff -rработает рекурсивно по всей директории. Используйтеdiff -r tree1 tree2 | diffstatдля полной сводки изменений. Используйтеvimdiffдля сравнения и редактирования файлов.Для бинарных файлов используйте
hd,hexdumpилиxxdдля простых hex-дампов, иbviдля двоичного изменения бинарных файлов.strings(в связке сgrepили чем-то похожим) помогает найти строки в бинарных файлах.Чтобы посмотреть разницу в бинарниках (дельта-кодирование) используйте
xdelta3.Для конвертирования кодировок используйте
iconv. Для более сложных задач –uconv, он поддерживает некоторые сложные фичи Юникода. Например, эта команда переводит строки из файла в нижний регистр и убирает ударения (которые бывают, например, в испанском языке)
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
Для того, чтобы разбить файл на куски, используйте
split(разбивает на куски по размеру), илиcsplit(по шаблону или регулярному выражению).Для операций с датами и временем используйте
dateadd,datediff,strptimeи т.д. изdateutils.Используйте
zless,zmore,zcatиzgrepдля работы со сжатыми файлами.chattrустанавливает атрибуты файлов, которые также являются низкоуровневой альтернативой правам доступа. Например, от случайного удаления файла защитит атрибут неизменяемости:sudo chattr +i /critical/directory/or/file.Используйте
getfaclиsetfaclдля сохранения и восстановления файловых прав доступа. Например:
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
Отладка системы
Для веб-отладки используйте
curlиcurl -I, или их альтернативу -wget. Также есть более современные утилиты, напримерhttpie.Чтобы узнать текущее состояние процессора/диска, можно использовать классический
top(или улучшенную альтернативуhtop) иiostat,iotop. Используйтеiostat -mxz 15для получения базовой информации о процессоре и детализированной о каждом разделе жесткого диска.Для получения информации о сетевых соедиениях используйте
netstatиss.Для получения краткой информации о происходящем в системе используйте
dstat, для более детальной информации –glances. Эта программа показывает сразу несколько разных статистик в одном окне терминала. Полезно, когда следите за сразу несколькими системами.Для того, чтобы следить за памятью, научитесь понимать
freeиvmstat. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частьюfree.Отладка Java – совсем другая рыбка, но некоторые манипуляции над виртуальной машиной Оракла, или любой другой, позволят вам использовать
kill -3 <pid>и трассировать сводки стека и хипа (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно сдампить в stderr или логи.jps,jstat,jstack,jmapтакже полезны. SJK tools более продвинуты.Используйте
mtrдля лучшей трассировки, чтобы находить проблемы сети.Для того, чтобы узнать, почему диск полностью забит, используйте
ncdu, это сохраняет время по сравнению с тем жеdu -sh *.Для того, чтобы узнать, какой сокет или процесс использует интернет, используйте
iftopилиnethogs.ab, которая поставляется вместе с apache, полезна для быстрой и поверхностной проверки производительности веб-сервера. Для более серьезного нагрузочного тестирования используйтеsiege.Для более серьёзной отладки сетей используйте
wireshark,tsharkиngrep.Знайте про
straceиltrace. Эти команды могут быть полезны, если программа падает или висит, и вы не знаете почему. Или если вы хотите протестировать производительность программы. Не забывайте про возможность отладки (-c) и возможность прицепиться к процессу по pid (-p).Не забывайте про
lddдля проверки используемых библиотек.Знайте как прицепиться к работающему процессу через
gdbи получить трассировку стека.Используйте
/proc. Иногда он невероятно полезен для отладки запущенных программ. Примеры:/proc/cpuinfo,/proc/meminfo,/proc/cmdline,/proc/xxx/cwd,/proc/xxx/exe,/proc/xxx/fd/,/proc/xxx/smaps(гдеxxxэто pid).Когда отлаживаете что-то, что сломалось в прошлом, используйте
sar– бывает очень полезно. Показывает историю CPU, памяти, сети и т.д.Для анализа более сложных систем и производительности посмотрите на
stap(SystemTap),perf, иsysdig.Узнайте, какая у вас ОС, через
unameилиuname -a(основная Unix-информация/информация о ядре), илиlsb_release -a(информация о дистрибутиве).Используйте
dmesg, когда что-то ведет себя совсем странно (например, железо или драйвера).Если вы удалили файл и это вопреки ожиданиям не освободило место на диске, как показывает
du, проверьте, использует ли файл какой-нибудь процесс:lsof | grep deleted | grep "filename-of-my-big-file".
В одну строчку
Давайте соберем все вместе и напишем несколько команд:
- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлах через
sort/uniq. Это быстрый подход и работает на файлах любого размера, включая многогигабайтные файлы (сортировка не ограничена памятью, но, возможно, вам придется добавить-T, если/tmpнаходится на небольшом логическом диске). Еще посмотрите то, что было сказано выше оLC_ALL. Флаг сортировки-uне используется ниже, чтобы было понятнее:
cat a b | sort | uniq > c # c is a union b
cat a b | sort | uniq -d > c # c is a intersect b
cat a b b | sort | uniq -u > c # c is set difference a - b
- Используйте
grep . *для того, чтобы посмотреть содержимое всех файлов в директории. Особенно полезно, когда у вас много конфигов типа/sys,/proc,/etc.
- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла (скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне):
awk '{ x += $3 } END { print x }' myfile
- Чтобы посмотреть размеры и даты в дереве файлов, есть почти как рекурсивная
ls -l, но легче читаемая, чемls -lR:
find . -type f -ls
- Скажем, у нас есть какой-то текстовый файл, например лог какого-то сервера и на каких-то строках появляется значение, строки с которым нам интересны. Например,
acct_id. Давайте подсчитаем, сколько таких запросов в нашем логе:
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
Для непрерывного мониторинга измененний используйте
watch, например, проверка измений файлов в директории:watch -d -n 2 'ls -rtlh | tail'или сетевых настроек во время устранения проблем с вашей wifi сетью:watch -d -n 2 ifconfig.Запустите этот скрипт, чтобы получить случайный совет из этой инструкции:
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
pandoc -f markdown -t html |
xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet unesc | fmt -80
}
Сложно, но полезно
expr: для выполнения арифметических и булевых операций, а также регулярных выраженийm4: простенький макро-процессорyes: вывод строки в бесконечном циклеcal: классный календарьenv: для того, чтобы выполнить команду (полезно в Bash-скриптах)printenv: показать переменные окружения (полезно в скриптах или отладке)look: найти английские слова (или строки) в файлеcut,pasteиjoin: манипуляции с даннымиfmt: форматирование параграфов в текстеpr: отформатировать текст в страницы/колонкиfold: (обернуть) ограничить длину строк в файлеcolumn: форматировать текст в колонки или таблицыexpandиunexpand: конвертация между табами и пробеламиnl: добавить номера строкseq: вывести последовательность чиселbc: калькуляторfactor: возвести числа в степеньgpg: зашифровать и подписать файлыtoe: таблица терминалов terminfo с описаниемnc: отладка сети и передачи данныхsocat: переключатель сокетов и перенаправление tcp-портов (похоже наnetcat)slurm: визуализация трафика сетиdd: перенос информации между блочными устройствамиfile: узнать тип файлаtree: показать директории и поддиректории в виде дерева, какls, но рекурсивноstat: информация о файлеtime: время выполнения командыtimeout: выполнять команду указанное количество времени и остановить процесс по его истеченииlockfile: создание семафорного файла, который может быть удален только с помощьюrm -flogrotate: ротация, сжатие и отправка логов по почтеwatch: повторный запуск команды с выводом результата или подсветкой измененийtac: вывести файл построчно в обратном порядкеshuf: случайная выборка строк из файлаcomm: построчно сравнить отсортированные файлыpv: мониторинг прогресса прохождения информации через пайпhd,hexdump,xxd,biewиbvi: hex-дамп и редактирование бинарных файловstrings: найти текст в бинарникахtr: манипуляция с char (символьным типом)iconvиuconv: конвертация кодировокsplitиcsplit: разбить файлыsponge: прочитать весь входной поток перед тем, как его записать. Полезно, когда читаешь из того же файла, куда записываешь. Например, вот так:grep -v something some-file | sponge some-fileunits: конвертер. Метры в километры, версты в пяди (смотрите/usr/share/units/definitions.units)apg: генерация случайных паролей7z: архиватор с высокой степенью сжатияldd: показывает зависимости программы от системных библиотекnm: получаем названия всех функций, которые определены в .o или .a (объектные файлы)ab: бенчмаркинг веб-серверовstrace: отладка системных вызововmtr: лучшая трассировка для отладки сетиcssh: несколько терминалов в одном UIrsync: синхронизация файлов и папок через SSHngrep: grep для слоя сети (network layer). Перехват пакетов по заданной маске.hostиdig: узнать DNSlsof: информация о дескрипторах и сокетах процессаdstat: полезная статистика ОСglances: высокоуровневая статистика по многим подсистемамiostat: статистика процессора и использования жёсткого дискаmpstat: статистика использования процессораvmstat: статистика использования памятиhtop: улучшенная версияtoplast: история логинов в системуw: под каким пользователем вы сидитеid: информация о пользователе/группеsar: история системной статистикиiftopилиnethogs: использование сети конкретным сокетом или процессомss: статистика сокетовdmesg: ошибки загрузки и ошибки системыsysctl: просмотр и конфигурирование параметров ядра Linuxhdparm: манипуляции с SATA/ATAlsblk: cписок блочных устройств компьютера: дерево ваших дисков и логических дисковlshw,lscpu,lspci,lsusb,dmidecode: информация о железе, включая CPU, BIOS, RAID, графику, девайсы, и т.д.lsmodиmodinfo: информация о модулях ядраfortune,ddate, иsl: хм, не знаю, будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :)
OS X only
Некоторые вещи, подходящие только для OS X.
Системы управлением пакетами –
brew(Homebrew) иport(MacPorts). Они могут быть использованы для того, чтобы установить большинство программ, упомянутых в этом документе.Копируйте выдачу консольных программ в десктопные через
pbcopyи вставляйте входные данные черезpbpaste.Чтобы использовать в OS X кнопку Options как Alt (для использования команд alt-b, alt-f и т.д.) в настройках Терминала откройте Профили -> Клавиатура и выберите "Использовать клавишу Option в качестве метаклавиши" ("Use Option as Meta key").
Для того, чтобы открыть файл или десктопную программу типа Finder, используйте
open. Вот так:open -a /Applications/Whatever.app.Spotlight: Ищите файлы в консоли, через
mdfind, и смотрите метаданные (например EXIF информацию фотографий) черезmdls.Не забывайте, что OS X основана на BSD Unix и многие команды (например
ps,ls,tail,awk,sed) имеют небольшие различия с линуксовыми. Это обусловлено вляниемUNIX System VиGNU Tools. Разницу можно заметить, увидев заголовок "BSD General Commands Manual." в манах программ. В некоторых случаях, на Мак можно поставить GNU-версии программ, напримерgawkиgsed. Когда пишите кроссплатформенные Bash-скрипты, старайтесь избегать использовать команды, которые могут различаться (например, лучше используйте Python илиperl), или тщательно все тестируйте.Чтобы получить информацию о версии OS X используйте
sw_vers.
Windows only
Используйте силу Unix shell в Microsoft Windows, установив Cygwin. Большая часть описанных в этом документе возможностей заработает сразу.
Установите еще Unix программ с помощью встроенного в Cygwin менеджера пакетов.
Используйте
minttyв качестве терминала.Работайте с буфером обмена Windows с помощью
/dev/clipboard.Запустите
cygstart, чтобы открыть файл в приложении по умолчанию.Работайте с реестром Windows с помощью
regtool.Имейте в виду, что виндовый диск
C:\доступен в Cygwin по пути/cygdrive/c, и cygwin''ский/является папкойC:\cygwinв Windows. Конвертируйте файловые пути в виндовые и обратно с помощьюcygpath. Это самый полезный скрипт, который запускает программы Windows.Вы можете запускать и автоматизировать большинство задач по администрированию Windows из командной строки, освоив
wmic.
Больше информации по теме
- awesome-shell: Дополняемый список инструментов и ресурсов для командной строки.
- awesome-osx-command-line: Более детальные гайды по терминалу в OS X.
- Strict mode: Для того, чтобы писать шелл-скрипты лучше.
- shellcheck: Статический анализатор скриптов.
- Filenames and Pathnames in Shell: Сборник мелочей о правильной обработке имен файлов в скриптах.
- Data Science at the Command Line: Обзор команд и утилит, используемых для обработки данных, из одноименной книги.
Дисклеймер
За небольшим исключением, весь код написан так, чтобы другие смогли его прочитать. Чем больше сила, тем больше и ответственность. Тот факт, что вы способны что-то сделать в Баше, вовсе не означает, что это нужно делать! ;)
Лицензия
Оригинальная работа и перевод на русский язык распространяется под лицензией Creative Commons Attribution-ShareAlike 4.0 International License.