From 7508bda54349fe42709ff1491e4acf89a316ceb6 Mon Sep 17 00:00:00 2001 From: spmbt Date: Thu, 9 Jul 2015 20:44:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=204,=20=D0=B8?= =?UTF-8?q?=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B4=D1=83=D0=B1=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D0=B0=20(xargs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-ru.md | 62 ++++++++++++++++++++++++---------------------------- README.md | 6 ----- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/README-ru.md b/README-ru.md index 168b416..d04bd3c 100644 --- a/README-ru.md +++ b/README-ru.md @@ -18,12 +18,12 @@ ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) -Продвинутому использованию командной строки зачастую не уделяют достаточного внимания, о терминале говорят, как о чём-то мистическом; на самом же деле — это умение прямо или косвенно увеличивает Вашу продуктивность в работе. Данный документ — это подборка заметок и советов, которые я нашёл для себя полезными, работая с командной строкой в Linux. Некоторые из них — простые и очевидные, но некоторые — довольно сложные и предназначены для решения конкретных задач. Это небольшая публикация, но если Вы знаете обо всём, что тут написано, и можете вспомнить, как это всё использовать — вы много знаете! +Продвинутому использованию командной строки зачастую не уделяют достаточного внимания, о терминале говорят, как о чём-то мистическом; на самом же деле — это умение прямо или косвенно увеличивает Вашу продуктивность в работе. Данный документ — это подборка заметок и советов, которые я нашёл для себя полезными, работая с командной строкой в Linux. Некоторые из них — простые и очевидные, но некоторые — довольно сложные и предназначены для решения конкретных задач. Это небольшая публикация, но если вы знаете обо всём, что тут написано, и можете вспомнить, как это всё использовать — вы много знаете! Многое из того, что тут написано, [изначально](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) [появилось](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know). -Начав идею там — похоже, что стоит развить её на Gihub, где обитают люди, талантливее меня, и могут предлагать улучшения данной подборки. Если Вы заметили ошибки (во всех вариантах перевода), пожалуйста, оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). +Начав идею там — похоже, что стоит развить её на Gihub, где обитают люди, талантливее меня, и могут предлагать улучшения данной подборки. Если вы заметили ошибки (во всех вариантах перевода), пожалуйста, оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). ## Описание @@ -42,9 +42,9 @@ ## Основы -- Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа, и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте, во многом Вас ограничивает: например, Вы не сможете использовать возможности этих шеллов на уже существующем сервере). +- Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа, и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте, во многом Вас ограничивает: например, вы не сможете использовать возможности этих шеллов на уже существующем сервере). -- Выучите хотя бы один консольный редактор текста. Идеально – Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если Вы постоянно сидите на Emacs или какой-нибудь тяжёлой IDE, или на модном хипстерском редакторе). +- Выучите хотя бы один консольный редактор текста. Идеально – Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если вы постоянно сидите на Emacs или какой-нибудь тяжёлой IDE, или на модном хипстерском редакторе). - Знайте, как читать документацию через `man` (для любознательных – `man man`; `man` по углам документа в скобках добавляет номер, например 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для администативных команд). Ищите мануалы через `apropos` и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить через `help` и `help -d`. @@ -77,9 +77,9 @@ - Перейти к последней рабочей директории – `cd -` -- Если Вы написали команду наполовину и вдруг передумали, нажмите **alt-#**, чтобы добавить `#` к началу, и отправьте команду как комментарий. Потом вы сможете вернуться к ней по истории. +- Если вы написали команду наполовину и вдруг передумали, нажмите **alt-#**, чтобы добавить `#` к началу, и отправьте команду как комментарий. Потом вы сможете вернуться к ней по истории. -- Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку и их параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Ещё `-I{}` – полезная штука. Примеры: +- Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что вы можете контролировать количество команд на каждую строку и их параллельность. Если вы не уверены, что делаете всё правильно, начните с `xargs echo`. Ещё `-I{}` – полезная штука. Примеры: ```bash find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname @@ -87,9 +87,9 @@ - `pstree -p` – полезный тип вывода дерева процессов. -- Используйте `pgrep` или `pkill`, чтобы находить/слать сигналы к процессам по имени (`-f` помогает). +- Используйте `pgrep` или `pkill`, чтобы находить/отсылать сигналы к процессам по имени (помогает `-f`). -- Знайте разные сигналы, которые можно слать процессам. Например, чтобы приостановить процесс, используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. +- Знайте разные сигналы, которые можно отсылать процессам. Например, чтобы приостановить процесс, используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. - Используйте `nohup` или `disown`, чтобы процесс в фоне выполнялся бесконечно. @@ -99,9 +99,9 @@ - Используйте `alias`, чтобы поименовать частоиспользуемые команды. Например, `alias ll='ls -latr'` создаст новое сокращение `ll`. -- В Баш-скритах используйте `set -x`, чтобы отлаживать вывод. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail`, чтобы строго относиться к ошибкам (это немного более глубокая тема). Для более сложных скриптов также используйте `trap`. +- В Баш-скритах используйте `set -x`, чтобы отлаживать вывод. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail`, чтобы строго относиться к ошибкам (это немного более глубокая тема). Для более сложных скриптов выбирайте `trap`. -- В Баш-скриптах под-оболочки (subshells) – удобный способ группировать команды. Один из самых распространённых примеров – временно передвинуться в другой рабочий каталог: +- В Баш-скриптах под-оболочки (subshells) – удобный способ группировать команды. Один из самых распространённых примеров – временно перейти в другой рабочий каталог: ```bash # do something in current dir (cd /some/other/dir && other-command) @@ -115,13 +115,13 @@ diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` -- Знайте про heredoc-синтаксис в Баше, работает он так: `cat <logfile 2>&1`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `logfile 2>&1`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `; ::Any-NFC; ' < input.txt > output.txt ``` -- Чтобы разбить файл на куски, используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению) +- Чтобы разбить файл на куски, используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению). - Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы со сжатыми файлами. @@ -231,19 +231,19 @@ - Для того, чтобы следить за памятью, научитесь понимать `free` и `vmstat`. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро, и эти значения являются частью `free`. -- Отладка Джавы – совсем другая рыбка, но некоторые манипуляции над Oracle VirtualBox или любой другой позволит вам делать `kill -3 ` и трассировать сводки стека и кучи (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно дампнуть в stderr или логи. +- Отладка Джавы – совсем другая рыбка, но некоторые манипуляции над Oracle VirtualBox или любой другой машиной позволит вам делать `kill -3 ` и трассировать сводки стека и кучи (включая детали работы сборщика мусора, которые бывают очень полезны), и их можно дампнуть в stderr или логи. - Используйте `mtr` для лучшей трассировки, чтобы находить проблемы сети. - Для того, чтобы узнать почему диск полностью забит, используйте `ncdu`, это экономит время по сравнению с тем же `du -sh *`. -- Xтобы узнать какой сокет или процесс использует интернет, используйте `iftop` или `nethogs`. +- Чтобы узнать, какой сокет или процесс использует интернет, используйте `iftop` или `nethogs`. - `ab`, которая поставляется вместе с Апачем, полезна для быстрой и нетщательной проверки производительности веб-сервера. Для более серьёзного лоад-тестинга используйте `siege`. - Для более серьёзного дебаггинга сетей используйте `wireshark`, `tshark`, и `ngrep`. -- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит и вы не знаете, почему, или если хотите протестировать производительность программы. Не забывайте про возможность отладки (`-c`) возможностью подключиться к процессу (`-p`). +- Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит и вы не знаете, почему, или если хотите протестировать производительность программы. Не забывайте про возможность отладки (`-c`) с возможностью подключиться к процессу (`-p`). - Не забывайте про `ldd` для проверки системных библиотек. @@ -263,17 +263,17 @@ Давайте соберём всё вместе и напишем несколько команд: -- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но возможно вам придётся добавить `-T` если `/tmp` находится на небольшом логическом диске). Ещё посмотрите то, что было сказано выше о `LC_ALL`. Флаг сорта `-u` option не используется ниже, чтобы было понятнее: +- Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но, возможно, вам придётся добавить `-T` если `/tmp` находится на небольшом логическом диске). Ещё посмотрите то, что было сказано выше о `LC_ALL`. Флаг вида `-u option` не используется ниже, чтобы было понятнее: ```sh 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`. +- Используйте `grep . *`, чтобы посмотреть содержимое всех файлов в директории, что особенно полезно, когда у вас много конфигов типа `/sys`, `/proc`, `/etc`. -- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне): +- Получить сумму всех чисел, которые находятся в третьей колонке текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это на Питоне): ```sh awk '{ x += $3 } END { print x }' myfile ``` @@ -282,15 +282,9 @@ ```sh find . -type f -ls ``` -Это почти как рекурсивная `ls -l, но читабельнее, чем `ls -lR`: +Это почти как рекурсивная `ls -l, но читабельнее, чем `ls -lR`. -- Используйте `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а также параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Ещё `-I{}` – полезная штука. Примеры: -```sh - find . -name '*.py' | xargs grep some_function - cat hosts | xargs -I{} ssh root@{} hostname -``` - -- Давайте представим, что у нас есть какой-то текстовый файл, например лог какого-то сервера и на каких-то строках появляется значение, строки с которой нам интересны, например `acct_id`. Давайте подсчитаем сколько таких запросов в нашем логе: +- Давайте представим, что у нас есть какой-то текстовый файл, например, лог сервера, и где-то появляется последовательность, например, `acct_id`, после которой строки нам интересны. Давайте подсчитаем, сколько таких запросов в нашем логе: ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn ``` @@ -357,11 +351,11 @@ - `file`: узнать тип файла -- `tree`: показать директории и сабдиректории в виде дерева, как `ls`, но рекурсивно +- `tree`: показать директории и поддиректории в виде дерева, как `ls`, но рекурсивно - `stat`: информация о файле -- `tac`: вывести файл наоборот (ласипан) +- `tac`: вывести файл посимвольно наоборот ("ласипан") - `shuf`: случайная выборка строк из файла @@ -405,7 +399,7 @@ - `host` и `dig`: узнать DNS -- `lsof`: процессинг дискрипторов и информация о сокетах +- `lsof`: процессинг дескрипторов и информация о сокетах - `dstat`: полезная статистика ОС @@ -413,7 +407,7 @@ - `iostat`: статистика процессора и использования жёсткого диска -- `htop`: улучшенная версия top +- `htop`: улучшенная версия `top` - `last`: история логинов в систему diff --git a/README.md b/README.md index 5ffa5b7..e69b387 100644 --- a/README.md +++ b/README.md @@ -287,12 +287,6 @@ A few examples of piecing together commands: find . -type f -ls ``` -- Use `xargs` or `parallel` whenever you can. Note you can control how many items execute per line (`-L`) as well as parallelism (`-P`). If you're not sure if it'll do the right thing, use xargs echo first. Also, `-I{}` is handy. Examples: -```sh - find . -name '*.py' | xargs grep some_function - cat hosts | xargs -I{} ssh root@{} hostname -``` - - Say you have a text file, like a web server log, and a certain value that appears on some lines, such as an `acct_id` parameter that is present in the URL. If you want a tally of how many requests for each `acct_id`: ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn