December 19

21 команда Linux, которые кажутся читерством

Это перевод оригинальной статьи 21 Linux Commands That Feel Like Cheating.

Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.

Настоящие встроенные команды и стандартные инструменты GNU — без алиасов, без скриптов. После 10 лет на Linux я жалею, что не изучил это раньше.

Годами я работал медленно. Перепечатывал пути. Открывал временные файлы. запускал одни и те же циклы вручную. Потом товарищ по команде показал мне несколько приемов командной оболочки, которые казались мне несправедливыми. Я потянул за нить и нашёл больше.

Вот двадцать один пункт, который действительно изменил мой день. Это либо функции оболочки, либо инструменты, доступные в обычной Linux-системе. Никаких алиасов. Никаких пользовательских скриптов. Там, где BSD или macOS ведут себя по-разному, я отмечаю это по ходу.

Мышление чит-кода

Скорость появляется благодаря устранению трения: вспоминайте последнее действие, расширяйте шаблоны и комбинируйте маленькие инструменты, не отходя от клавиатуры. Освойте это один раз — и оно начнёт складываться во всём, что вы делаете.

1. sudo !! — Выполнить предыдущую команду с помощью sudo

Вы забыли sudo. Не вводите команду заново.

apt-get update
sudo !!

Внимание: он точно повторяет вашу последнюю команду. Убедитесь, что последняя строка — это то, что вам нужно.

2. !$ И Alt+. — Повторное использование последнего аргумента.

Прекратите копировать и вставлять пути.

mkdir -p /data/logs/app
cd !$
# Alt+. inserts the last argument too

3. Расширение скобок {} — создание или изменение множества объектов одновременно

mkdir -p /var/www/{cache,static,uploads}
touch report-{Jan..Mar}.csv

Одно действие, несколько результатов.

4. Подстановка процессов <( ) — сравнение потоков без временных файлов

diff <(sort a.txt) <(sort b.txt)sort a.txt) <(sort b.txt)

Обращайтесь с потоковым выводом как с файлами.

5. Группировка { …; } — аккуратное перенаправление целого блока

{ echo "starting job"; date; run_job; } >run.log 2>&1echo "starting job"; date; run_job; } >run.log 2>&1

Одно перенаправление охватывает все.

6. find -exec … {} + — Эффективная пакетная обработка аргументов

find logs -type f -name '*.gz' -exec zcat {} + | grep ERRORtype f -name '*.gz' -exec zcat {} + | grep ERROR

+ упаковывает пути в минимальное число вызовов.

7. find … -print0 | xargs -0 -P — Безопасный параллелизм

find images -type f -name '*.jpg' -print0 \
| xargs -0 -n1 -P8 jpegoptim

Пути, разделённые нулевым байтом, не ломаются из-за пробелов.
-P8 использует восемь рабочих процессов.

8. tee — Просмотр и сохранение выводов одновременно

make | tee build.logtee build.log

Никогда больше не повторяйте долгую команду, потому что забыли сохранить лог.

9. Рекурсивный grep с include/exclude — точный поиск

grep -R --line-number --include='*.py' --exclude-dir='{.git,venv}' 'TODO' .'*.py' --exclude-dir='{.git,venv}' 'TODO' .

Находит только те «иголки», которые вам нужны.

10. Частотность в одну строку — подсчитать и упорядочить что угодно

cut -d',' -f3 purchases.csv | sort | uniq -c | sort -nr | head

Топ-N без всяких таблиц.

11. Расширение параметров — удаление, замена и извлечение без внешних инструментов

Они встроены в bash и поразительно быстрые.

p="/var/log/nginx/access.log"
echo "${p%/*}"     # /var/log/nginx   (remove shortest suffix "/*")
echo "${p##*/}"    # access.log       (remove longest prefix "*/")
name="DEBUG=1"
echo "${name/1/0}" # DEBUG=0          (single substitution)

12. Читаемые столбцы — cut, tr,column

cut -d',' -f1,4 users.csv | tr ',' '\t' | column -t

Преобразует запутанный CSV-файл в читаемую таблицу.

13. pushd/ popd/ dirs— Настоящая стековая навигация по каталогам

pushd /var/www
pushd /etc/nginx
dirs
popd

Перемещайтесь между местами, не теряя контекста.

14. cd - — Мгновенное переключение между двумя каталогами

cd /srv/app && cd -

Как alt-tab, но для папок.

15. sed -i — Безопасное редактирование на месте (учтите вашу версию)

# GNU sed
sed -i 's/DEBUG=1/DEBUG=0/' .env
# [BSD] macOS/BSD sed requires an argument after -i (empty string is common)
sed -i '' 's/DEBUG=1/DEBUG=0/' .env

16. awk Как калькулятор и инструмент для извлечения данных

awk -F, '{sum+=$2} END{printf "Total,%.2f\n",sum}' purchases.csv

Когда электронная таблица нарушает ход вашей работы.

17. Сила истории — history | grep с !n для повторного вызова

history | grep docker
!248   # re-run entry 248

Перестаньте заново вводить длинные заклинания.

18. mapfile (bash) — Правильное чтение строк в массив

mapfile -t files < <(find src -name '*.java')
printf '%s\n' "${files[@]}" | wc -l

Чисто, безопасно, без хрупких циклов.

19. watch -n 0.5 -d '…' — Наблюдайте изменения в реальном времени

watch -n 0.5 -d 'df -h | grep /data'

-d подчеркивает различия между итерациями.

20. tail -F — отслеживание логов через ротации

tail -F /var/log/nginx/access.log

Отслеживает имя, а не только дескриптор файла.

21. less как профессионал — следить, приостанавливать, искать, возобновлять

less +F app.log    # follow live
# Ctrl-C to pause, /ERROR to search, Shift+F to resume

Контроль less с ощущением tail -f.

Один нечестный конвейер, который окупается сам

Вот как я анализирую логи за прошедший день и выявляю самые шумные модули. Он обходится без временных файлов, переживает пробелы и сохраняет сводку для последующего анализа.

find /var/log/myapp -type f -mtime -1 -name '*.log' -print0 \
| xargs -0 -n1 -P4 cat \
| grep -E 'WARN|ERROR' \
| sed -E 's/:[0-9]{2}\.[0-9]{3}//' \
| awk -F'[][]' '{print (NF>2 ? $2 : "unknown")}' \
| sort | uniq -c | sort -nr | head \
| tee /tmp/log-hotspots.txt

Почему это кажется несправедливым: вы собираете, фильтруете, нормализуете, атрибутируете и ранжируете данные в одном потоке. Каждый этап нагляден, взаимозаменяем и легко поддаётся анализу.

Что изменится в первый рабочий день после этого?

Вы перестанете открывать редакторы для задач, которые оболочка выполняет мгновенно. Вы начнёте перемещаться по намерению, а не по памяти. Вы будете сохранять вывод по умолчанию, так что никогда не потеряете то, что только что увидели. Вы будете искать точно, а не заливать экран шумом. И прежде всего — вы будете держать руки на клавиатуре, а задачи в уме.

Если вы наставник для младших сотрудников, научите их трём из них и увидите, как их уверенность резко возрастёт. Если вы руководитель команды, стандартизируйте несколько схем, чтобы вся ваша команда работала быстрее без дополнительного инструмента.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.