Библиотека сайта rus-linux.net
Магия консольных одностроковых скриптов
Оригинал: CLI Magic: For geek cred, try these one-liners
Автор: Sergio Gonzalez Duran
Дата: 23 июля 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 13 августа 2008
Одностроковый скрипт - набор программ, как правило соединенных через пайп (|). При соединении программ через пайп выход левой команды передается на вход правой. Можно получить простые и полезные решения за счет всего одной строчки в командной строке bash.
К примеру, вы хотите знать, сколько файлов в текущем каталоге. Можно скомандовать:
ls | wc -l
Это очень простой пример - можно придумать и посложнее. Представьте, что вам нужно знать 5 процессов, которые больше всего нагружают процессор системы:
ps -eo user,pcpu,pid,cmd | sort -r -k2 | head -6
Опция o
программы ps выбирает колонки для отображения. sort -r
осуществляет сортировку в обратном порядке по второй колонке (pcpi) - это указывается в ключе -k2
. head
оставляет лишь первые 6 строк из выходного потока (включая строку заголовка). Можно поместить pcpu в первую колонку и можно будет опустить ключ -k2
, потому что по умолчанию данные сортируются по первой колонке. Таким образом, одну и ту же задачу можно решить разными способами; разные версии одностроковых скриптов с различными ключами могут давать разный результат.
Обычна ситуация для администраторов Linux - когда нужно получить упорядоченный список пользователей системы. Есть простой способ сделать это:
cat /etc/passwd | sort
Если вам нужны лишь имена пользователей, тогда нужно отсеять часть данных. К примеру, так:
cat /etc/passwd | sort | cut -d":" -f1
Отсортированный список передается программе cut
, ключ -d
которой определяет разделительный символ. cut делит строку на части и отображает первое поле (это указывается ключом -f1
). Так-то лучше; теперь отображаются лишь имена. Однако, скорее всего, вы не хотите, чтобы в список попали системные пользователи, такие как apache, bin, lp и т.д. Если требуются лишь настоящие пользователи, отдайте следующую команду:
cat /etc/passwd | sort | gawk '$3 >= 500 {print $1 }' FS=":"
gawk
обрабатывает каждую строку из входного потока. Если третье поле (UID) больше или равно 500 (что для большинства современных дистрибутивов означает нормальных пользователей), тогда выполняется действие. Действие указывается в фигурных скобках - это печать первого поля, имени пользователя. Разделитель полей строки - двоеточие, для команды gawk это становится понятно после указания его в ключе FS
.
Теперь представьте, что у вас есть каталог, содержащий множество файлов с разными расширениями, и вам нужно создать резервные копии лишь .php-файлов, добавив к их имени .bkp - вот так filename.bkp
. Это реализует следующий однострочник:
for f in *.php; do cp $f $f.bkp; done
Команда выполняет цикл по всем файлам в каталоге, имеющим расширение .php. Имя каждого найденного файла сохраняется в переменной $f
. Затем с каждым из них производится операция копирования. Заметьте, что в этом скрипте мы пользовались точкой с запятой для выполнения команд одна за другой.
Как бы создать резервную копию большого объема данных? Посмотрим на это:
tar cf - . | (cd /usr/backups/; tar xfp -)
Сначала будет создан tar-архив текущего каталога со всеми подкаталогами. Затем через пайп этот пакет пойдет к следующей команде. Скобки создают временную подоболочку, в которой сначала производится переход в другой каталог, затем извлекается содержимое архива - собственно исходный каталог. Ключ p
второй команды tar
сохраняет свойства файла такие как время и права доступа. После завершения исходная оболочка будет восстановлена, и пользователь будет в том же каталоге, в котором и был.
Вот вариант однострочника, создающий архив на удаленном сервере:
tar cf - . | ssh smith@remote.server tar xfp - -C /usr/backup/smith
Здесь запускается удаленная SSH-сессия и содержимое архива распаковывается с ключом C
, таким образом производится смена текущего каталога, в нашем случае в /usr/backup/smith
, там и производится распаковка.
grep и gawk и uniq!
Обработка текста - типичная задача для однострочников. Можно создавать красивые решения, правильно подобрав команды. В следующем примере требуется получить отчет по входящим почтовым сообщениям, примерно так:
cat incoming_emails 2008-07-01 08:23:17 user1@example.com 2008-07-01 08:25:20 user2@someplace.com 2008-07-01 08:32:41 somebody@server.net 2008-07-01 08:35:03 spam not recived, filtered 2008-07-01 08:39:57 user1@example.com ...
Итак, требуется отчет, содержащий адреса получателей. Как видно, некоторые адресаты повторяются, а нам это не нужно. Следующий однострочник решает эту задачу:
grep '@' incoming_email | gawk '{print $3}' | sort | uniq
grep
оставляет строки, содержащий символ @
, означающий электронную почту. Далее, gawk
выделяет третье поле, содержащее почтовый адрес и передает вывод команде sort
. Сортировка необходима для группировки повторяющихся адресатов, ведь следующая команда uniq
удаляет повторяющиеся смежные строки из отсортированного списка. Вывод скрипта ниже. Большинство текстовых однострочников работают через комбинации утилит grep, sed, awk, order, tr, cut, uniq и др.
somebody@server.net user1@example.com user2@someplace.com
Для удобства использования таких скриптов полезно создавать для них алиасы. Это можно сделать, дописав соответствующую строчку в файл .bashrc
. Когда вы откроете пользовательскую сессию, будет выполнен этот файл, и будет активизирован ваш алиас:
alias p5="ps -eo pcpu,user,pid,cmd | sort -r | head -6"
Эта статья лишь начало, можно придумать и написать куда более замысловатые скрипты. Если вы системный администратор Linux, заведите привычку собирать, создавать и адаптировать такие скрипты; никогда не знаешь, когда они могут потребоваться.
В комментариях на оригинальную статью посетителями сайта linux.com было оставлено множество других полезных скриптов.