50 KiB
🌍 Čeština ∙ Ελληνικά ∙ English ∙ Español ∙ Français ∙ Italiano ∙ 日本語 ∙ 한국어 ∙ Português ∙ Русский ∙ Slovenščina ∙ Українська ∙ 简体中文 ∙ 繁體中文
Мистецтво командного рядка
- Опис
- Основи
- Щоденне використання
- Обробка файлів та інформації
- Відладка
- Одним рядком
- Складно але корисно
- Тільки для OS X
- Інші джерела
- Відмова від відповідальності
Використанню командного рядка часто не приділяють достатньої уваги. Про термінал говорять, як про щось містичне. Насправді, ці навики явно (і не явно) збільшують вашу продуктивність у роботі. Даний документ є підбіркою на наш погляд корисних при роботі з командним рядком в Linux заміток і порад. Деякі з них - прості та очевидні, але інші - або призначені для вирішення конкретних завдань, або досить складні чи широко невідомі. Це невелика публікація, але якщо ви вже все знаєте, що тут написано, і можете згадати як це все використовувати - ви знаєте багато!
Це -- результат роботи багатьох авторів і перекладачів. Дещо з цього спочатку з'явилось на Quora, але потім переїхало на Github, де багато людей талановитіших за початкового автора, внесли багато удосконалень. Будь-ласка, зробіть свій внесок якщо ви знайшли помилку або можете щось покращити!
Опис
Охоплення:
- Дана публікація призначена як для початківців, так і для досвідчених користувачів. Цілі: наповнення (зібрати всі важливі аспекти використання командного рядка), практичність (надати конкретні приклади для найпоширеніших ситуацій) та стислість (не варто вдаватись у несуттєві деталі, про які можна прочитати деінде).
- Цей документ написаний для користувачів Linux, за винятком розділів "Тільки для OS X" та "[Тільки для Windows(#Тільки-для-Windows)]". Все інше підходить для всіх UNIX чи OS X систем (і навіть для Cygwin).
- Сфокусована на інтерактивному Bash, але багато порад також можуть застосовуватися в інших командних оболонках чи загалом до Bash-скриптів.
- Ця інструкція включає в себе як стандартні Unix команди, так і ті, для використання яких потрібно встановлювати додаткові пакети, якщо користь від застосування команди виправдовує установку пакету.
Нотатки:
- Щоб все вміщалось на одній сторінці, вся інформація вставлена прямо тут. У вас вистачить вмінь, щоб самостійно вивчити питання більш детально з інших джерел. Використовуйте
apt-get
,yum
,dnf
,pacman
,pip
таbrew
(залежно від вашої системи управління пакетами) для установки нових програм. - На Explainshell можна знайти просте і докладне пояснення того, що таке команди, їх опції, пайпи(pipes(|)) і т.д.
Основи
-
Вивчіть основи Bash. Просто візьміть і наберіть у командному рядку термінала
man bash
і хоча б перегляньте; він досить просто читається і він не дуже великий. Інші шелли теж можуть бути хороші, але Bash - потужна програма, і Bash завжди під рукою (вивчення виключно zsh, fish і т.д., хоч і привабливо на вашому особистому комп'ютері, насправді обмежує в багатьох випадках, наприклад при використанні існуючих серверів). -
Вивчіть використання хоча б одного консольного редактора тексту. Найкраще Vim (
vi
), адже у нього немає конкурентів, коли вам потрібно швидко щось правити (навіть якщо ви постійно використовуєте Emacs чи якийсь важкий IDE або модний хіпстерський редактор). -
Знайте, як читати документацію командою
man
(для допитливих:man man
пояснює номери розділів документації, наприклад 1 - для звичайних команд, 5 - для файлів, 8 - для адміністративних команд). Шукайте інформацію черезapropos
, і пам'ятайте, що деякі команди - не виконувані (executables), а внутрішні команди Bash, і допомогу по них можна отримати через командуhelp
іhelp -d
. -
Можна перенаправляти ввід та вивід користуючися
>
,<
та каналами|
. Пам'ятайте, що>
- переписує вихідний файл, а>>
додає до нього. Дізнайтеся побільше про stdout і stderr. -
Дізнайтеся побільше про розширення шаблонів
*
(а також?
і[
...]
), про вживанняя лапок та про відмінності між подвійними"
та одинарними'
лапками. -
Ознайомтеся, як працювати із процесами в 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
. Дізнайтеся, що таке inode (ls -i
чиdf -i
). -
Основи роботи з мережею:
ip
,ifconfig
абоdig
. -
Вивчіть і використовуйте систему управління версіями, наприклад таку, як
git
. -
Добре знайте регулярні вирази і різні опції для
grep
/egrep
. Такі опції як-i
,-o
,-v
,-A
,-B
та-C
варто знати. -
Навчіться використовувати системи управління пакетами та встановлювати пакети
apt-get
,yum
,dnf
таpacman
(залежно від дистрибутива). Обов'язково майте встановленимpip
для установки командних утиліт, написаних на Python (деякі з тих команд, що ви знайдете нижче, найлегше встановити черезpip
).
Щоденне використання
- Використовуйте клавішу табуляції (Tab) в Bash для автодоповнення аргументів до команд та ctrl-r для пошуку по історії командного рядка.
- Використовуйте ctrl-w в Bash для того, щоб видалити останнє слово в команді; ctrl-u для того, щоб видалити команду повністю. Використовуйте alt-b і alt-f для того, щоб переміщатись між словами у команді, ctrl-k для того, щоб перейти в кінець рядка, ctrl-l для того, щоб очистити екран. Гляньте на
man readline
щоб дізнатися про всі комбінації клавіш Bash. Їх багато! Наприклад, alt-. переміщається між попередніми аргументам команди, а alt-* максимально розширює аргументи. - Якщо вам подобаються клавішні комбінації vim, виконайте
set -o vi
(set -o emacs
що б повернути налаштування). - Для редагування довгих команд після налаштування вашого консольного редактора (наприклад
export EDITOR=vim
), ctrl-x ctrl-e відкриє поточну команду в редакторі для багаторядкового редагування команди. Або у vi стилі, escape-v. - Для того, щоб переглянути історію, введіть
history
. Також існує безліч абревіатур, наприклад! $
- Останній аргумент,!!
- остання команда, хоча ці абревіатури часто заміняються комбінаціями ctrl-r та alt-.. - Перейти в домашню директорію можна за допомогою
cd
. Щоб вказати шлях до файлів із домашньої директорії можна скористатися префіксом~
(наприклад:~/.bashrc
). Уsh
скриптах для звернення до домашньої директорії можна використовувати змінну$HOME
. - Для того, щоб стрибнути до останньої робочої директорії, використовуйте
cd -
- Якщо ви написали команду наполовину і раптом передумали, натисніть alt-# для того, щоб додати
#
на початок команди, та відправте команду як коментар. Потім ви зможете повернутися до неї через історію команд. - Використовуйти
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
orw
показує як довго працює система. - Використовуйте
alias
, щоб створити скорочення для часто використовуємих команд. Наприклад,alias ll='ls -latr'
створить нове скорочення(alias)ll
. - Збережіть свої синоніми (aliases), налаштування і фунції які ви часто використовуєте у
~/.bashrc
, більш детально тут. Це зробить їх доступними в усіх ваших сесіях shell. - Синхронізуйте ваші конфігураційні файли (наприклад
.bashrc
та.bash_profile
) між різними комп'ютерами за допомогою Git. - Вставте настройки змінних середовища і команди, які повинні бути виконані при вході у систему в файл
~/.bash_profile
. Окремі налаштування будуть потрібні для оболонок, які запускаються із під графічного інтерфейсу та з підcron
задач. - Необхідно розуміти, що потрібна обережність коли змінні та імена файлів включають пробіли. Окружіть ваші Bash змінні в подвійні лапки:
"$FOO"
. Використовуйте-0
або-print0
опції щоб дозволити розмежувати імена файлів за допомогою нульових(null) символів. Наприклад:locate -0 pattern | xargs -0 ls -al
абоfind / -print0 -type d | xargs -0 ls -al
. Щоб перебрати імена файлів які містять пробільні символи для циклу встановіть ваш IFS(API файлової системи) використовувати тільки '\n' для цього використовуйте -IFS=$'\n'
. - У Bash скриптах використовуйте
set -x
(абоset -v
) щоб дебажити вивід. Використовуйте строгий(strict) режим скрізь, де це можливо. Використовуйтеset -e
для того, щоб припиняти виконання при помилках (не нульовий вихідний код). Використовуйтеset -u
що б визначити невстановленні змінні. Використовуйтеset -o pipefail
щоб при помилках невикористовувати пайпи(вертикальна риска). Для більш складних скриптів також використовуйтеtrap
на EXIT or ERR. Корисною буде звичка почати використовувати настипний скрипт, який допоможе виявити і перервати на загальних помилках і вивести повідомлення:
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
- У Bash-скриптах підоболочки(subshells) - зручний спосіб групувати команди. Один із найпоширеніших прикладів - тимчасово пересунутися в іншу робочу директорію:
# Do something in current dir
(cd / some / other / dir && other-command)
# Continue in original dir
- У Bash багато типів простору змінних. Перевірити, чи існує змінна -
${name:? Error message}
. Наприклад, якщо Bash-скрипту потрібен всього один аргумент, просто напишіть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 -синтаксис в Bash:
cat << EOF ...
. - У Bash перенаправляйте стандартні потоки виводу(output) та помилок, ось так:
some-command >logfile 2>&1
. Найчастіше, для того, щоб переконатись, що команда не залишить відкритим файл, прив'язавши його до відкритого терміналу, вважається хорошою практикою додавати</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
(на прту 7777 і для Python 2) абоpython -m http.server 7777
(на прту 7777 і для Python 3). - Щоб виконати команду з привілеями, використовуйте
sudo
(для root) іsudo -u
(для іншого користувача). Використовуйтеsu
абоsudo bash
, щоб запустити шелл від імені цього користувача. Використовуйтеsu -
, щоб симулювати свіжий вхід під root або gsl іншим користувачем.
Обробка файлів та інформації
- Для того, щоб знайти файл в поточній директорії, виконайте
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
), слів (-w
) і для байтового підрахунку (-c
). - Знайте про
tee
для копіювання в файл з stdin і stdout, щось типуls -al | tee file.txt
. - Не забувайте, що ваше місце знаходження (локаль) впливає на багато команд, включаючи порядок сортування, порівняння і продуктивність. Багато дистрибутиви 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
:
# Recover backup files foo.bak -> foo:
rename 's/\.bak$//' *.bak
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
- Як говорить man сторінка,
rsync
дійсно є швидким і універсальним інструментом копіювання файлів, для синхронізації між машинами, але в рівній мірі корисні на локальному рівні. Також швидке рішення що б видалити велику кількість файлів:
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
для перегляду статистики diff іsdiff
для крок за кроком diff. Запамятайтеdiff -r
працює рекурсивно по всій директорії. Використовуйтеdiff -r tree1 tree2 | diffstat
для повного зведення змін. Використовуйтеvimdiff
порівняти і редагувати файли. - Для бінарних файлів використовуйте
hd
,hexdump
абоxxd
для простих hex-дампом, іbvi
абоbiew
для зміни бінарників. - Також для бінарних файлів,
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
для роботи зі стиснутими файлами.
Відладка
- Для відладки веб сторінок використовуйте
curl
іcurl -I
, або альтернативу -wget
абоhttpie
. - Щоб отримати інформацію про диск/CPU/мережі використовуйте
iostat
,netstat
,top
(кращеhtop
) іdstat
. Використовуйтеiostat -mxz 15
для отримання основної інформації CPU. - Для інформації про мережу використовуйте
netstat
іss
. - Для більш детальної інформації використовуйте
glances
. Ця програма показує відразу кілька різних статистик в одному вікні терміналу. Корисно, коли стежите за відразу декількома системами. - Для того, щоб стежити за пам'яттю вокористовуйте
free
іvmstat
. Зокрема, не забувайте, що значення кешування ("cached" value) - Це пам'ять, яку тримає ядро і ці значення є частиноюfree
. - Використовуйте
mtr
для кращого трасування(простежити маршрут), щоб знаходити проблеми мережі. - Для того, щоб дізнатися, чому диск повністю забитий, використовуйте
ncdu
, це зберігає час у порівнянні з тим жеdu -sh *
. - Для того, щоб дізнатися, який сокет або процес використовує інтернет, використовуйте
iftop
абоnethogs
. - Додаток
ab
який поставляється разом з apache, корисний для швидкої і поверхневої перевірки продуктивності веб-сервера. Для більш серйозного лоад-тестінгу використовуйтеsiege
. - Для більш серйозної відладки мережі використовуйте
wireshark
,tshark
, іngrep
. - Знайте про
strace
таltrace
. Ці команди можуть бути корисні, якщо програма падає або висить, і ви не знаєте чому або якщо ви хочете протестувати продуктивність програми. Не забувайте про можливість відладки (-c
) і можливість причепитися до процесу по pid (-p
). ldd
для перевірки системних бібліотек.- Знайте як причепитися до працюючого процесу через
gdb
і отримати трасування стека. - Використовуйте
/proc
. Іноді він неймовірно корисний для налагодження запущених програм. Приклади:/proc/cpuinfo
,/proc/xxx/cwd
, /proc/xxx/exe
,/proc/xxx/fd/
,/proc/xxx/smaps
(деxxx
id or pid процесу). - Коли дебажите щось, що зламалося в минулому, використовуйте
sar
буває дуже корисно. Показує історію та статистику CPU, пам'яті, мережі і т.д. - Для аналізу більш складних систем і продуктивності використовуйте
stap
(SystemTap), [perf
](http://en.wikipedia.org/wiki/ Perf_(Linux)) іsysdig
. - Дізнайтеся, яка у вас операційна система, через
uname
абоuname -a
(інформація про ядро) абоlsb_release -a
(інформація про дистрибутив Linux). - Використовуйте
dmesg
, коли щось відбувається зовсім дивне (це можуть бути проблеми із залізом або драйверами).
Одним рядком
Кілька прикладів склеювання команд:
- Це досить круто, що можна знайти множинні перетину файлів, з'єднати відсортовані файли і подивитися різницю в декількох файлів через
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
- Використовуйте
xargs
(абоparallel
). Зверніть увагу, що ви можете контролювати кількість команд на кожен рядок, а так само паралельність. Якщо ви не впевнені, що робите правильно, почніть зxargs echo
. Ще-I {}
- корисна штука. Приклади:
find. -name '* .py' | xargs grep some_function
cat hosts | xargs -I {} ssh root @ {} hostname
- Запустіть цю функцію, щоб отримати випадкову вибірку із цього документа:
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
: execute and time a commandstimeout
: зупиняє команду після того як завершиться вказаний час в аргументіlockfile
: створює позначку в файлі який може бути видаленим тільки через командуrm -f
logrotate
: змінити, зжати і відправити логи.watch
: запустити команду повторно, показуючи результати і/або виділення змінtac
: вивести файли посимвольно навпакиshuf
: випадкова вибірка рядків з файлуcomm
: порядково порівняти відсортовані файлиpv
: моніторинг прогресу проходження інформації через пайпhd
,hexdump
,xxd
,biew
іbvi
: дамп і редагування бінарних файлівstrings
: витягнути текст із бінарних файлівtr
: маніпуляція з char (символьним типом)iconv
абоuconv
: конвертація кодуваньsplit
іcsplit
: розбити файлиsponge
: прочитати весь інпут перед тим, як його записати. Корисно, коли читаєш з того ж файлу, куди записуєш. Наприклад, ось так:grep -v something some-file | sponge some-file
units
: конвертер. Метри в кілометри, версти в п'яді (дивіться/usr/share/units/definitions.units
)apg
: генерація паролів7z
: архіватор з високим ступенем стисненняldd
: показує залежності програми від системних бібліотекnm
: symbols from object filesab
: бенчмаркінг веб-серверівstrace
: відладка системних викликівmtr
: трасування для відладки мережіcssh
: паралельне виконання команд в графічному інтерфейсіrsync
: синхронізація файлів і папок через SSH або на локальній файловій системіwireshark
іtshark
: перехоплення пакетів і відладка мережіngrep
: grep мережевого рівняhost
іdig
: пошук в DNSlsof
: інформація про файлові дескриптори та сокетиdstat
: корисна статистика ОСglances
: сумарна статистика багатьох підсистемiostat
: статистика системи вводу/виводу жорстких дисківmpstat
: статистика використання CPUvmstat
: статистика використання оперативної пам'ятіhtop
: вдосконалена версіяtop
last
: історія входів у системуw
: хто є залогіненимid
: інформація про користувача/групуsar
: historic system statsiftop
абоnethogs
: використання мережі конкретним сокетом або процесомss
: статистика сокетівdmesg
: помилки завантаження і помилки системиsysctl
: перегляду і налаштування параметрів ядра Linux коли воно запущенеhdparm
: маніпуляція/налаштування SATA/ATA дискуlsblk
: cписок блокових пристроїв комп'ютера: дерево ваших дисків і логічних дисківlshw
,lscpu
,lspci
,lsusb
,dmidecode
: інформація про апаратне забезпечення, включає CPU, BIOS, RAID, графічну карту і т.д.lsmod
іmodinfo
: показує список і детальну інформацію модулів ядра.fortune
,ddate
, andsl
: um, well, it depends on whether you consider steam locomotives and Zippy quotations "useful"
Тільки для OS X
Деякі речі, які підходять тільки для Мака.
- Система управління пакетами -
brew
(Homebrew) іport
(MacPorts) можуть бути використані для того, щоб встановити більшість програм, згаданих у цьому документі. - Копіюйте вивід будь-якої консольної команди до графічної за допомогою
pbcopy
і вставляйте вивід за допомогоюpbpaste
. - Щоб відкрити файл або десктопну програму, використовуйте
open
абоopen -a /Applications/Whatever.app
. - Spotlight: Шукає файли в консолі, через
mdfind
, і дивиться метадані (наприклад EXIF інформацію із фотографії) ізmdls
. - Не забувайте, що MacOS створений на основі BSD Unix і багато команд (наприклад
ps
,ls
,tail
,awk
,sed
) мають невеликі відмінності від лінуксових. Це обумовлено впливомUNIX System V
іGNU Tools
. Різницю можна помітити, побачивши заголовок "BSD General Commands Manual." Інколи на MacOS можна поставити GNU-версії програм, наприкладgawk
іgsed
. Коли пишете кросплатформені Bash-скрипти, намагайтеся уникати використовувати команди, які можуть відрізнятися (наприклад, краще використовуйте Python абоperl
), або ретельно все перевіряйте.
Інші джерела
- awesome-shell: Розширює Shell.
- awesome-osx-command-line: Поглиблений посібник до командного рядка OS X.
- Strict mode щоб краще писати Shell скрипти.
- shellcheck: A shell script static analysis tool. Essentially, lint for bash/sh/zsh.
- Filenames and Pathnames in Shell: The sadly complex minutiae on how to handle filenames correctly in shell scripts.
Відмова від відповідальності
За невеликим винятком, весь код написаний так, щоб інші його змогли прочитати. Той факт, що щось може бути написано на Bash, зовсім не означає, що воно має бути на ньому написано. ;)
Ліцензія
Ця работа і переклад на Українську мову розповсюджується за ліцензією Creative Commons Attribution-ShareAlike 4.0 International License.