Библиотека сайта rus-linux.net
Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
Еще десять простых и мощных команд длиной в одну строку
Оригинал: "Another Ten One-Liners from CommandLineFu Explained"Автор: P.Krumins
Дата публикации: April 20th, 2010
Перевод: Н.Ромоданов
Дата перевода: 26 апреля 2010 г.
Еще одна неделя и объяснения еще десяти одностроковых команд с сайта commandlinefu.
21. Форматированная выдача списка файловых систем, смонтированных в текущий момент
$ mount | column -t
Здесь важно не то, что выдаются файловые системы. Важна команда column -t
. Она принимает входной поток и форматирует его по столбцам так, чтобы столбцы были выравнены по вертикали.
Ниже показано, как список смонтированных файловых систем выглядит без команды column -t
:
$ mount /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)
А теперь — с командой column -t
:
$ mount | column -t /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)
Вы можете улучшить эту одностроковую команду, добавив заголовки столбцов:
$ (echo "DEVICE - PATH - TYPE FLAGS" && mount) | column -t DEVICE - PATH - TYPE FLAGS /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)
В действительности столбцы 2 и 4 не нужны. Мы можем использовать утилиту текстовой обработки awk
для того, чтобы их удалить:
$ (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t DEVICE PATH TYPE FLAGS /dev/root / ext3 (rw) /proc /proc proc (rw) /dev/mapper/lvmraid-home /home ext3 (rw,noatime)
Наконец, мы можем сделать команду алиасом так, чтобы команда mount всегда выдавала красивый отформатированный вывод. Давайте определим алиас nicemount
:
$ nicemount() { (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t; }
Попробуем алиас:
$ nicemount DEVICE PATH TYPE FLAGS /dev/root / ext3 (rw) /proc /proc proc (rw) /dev/mapper/lvmraid-home /home ext3 (rw,noatime)
Это работает!
22. Запуск предыдущей шелл команды, но с заменой "foo" на "bar"
$ !!:gs/foo/bar
Я уже объяснял этот тип однолайновой команды по следующей ссылке (перевод). Пожалуйста, обратите внимание на продолжение этого объяснения.
Итак, здесь !!
вызовет предыдущую команду оболочки, а :gs/foo/bar
заменит (флаг :s
) все (флаг g
) вхождения foo
на bar
. Конструкт !!
называется определителем события.
23. Следим за изменениями файлов
$ watch -d -n 1 'df; ls -FlAt /path'
Эта одностроковая команда следит за изменениями файлов в директории /path
. Здесь используется команда watch
, которая периодически вызывает заданную команду. Флаг -d
указывает команде watch
отображать различия, которые произошли между вызовами команды (так что вы видите, какие файлы добавляются или удаляются в директории /path
). Флаг -n 1
указывает, что команду следует повторять каждую секунду.
Команда, которая исполняется, df; ls -FlAt /path
, представляет собой в действительности
две команды, выполняемые последовательно одна за другой. Сначала команда df
выдает данные о
том, сколько используется дискового пространства, а затем команда ls -FlAt
выдает список
файлов в директории /path
. Аргумент -F
указывает ls
сортировать файлы,
а добавление */=>@|
к именам файла, требует показывать, являются ли файлы исполняемыми
(*
), директориями (/
), сокетами (=
), файлами типа doors (>
)
(doors - механизм межпроцессного взаимодействия в операционных системах Unix; он представляет собой
разновидность функционального вызова - прим.пер.), символическиеми ссылками (@
) или
именованными конвейерами (|
). Аргумент -l
указывает выдавать список всех файлов,
аргумент -A
- скрывать директории .
и ..
, а -t
—
сортировать по времени создания/изменения файлов.
Специальное замечание о doors – этот механизм взят из Solaris и действует аналогично конвейерам, за исключением лишь того, что запускается программа, которая, как предполагается, является принимающей стороной. Обычный конвейер мог бы быть заблокирован до тех пор, пока пока другая сторона открывает его, а door сама запускает другую сторону.
На самом деле выдаваемый результат будет выглядеть лучше, если вы к df
добавите аргумент -h
, результат будет более удобочитаем. Вы также можете добавить аргументы команды watch
, задав для нее -dn1
. Вот окончательный вариант:
$ watch -dn1 'df -h; ls -FlAt /path'
Еще замечание: -d
в системе BSD означает –differences
.
24. Дистанционное монтирование директория с помощью SSH
$ sshfs name@server:/path/to/folder /path/to/mount/point
Это правда, что вы можете через SSH смонтировать удаленный директорий локально! Однако, вам нужно сначала следующие две программы:
И это все, теперь вы можете использовать sshfs
для монтирования удаленных директориев через SSH.
Для того, чтобы размонтировать, используйте fusermount
:
fusermount -u /path/to/mount/point
25. Чтение Википедии через DNS
$ dig +short txt <keyword>.wp.dg.cx
Это, пожалуй, самая интересная одностроковая команда сегодня. Дэвид Ледбитер (David Leadbeater) создал сервер DNS, который, когда делается запрос с помощью команды типа TXT, возвращает краткую неформатированную текстовую версию статьи Википедии. Смотрите презентацию его работы.
Давайте, например, выясним, что означает слово "hacker":
$ dig +short txt hacker.wp.dg.cx "Hacker may refer to: Hacker (computer security), someone involved in computer security/insecurity, Hacker (programmer subculture), a programmer subculture originating in the US academia in the 1960s, which is nowadays mainly notable for the free software/" "open source movement, Hacker (hobbyist), an enthusiastic home computer hobbyist http://a.vu/w:Hacker"
Эта одностроковая команда использует dig
, стандартную утилиту системных администраторов, с помощью которой делается запрос DNS. Параметр +short
указывает, что в ответе следует вернуть только текст, а txt
делает запрос записи типа TXT.
Эта одностроковая команда действительно достойна иметь алиас, так что давайте сделаем алиас:
wiki() { dig +short txt $1.wp.dg.cx; }
Попробуйте следующее:
$ wiki hacker "Hacker may refer to: Hacker (computer security), ..."
Это работает!
Если у вас нет dig
, вы также использовать команду host
, которая также выполняет поиск по DNS:
host -t txt hacker.wp.dg.cx
26. Рекурсивная загрузка вебсайта с помощью wget
$ wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
Эта одностроковая команда делает то, что указано. Ниже объясняются аргументы:
--random-wait
- ожидание между запросами от 0.5 и до 1.5 секунд.-r
- включает рекурсивный поиск.-e robots=off
- игнорирование записи robots.txt.-U Mozilla
- устанавливает для заголовка "User-Agent" значение "Mozilla". Хотя лучше выбрать реально существующую запись User-Agent , такую как "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)".
Некоторые другие полезные параметры:
--limit-rate=20k
- ограничивает скорость скачивания равной 20 Кбайтов/сек.-o logfile.txt
- журнал скачивания.-l 0
- убирает ограничение на глубину рекурсии (которая по умолчанию равна 5).--wait=1h
- хитрый параметр, указывает скачивать по 1 файлу за час.
27. Копирование аргументов последней команды
ALT + . (или ESC + .)
Это сочетание горячих клавиш работает только в оболочке в режиме редактирования emacs. При этом в текущую команду копируется последний аргумент последней выполненной команды. Смотрите пример:
$ echo a b c a b c $ echo <Press ALT + .> $ echo c
Если вы повторяете это сочетание, то копируется последний аргумент из команды, выполненной перед последней командой, затем, если вы повторяете снова, копируется последний аргумент из команды, выполненной перед командой перед последней командой, и т.п.
Смотрите пример:
$ echo 1 2 3 1 2 3 $ echo a b c a b c $ echo <Press ALT + .> $ echo c $ echo <Press ALT + .> again $ echo 3
Однако, если вы желаете получить первый, второй или n-ый аргумент, то используйте клавиши цифр ALT + 1
(или ESC + 1
) или ALT + 2
(или ESC +2
), и т. д. Смотрите пример:
$ echo a b c a b c $ echo <Press ALT + 1> <Press ALT + .> $ echo a a $ echo <Press ALT + 2> <Press ALT + .> $ echo b b
Смотрите описание и справочную табличку всех горячих клавиш в моей статье "Горячие клавиши в режиме редактирования Emacs".
28. Исполнение команды без сохранения ее в истории выполненных команд
$ <пробел>команда
Эта одностроковая команда работает, по меньшей мере, в bash, я не проверял ее в других оболочках.
Если вы начинаете вашу команду пробелом, то она не будет сохранена в
истории команд bash (файл ~/.bash_history). Это поведение контролируется с помощью переменной среды оболочки $HISTIGNORE
. Установите значение HISTIGNORE="&:[ ]*"
, что будет указывать не сохранять в истории команд повторные команды и команды, которые начинаются с пробела. Элементы в $HISTIGNORE
разделяются между собой двоеточием.
Если вам это интересно, смотрите краткое описание работы с историей команд и справочную табличку в моей статье "Подробное объяснение использования свойства History командной строки в Bash".
29. Просмотр размера всех поддиректориев текущего директория
$ du -h --max-depth=1
Параметр --max-depth=1
указывает du
суммировать статистику об использовании дискового пространства для директориев, находящихся в текущем директории на глубине 1, т.е. всех директориев текущего директория. Аргумент -h
делает итог статистики удобным для чтения, он выводит "5MB" вместо "5242880 (bytes)".
Если вам интересно подсчитывать в текущем директории размер поддиректориев и размеры файлов, то можно записать короче:
$ du -sh *
30. Изображение первых десяти работающих процессов, отсортированных по объему используемой памяти
$ ps aux | sort -nk +4 | tail
Это, конечно, не самый лучший способ изображения первых десяти процессов, которые потребляют максимум памяти, но он работает.
Берется результат ps aux
, который сортируется (sort
) по 4-му столбцу, а затем используется tail
, выдающий последние десять строк, в которых показаны процессы с наибольшим потреблением памяти.
Если я бы захотел узнать, какие процессы потребляют наибольший объем памяти, я бы просто использовал команду htop
или top
, но не ps
.
Бонусная одностроковая команда: Запуск сервера SMTP
python -m smtpd -n -c DebuggingServer localhost:1025
Эта одностроковая команда запускает сервер SMTP на порту 1025. Здесь используется стандартная библиотека smtpd
для языка Python (задается при помощи -m smtpd
) и передаются три аргумента: -n, -c DebuggingServer
и localhost:1025
.
Аргумент -n
указывает Python-у не устанавливать для setuid (позволяет изменять пользователя) значение "nobody" — код будет работать под вашим пользователем.
Аргумент -c DebuggingServer
указывает Python-у использовать класс DebuggingServer
в качестве реализации SMTP, которая печатает каждое получаемое сообщение в выходной поток stdout.
Аргумент localhost:1025
указывает Python-у запускать SMTP сервер как locahost на порту1025.
Однако, если вы захотите запустить сервер на стандартном порту 25, вам нужно будет использовать команду sudo
, поскольку только пользователь с правами root может запускать сервисы на портах 1 — 1024. Они также известны как привилегированные порты.
sudo python -m smtpd -n -c DebuggingServer localhost:25
На сегодня это все
Но не забудьте следующий раз вернуться к статье "И еще десять простых и мощных команд длиной в одну строку".