mirror of
https://github.com/xmengnet/the-art-of-command-line.git
synced 2024-12-24 03:26:28 +08:00
мелкие доработки 4, и убран дубль одного совета (xargs)
This commit is contained in:
parent
0dba6d474a
commit
7508bda543
2 changed files with 28 additions and 40 deletions
62
README-ru.md
62
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 <<EOF ...`.
|
||||
- Знайте про *heredoc*-синтаксис в Баше, работает он так: `cat <<EOF ...`.
|
||||
|
||||
- В Баше перенаправляйте стандартный вывод, а также стандартные ошибки: `some-command >logfile 2>&1`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `</dev/null`.
|
||||
- В Баше перенаправляйте стандартный вывод, а также предупреждайте стандартные ошибки: `some-command >logfile 2>&1`. Зачастую, для того, чтобы убедиться, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `</dev/null`.
|
||||
|
||||
- Используйте `man ascii` для хорошей ASCII таблицы, с hex и десятичными значениями. Для информации по основным кодировкам полезны: `man unicode`, `man utf-8`, и `man latin1`.
|
||||
- Используйте `man ascii` для хорошей ASCII таблицы, с *hex-* и десятичными значениями. Для информации по основным кодировкам полезны: `man unicode`, `man utf-8` и `man latin1`.
|
||||
|
||||
- Используйте `screen` или [`tmux`](https://tmux.github.io/), чтобы иметь несколько экранов в одном терминале; это особенно полезно, когда вы работаете с удалённым сервером. Тогда Вы можете подключаться к/отключаться от сессий. Более лаконичный подход для этого – использование `dtach`.
|
||||
- Используйте `screen` или [`tmux`](https://tmux.github.io/), чтобы иметь несколько экранов в одном терминале; это особенно полезно, когда вы работаете с удалённым сервером. Тогда вы можете подключаться к/отключаться от сессий. Более лаконичный подход для этого – использование `dtach`.
|
||||
|
||||
- В SSH полезно знать [туннелирование](https://ru.wikibooks.org/wiki/SSH_%D1%82%D1%83%D0%BD%D0%BD%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) с флагами `-L` и `-D` (и иногда `-R`), чтобы зайти на сайт с удалённого сервера.
|
||||
|
||||
|
@ -161,7 +161,7 @@
|
|||
|
||||
- Для конвертации HTML в текст: `lynx -dump -stdin`
|
||||
|
||||
- Для конвертации разных типов разметки (HTML, маркдаун и т.д.) попробуйте [`pandoc`](http://pandoc.org/).
|
||||
- Для конвертации разных типов разметки (HTML, Markdown и др.) попробуйте [`pandoc`](http://pandoc.org/).
|
||||
|
||||
- Если нужно работать с XML, есть старая, но хорошая утилита – `xmlstarlet`.
|
||||
|
||||
|
@ -217,7 +217,7 @@
|
|||
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::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 <pid>` и трассировать сводки стека и кучи (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно дампнуть в stderr или логи.
|
||||
- Отладка Джавы – совсем другая рыбка, но некоторые манипуляции над Oracle VirtualBox или любой другой машиной позволит вам делать `kill -3 <pid>` и трассировать сводки стека и кучи (включая детали работы сборщика мусора, которые бывают очень полезны), и их можно дампнуть в 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`: история логинов в систему
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue