Как выглядят типичные трудовые будни системного администратора, который сидит на Linux? Если абстрагироваться от всего, кроме набираемых на клавиатуре команд, то окажется, что команды эти постоянно повторяются. Всё выходит на уровень автоматизма. И, если даже в работе есть что улучшать, привычка противится новому. Как результат, немало времени уходит на то, чтобы делать так, как привычнее, а не так, как быстрее, и, после небольшого периода привыкания – удобнее. Помнить об этом, сознательно вводить в собственную практику новые полезные мелочи – значит профессионально расти и развиваться, значит – экономить время, которое можно много на что потратить.
![image](https://habrastorage.org/getpro/habr/post_images/845/928/8f7/8459288f755535c7435eb0961a4a9e9a.png)
Перед вами – небольшой список полезных приёмов работы с командной строкой Linux. С некоторыми из них вы, возможно, уже знакомы, но успели их позабыть. А кое-что вполне может оказаться приятной находкой даже для знатоков. Хочется надеяться, что некоторые из них будут вам полезны и превратятся из «списка» в живые команды, которыми вы будете пользоваться каждый день.
Вывод результатов работы команд в виде таблицы
Иногда вывод результатов работы команд выглядит как мешанина из беспорядочных строк. Найти то, что надо, в таких данных можно, но работать с ними неудобно. Например – что-то подобное можно получить в ответ на команду
mount
. Хорошо бы то же самое вывести в виде таблицы. И это не только возможно, но ещё и очень просто:mount | column –t
![](https://habrastorage.org/getpro/habr/post_images/e2e/79f/42f/e2e79f42fb47d16a50d6fd596aadf8b5.png)
Результаты работы команды mount, оформленные в виде таблицы
По умолчанию команда формирует табличное представление, ориентируясь на пробелы между словами. А что, если в качестве разделителей используются другие символы, вроде двоеточий? Например – в выводе
cat /etc/passwd
?Упорядочить можно и такие данные – достаточно указать символ-разделитель с параметром
–s
. Например, ниже приведена команда для символа «:».cat /etc/passwd | column -t –s:
![](https://habrastorage.org/getpro/habr/post_images/ecd/07f/784/ecd07f7842efeeb3e35525ec2ed06c46.png)
Отформатированный вывод /etc/passwd
Многократный повтор команды до её успешного завершения
Если вы погуглите на эту тему, то обнаружите, что многие задают вопрос о том, как повторять команду до тех пор, пока она не будет успешно выполнена. Например, такое может быть полезным при пинге сервера до тех пор, пока он не откликнется, при проверке выгрузки файлов, или при опросе некоего URL до тех пор, пока он не окажется доступен.
Решить подобную задачу поможет цикл
while true
. Выглядит всё это так:![](https://habrastorage.org/getpro/habr/post_images/a9a/907/fbd/a9a907fbdf1a91c963f881202a43f805.png)
Команда будет повторяться до её успешного завершения
В этом примере конструкция
>/dev/null 2>&1
перенаправляет вывод программы в /dev/null
, включая и Standard Error, и Standard Out.Вероятнее всего, это – один из самых полезных приёмов работы с командной строкой Linux.
Сортировка процессов по используемой памяти
Тут всё просто:
ps aux | sort -nk 4
![](https://habrastorage.org/getpro/habr/post_images/2f7/5ce/4ed/2f75ce4ed6dc91b18e7385632b12f045.png)
Отсортированный список процессов
Сортировка процессов по использованию ресурсов CPU
Сортировка процессов по использованию CPU делается так:
ps aux | sort -nk 3
![](https://habrastorage.org/getpro/habr/post_images/aed/1d6/04d/aed1d604dbbeb7d5115f2b77e6a45d5f.png)
Отсортированный список процессов
Для того, чтобы вывести сведения об архитектуре, используйте команду
getconf LONG_BIT
.Одновременный просмотр нескольких лог-файлов
Для просмотра лог-файлов вполне подходит команда
tail
, но иногда может понадобиться одновременная работа с несколькими подобными файлами. Для решения этой задачи подойдёт консольный инструмент multitail
, который поддерживает выделение текста, фильтрацию и многие другие полезные возможности.![](https://habrastorage.org/getpro/habr/post_images/f4a/024/1a2/f4a0241a2fce1d78a787e2e5298863d8.png)
Работа с multitail
Установить эту утилиту, если вы её у себя не найдёте, можно командой
apt-get install multitail
.Возврат к предыдущей директории
Для того, чтобы вернуться к предыдущей директории, просто наберите
cd –.
Мониторинг с регулярными интервалами
Использование утилиты
watch
(например, watch df –h
) поможет организовать наблюдение за выводом любой команды. Например, можно наблюдать за объёмом свободного пространства, и за тем, как он меняется.Пожалуй, вы сами сможете найти подходящие сценарии для использования этой команды.
Продолжение выполнения программы после окончания сессии
Когда вы запускаете любую программу в фоне и закрываете консоль, программа тоже завершит работу. А что, если надо, чтобы программа работала и после закрытия оболочки?
Для того, чтобы этого добиться, можно воспользоваться командой
nohup
, название которой расшифровывается как «no hang-up». Выглядит это так:nohup wget site.com/file.zip
Пожалуй, эта команда – одна из тех, о которой забывают чаще всего, открывая по несколько окон терминала только ради исполняющихся в них команд.
![](https://habrastorage.org/getpro/habr/post_images/7e5/13c/765/7e513c7652e881e06ae82761e613c4cd.png)
Команда nohup
В примере, показанном на рисунке выше, в текущей директории будет создан файл
nohup.out
, содержащий вывод команды:![](https://habrastorage.org/getpro/habr/post_images/6a0/cb7/b1e/6a0cb7b1e11f84ac92e96a78a4fcd0dd.png)
Файл nohup.out
Полезная штука, согласны?
Автоматический ответ yes или no
Предположим, вы хотите автоматизировать процесс, который требует от пользователя постоянно отвечать
yes
. Сделать это можно, используя команду yes
:yes | apt-get update
Возможно, вместо этого вы решите автоматизировать отрицательные ответы. Тут поможет такая конструкция:
yes no | command
![](https://habrastorage.org/getpro/habr/post_images/4e0/738/57a/4e073857abd932b5e6e454351d017325.png)
Автоматизация ответа YES
Создание файла заданного размера
Создавать файлы заданного размера можно, используя команду
dd
:dd if=/dev/zero of=out.txt bs=1M count=10
Вышеприведённая команда создаст файл размером 10 Мб, заполненный нулями.
![](https://habrastorage.org/getpro/habr/post_images/ff5/6bd/400/ff56bd400a8f03bd85bbb07cf4951a73.png)
Создание файла заданного размера
Выполнение последней команды с root-привилегиями
Иногда можно забыть ввести
sudo
перед командой, которой нужны root-привилегии. Вводить всё заново нет нужды – достаточно воспользоваться такой командой:sudo !!
![](https://habrastorage.org/getpro/habr/post_images/06f/cb0/6f9/06fcb06f900bd11cdfdfdc2fad76411f.png)
Выполнение последней команды с root-привилегиями
Создание протокола терминальной сессии
Для того, чтобы записать в файл всё, что было выведено в окне терминала, можно воспользоваться командой
script
.После выхода из сессии протокол будет записан в файл
typescript
.Замена пробелов на знаки табуляции
Вот команда, которая позволяет заменить пробелы на знаки табуляции:
cat geeks.txt | tr ':[space]:' '\t' > out.txt
На самом деле, она универсальна и умеет работать с любыми символами.
Замена строчных букв на прописные
А вот – пример вышеописанной команды для замены строчных букв в файле с текстом на прописные:
cat myfile | tr a-z A-Z > output.txt
![image](https://habrastorage.org/getpro/habr/post_images/f3f/4e3/58b/f3f4e358b02b7f348b579d6a114a6e48.png)
Замена строчных букв в файле на прописные
Автоматическое формирование списка аргументов для команд: xargs
Утилита
xargs
, пожалуй, достойна звания одной из самых полезных возможностей командной строки Linux. Её можно использовать для передачи вывода некоей команды в качестве аргумента для другой. Например, вот как можно выполнить поиск .png-файлов и сжать их, или сделать с ними что-нибудь ещё:find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz
Или, возможно, у вас имеется файл со списком URL, и вы хотите загрузить ресурсы по этим адресам, или ещё как-то их обработать:
cat urls.txt | xargs wget
Тут надо учитывать, что вывод первой команды передаётся в качестве аргумента в конце команды
xargs
. Если при конструировании второй команды надо явно указать место, куда должны попасть выходные данные первой, достаточно воспользоваться парой фигурных скобок, {}
и параметром –i
для замены аргумента в нужном месте:ls /etc/*.conf | xargs -i cp {} /home/likegeeks/Desktop/out
![](https://habrastorage.org/getpro/habr/post_images/bb8/c3b/516/bb8c3b51613c0bd20250dfe8888d1b41.png)
Команда xargs
Итоги
Полезности для командной строки Linux – тема невероятно обширная. Поэтому любой список, подобный нашему, можно пополнять очень и очень долго. Например, много неожиданного скрыто в командах
awk
и sed
. Пожалуй, главное – чтобы такие вот списки шли в дело.А какими интересными приёмами работы в командной строке пользуетесь вы?
Комментарии (147)
hungry_ewok
06.03.2017 14:55+21>nohup wget site.com/file.zip
>Пожалуй, эта команда – одна из тех, о которой забывают чаще всего,
… потому что пользуются screen.
Stronix
07.03.2017 09:55… потому что есть wget -b :)
А вообще же
$ ping -c 5 google.com > out.txt 2>&1 &
powerman
07.03.2017 13:46Не-а. Это не спасёт от получения SIGHUP при отключении. Попробуйте сделать ssh localhost, запустить эту команду, а потом нажать
~.
для разрыва ssh-сессии.Stronix
07.03.2017 14:23Ага, nohup как раз и предназначена для игнорирования SIGHUP, просто я обычно закрываю сессию через EOF (Ctrl-d).
atrosinenko
07.03.2017 14:35А
disown
в такой ситуации не поможет? Что-то вроде "запустил с амперсандом, сказал disown, закрыл окно". Правда, stdout/stderr процесса всё равно будут идти в консоль, пока не закроешь.Stronix
07.03.2017 14:49+1Ну, я скорее lammer, поэтому отвечу так.
kstep
09.03.2017 15:09Поэтому аналогом
nohup
на чистом шеле является такая конструкция:script.sh >&- 2> stderr.log <&- & disown
. Такая команда закроет stdin и stdout, перенаправит stderr в файл лога, отправит задачу в фон и отсоединит от шела.
safari2012
06.03.2017 15:05+4Мне для фонового выполнения терминальной программы больше нравится screen
mikhailian
06.03.2017 15:20+2Запустить столько задач, сколько у меня есть процессоров:
ls -1 |xargs -P `nproc` -n 1
mikhailian
06.03.2017 15:22-1Вырезать первую колонку из лога:
cut -f1 -d\ /var/log/nginx/access.log
AranelOfDoriath
06.03.2017 16:52+1Либо
cat /var/log/nginx/access.log | awk '{ print $1 }'Hamper
06.03.2017 22:07+2Неплохой пример антипаттерна "useless cat" (кстати, к большинству команд в статье тоже относится). Короче и, в некоторых случаях, оптимальнее (например cat не позволяет командам использовать random access) писать так:
awk '{ print $1 }' /var/log/nginx/access.log
или так:
< /var/log/nginx/access.log awk '{ print $1 }'
ZyXI
06.03.2017 22:55Я не знаю, с какой радости это «антипаттерн». По производительности вы выиграете крохи, seek большинству программ, которые применяются в таких однострочниках нафиг не нужен, зато есть плюсы: можно быстро поменять
cat
на что?то ещё, можно быстро поменять команду на что?то ещё (обычно, конечно, меняется команда, а неcat
), можно использовать сtr
и файл явно визуально отделён от команды с помощью|
. И ещё, команда нифига не знает, что это за файл, поэтому, к примеру,less
не будет умничать и отображать не то, что я прошу (поведение less можно где?то настроить, но, во?первых, я не знаю, где, а, во?вторых, зачем настраивать на всех машинах less, если можно просто писатьcat file | less
?).Hamper
07.03.2017 01:49+2Да, на мелких файлах незаметно, но когда нужно цепочкой файлик в несколько сотен Гб отфильтровать, то оптимизация пайпов становится заметной.
Небольшой бенчмарк:
#немножко тестовых строк (возможно, можно сделать это лучше, но мне ничего другое в голову не пришло) файл занял 200Мб pwgen -1 20 10000000 > test.txt time bash -c 'cat test.txt | sort > /dev/null' # bash -c 'cat test.txt | sort > /dev/null' 51.26s user 1.05s system 99% cpu 52.354 total time bash -c 'sort test.txt > /dev/null' # bash -c 'sort test.txt > /dev/null' 68.08s user 1.25s system 289% cpu 23.958 total time bash -c 'cat test.txt | sort | uniq > /dev/null' # bash -c 'cat test.txt | sort | uniq > /dev/null' 60.09s user 1.44s system 110% cpu 55.621 total time bash -c 'sort -u test.txt > /dev/null' # bash -c 'sort -u test.txt > /dev/null' 71.58s user 1.18s system 269% cpu 26.964 total
Разница в 2 раза и неполное использование ядер процессора. Если мой бенчмарк неверен, то скажите пожалуйста где.
CaptainFlint
07.03.2017 01:58можно быстро поменять cat на что?то ещё
Just FYI, в варианте с файлом-аргументом тоже можно легко поменять:
awk '{ print $1 }' <(mutley do something)
Shultc
09.03.2017 13:04+1Не в коем случае не для спора, а в качестве дополнения:
Очень часто использовал именно построение с «cat» при работе с большим числом логов, часть из которых уже заархивированна, а часть — ещё нет. Приходится лишь дописывать z, чтобы получить zcat:
cat log.log | awk '{ print $1 }'
zcat log.log.gz| awk '{ print $1 }'
TaHKucT
06.03.2017 15:46+2Одновременный просмотр нескольких лог-файлов
Вполне можно сделатьtail -f file1 file2
Строчки будут появляться на экране по мере записи в файл. Не очень удобно, тем что они «перемешиваются», но в один лог падает много, а в другой мало (например access и error логи, в error очень редко что-то попадает), то вполне приемлемо.bykvaadm
07.03.2017 12:19а еще tail -f можно заменить на tailf — это отдельный бинарь, который умеет тоже самое.
anton_slim
08.03.2017 09:25проще прописать в .bashrc алиасы вместо отдельного бинарника
alias tailf='tail -f'
по мимо этого я еще использую такие:
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# git
alias gl='git log'bykvaadm
14.03.2017 10:46если вы внимательно посмотрите на debian-подобные дистрибутивы последних как минимум 3-х лет, то вы увидите что этот бинарь УЖЕ есть в вашей системе.
ZyXI
14.03.2017 10:56+3У меня Gentoo, там и в
man tailf
, и вtailf --help
явно написано, что оно “deprecated” и “may have unfixed bugs and will be removed from util-linux in March 2017”. Так что не уже есть, а ещё есть, если только в debian не будут зачем?то поддерживать эту программу своими силами. Напомнить, какой месяц сейчас? Конечно, когда это изменение окажется в последней стабильной версии будет уже не март, но всё равно лучше написатьalias
.bykvaadm
14.03.2017 11:21ifconfig тоже deprecated, однако даже в манах от известных IT компаний до сих пор он упоминается. Бинарь до сих пор присутствует в системе и ничего. Работает. И если уж настройку сети люди выполняют с помощью deprecated-средств, то уж извините, простую задачу по выводу на лету информации из файла я могу доверить и tailf. тем более за все годы я не замечал за ним какой либо нестабильной работы.
По по-воду «еще» и «уже», окей, не знал. тем не менее не вижу причин не использовать эту утилиту.ZyXI
14.03.2017 11:29ifconfig
пока не удаляют. И вman ifconfig
слов «deprecated» или «obsolete» у меня нет. В интернете можно найтиman ifconfig
, где говорят про «obsolete», но заявлений вида «ifconfig
будет удалён {дата}» нет и там.
ZyXI
14.03.2017 11:37tail
, кстати, умеет вещи вроде «завершись, когда процесс с PID умрёт», «пробуй читать файл, даже если он удалён», «переоткрой файл, если его размер не изменился за N итераций», «читай файл каждые N секунд». Ничего из этогоtailf
не умеет, а единственный ключ (кроме версии и помощи)-n
/--lines
/-{number}
совместим сtail
(версия и помощь, правда, не совместимы:tail
не поддерживает короткие варианты-V
и-h
). Ну и в чём смысл использоватьtailf
вместоalias
а?bykvaadm
14.03.2017 11:53отвечу как владелец айфона, загнанный в угол: «а мне этот функционал и не нужен» =)
qlkvg
06.03.2017 15:47+16Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail.
linux != debian
find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz
Чтобы xargs'у не снесло крышу, необходимо поменять -print на -print0 и добавить -0 после xargs. Тогда файлы с пробелами в названии будут интерпритироваться как один файл, а не несколько.haoNoQ
06.03.2017 18:12+6И ещё хорошо бы закавычить
*.png
, иначе командаfind
будет вести себя неожиданно, если в текущей папке есть хотя бы один.png
-файл.ZyXI
06.03.2017 20:01А чтобы поменьше забывать о таких нюансах хорошо бы использовать
setopt NOMATCH
(zsh) /shopt -s failglob
(bash) в интерактивной оболочке. Тогда вы получите либо ошибку, либо имена файлов, но вряд ли получите*.png
(если только у вас нет файла с таким именем, что крайне маловероятно).
powerman
07.03.2017 13:51+2Плюс если файлов будет очень много, то xargs запустит tar больше одного раза, и в результате он попытается создать несколько раз архив с одним и тем же именем.
antstar
06.03.2017 15:54+1apt-get install pkg -y
IvanIvanov1992
06.03.2017 18:02+2Видимо yes и no более универсальна и позволяет отвечать на вопросы в командах, где нет параметров для «автоответов». На мой взгляд может быть удобно.
nckma
06.03.2017 16:07если когда-то набирал команду, но не очень помнишь детали или синтаксис (например как установить vpn соединение), то
history | grep openconnProFfeSsoRr
06.03.2017 17:13+5В bash можно Ctrl+R и начать набирать openconn — последняя подходящая команда из истории отобразится.
Alkop
09.03.2017 10:50А если установить hh — то по Ctrl+R еще круче штука запустится :)
add-apt-repository ppa:ultradvorka/ppa apt-get update apt-get install hh
marapper
07.03.2017 11:40+1лучше history | grep [o]penconn — и в результатах не будет этого последнего грепа.
madkite
06.03.2017 16:22+4Вместо
while true do ping -c 1 google.com >/dev/nill 2>&1 && break done ;
В современных версиях bash-а можно написать просто:
while ! ping -c1 google.com &>/dev/null; do done
И даже можно использовать "until" вместо "while !".
ZyXI
06.03.2017 19:53В dash (и, наверное, в несовременных версиях bash) это запишется как
until command ; do :; done
. В zsh, кстати, можно сократить доuntil {command} {}
, если фигурные скобки вам нравятся больше, чем do/done.
powerman
07.03.2017 13:52А если команда может выполняться моментально, то внутри do/done не помешает sleep 1.
Hamper
06.03.2017 16:32+6Файлы быстрее создавать через fallocate (особенно актуально для больших, типа свопа):
fallocate -l 10M out.txt
laurvas
11.03.2017 08:07fallocate работает только на файловых системах, поддерживающих разреженные (sparse) файлы. Лучше использовать truncate. Судя по его поведению, он создаёт разреженный файл там, где это возможно, и заполняет нулями там, где нет.
truncate -s 10M out.txt
Stanleygoo
06.03.2017 17:13cat /etc/passwd | column -t –s:
После -s нужно пробел поставить.
ZyXI
06.03.2017 20:04+1column
из sys-apps/util-linux-2.28.2, работает без пробела.Stanleygoo
06.03.2017 22:48+1Может быть. У меня в последнем Debian'e без пробела не получилось, пишет:
column: –s:: No such file or directory
ZyXI
06.03.2017 22:58И при чём тут пробел? Замените короткое тирэ на дефисоминус. Или возьмите работающую команду и удалите пробел там: раз она работает, то вы её перепечатали, а не скопировали.
vovka667
06.03.2017 23:43+2Проблема не в пробеле, а в том, что хабр заменил символ чёрточки. Введите -s вручную и всё будет ок.
camac
06.03.2017 17:13У меня на
mount | column –t
матерится:
column: –t: Нет такого файла или каталога
TaHKucT
06.03.2017 17:22+4хабр или браузер заменяют «обычный минус» на длинный. Наберите "-t" на клавиатуре, а не скопируйте — и все будет работать.
ZyXI
06.03.2017 20:09+1«Обычный минус» называется «дефисоминус» (U+002D HYPHEN-MINUS). А замена в комментарии не «длинный минус», а «короткое тирэ» (U+2013 EN DASH). Минус в юникоде тоже есть, и даже не один. По «чёрточкам» на хабре есть статья: https://habrahabr.ru/post/20588/.
Кстати, именно «длинного минуса» я в юникоде как?то не вижу. Есть тяжёлый.
powerman
07.03.2017 13:59Ещё одна проблема с column — он не умеет учитывать ANSI escape sequence, поэтому есть вывод mount расцвечивается чем-нить вроде grc то фактически
mount | column -t
превращается в
grc /bin/mount | column -t
и колонки ломаются. Починить можно изменив порядок, но это набирать уже не очень удобно:
/bin/mount | column -t | grcat conf.mount
JTG
06.03.2017 17:48+6Командой «git checkout -» можно переключаться туда-сюда между двумя последними ветками, как и в cd.
NaHCO3
06.03.2017 18:12+1script ещё полезен для запуска screen внутри себя. Бывает так, что злобный тюремщик не оставляет тебе доступа даже к /dev/tty. screen без свободных tty запускаться не согласен — script может создать для него в юзерспейсе.
ArsenAbakarov
06.03.2017 18:12Узнал несколько новых полезных вещей, спасибо, вообще использую guake + tmux, неплохо получается работать с несколькими серверами, главное отдавать отчет где сейчас находишься)
bykvaadm
07.03.2017 12:23а у вас при создании новой вкладки в guake переименовываются все оставшиеся на дефолтные значения? ибо у меня именно так и происходит и это жутко бесит. хотя кроме guake я ничего не признаю больше)
Crandel
13.03.2017 18:02Terminator или Terminix намного функциональнее guake, там можно сплитить сам терминал, на локальной машине спасает от кучи вкладок или если нужно сравнить содержимое двух вкладок. Сам перешел с Terminator на Terminix, потому что последний на D написан и очень активно развивается
bykvaadm
14.03.2017 11:29самая удобная фича, которая мне нужна у guake — возможность выпадения консоли в верхней части экрана по хот кею, с настройкой прозрачности. что позволяет удобно пролистывать маны (сквозь терминал, если нужно), разворачивая полностью, частично или вовсе скрывая консоль.
delvin-fil
06.03.2017 19:25+1cat myfile | tr a-z A-Z > output.txt
cat myfile | tr "[:lower:]" "[:upper:]" > output.txt
Niomin
06.03.2017 21:46Если мне хочется, чтобы что-нибудь выполнялось после закрытия консоли, я обычно запускаю в фоне (& на конце). Что позволяет nohup/script, чего не даёт просто фоновый режим?
Hamper
06.03.2017 22:15При закрытии терминала (в том числе, разрыв соединения, если это ssh), процессы, запущенные в нем, получат SIGHUP, а большинство приложений по нему закрываются.
laviro
06.03.2017 22:21+1этого не достаточно.
По идее перед закрытием консоли еще нужно выполнить: disown -h
andreios
06.03.2017 22:32+2Как ни странно, с учетом, что все примеры хорошо знакомы, самым неожиданным и приятным открытием стало узнавание про таблицификацию вывода… Очень круто, спасибо!
romanegunkov
06.03.2017 23:44+1Где приемлемо подождать, лучше вместо
while true
использовать
while sleep 1
Когда-нибудь вспомните хорошим словом.
romanegunkov
07.03.2017 00:22С xargs надо быть внимательным на больших списках, чтобы не случилось беды как в примере ниже.
См. man 1 xargs
--max-chars=max-chars
-s max-chars
romanegunkov@re-host0:~/1-tmp/2/22$ seq -f filename%g.png 1 20000 | xargs echo tar -cvzf ALL.tar.gz | grep -o -e 'tar.\{60\}' tar -cvzf ALL.tar.gz filename1.png filename2.png filename3.png tar -cvzf ALL.tar.gz filename7774.png filename7775.png filename tar -cvzf ALL.tar.gz filename15178.png filename15179.png filena romanegunkov@re-host0:~/1-tmp/2/22$
klirichek
07.03.2017 04:26+2Для создания файла определённого размера иногда всё же лучше не копировать нули, а сделать seek. Это и быстрее, и экономит ресурс ssd (если файл создаётся там). Правда, при этом для создания файла точно заданного размера придётся заняться арифметикой (чтобы скипнуть на нужный размер без единицы, а потом дописать 1 байт). Но и это можно упростить, если писать не байт, а удобное количество нулей, чтоб мозг не напрягать (например, для 100М файла не bs=1 count=1 seek=104857599, что трудно считать или помнить, а bs=1k count=1 seek=102399, что уже тривиально)
Другое дело, если нужно не просто создать файл, а именно выделить (зарезервировать) место. Там да, придётся честно писать все нули.
shcoderAlex
07.03.2017 04:47+1#Последний аргумент предыдущей команды $_ #Удобно создавать директорую и переходить в неё mkdir /var/www/project && $_
Sirikid
07.03.2017 10:20Старая добрая mkcd (у меня не bash и не zsh если что)
mkcd() { if [ -z "$1" ]; then echo 'mkcd: Name expected' return 1 fi mkdir -p "$1" && cd "$1" }
nlykl
09.03.2017 18:41Точно так же работает +<.> при вводе с клавиатуры.
Hissing_Bridge
10.03.2017 08:19alt + <.> значительно удобнее, как и навигация типа alt + p, alt + b, alt + f
immaculate
07.03.2017 09:44Статья для совсем новичков. Помню, раньше во всяких TLDP, LinuxJournal, LWN.net и т.д. печататлись статьи о совершенно зубодробительных командах и их комбинациях, типа, как передать бэкап каталога по ssh при помощи tar и т.п.
В примере с пингом google лучше вставить
sleep 30s
или еще больше: к чему мучить несчастные сервера непрерывным пингом… Один хост погоды не сделает, но если все начнут писать подобные скрипты, то начнется DDOS. Особенно когда какой-нибудь китайский или филиппинский недоучка прочитает подобную статью и впендюрит подобный скрипт в прошивку недорогого, но распространенного роутера.grossws
07.03.2017 11:00+2Статья для совсем новичков. Помню, раньше во всяких TLDP, LinuxJournal, LWN.net и т.д. печататлись статьи о совершенно зубодробительных командах и их комбинациях, типа, как передать бэкап каталога по ssh при помощи tar и т.п.
Что зубодробительного в
tar c files | ssh user@host 'tar x -C /dest/dir/'
? И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.
В примере с пингом google лучше вставить sleep 30s или еще больше: к чему мучить несчастные сервера непрерывным пингом… Один хост погоды не сделает, но если все начнут писать подобные скрипты, то начнется DDOS.
До DDOS'а там ещё далеко, icmp довольно дешевый. Куда удобнее tcp syn flood, он хоть разумную амплификацию даёт. Для непрерывного ping'а есть ключ
-f
, который означает flood ping и без задержки минимум в 0.2с не доступен непривилегированному пользователю.immaculate
07.03.2017 11:15DDOS начнется, когда десятки тысяч людей начнут использовать это в своих скриптах. Да и просто с дидактической точки зрения стоит объяснить, почему плохо, когда в примере в скрипте нет никакой задержки. Получается нерациональное решение, которое раз 5 в секунду запускает ping зря поедая ресурсы компьютера и сети.
По поводу сложности, в статье изложены самые азы работы с командной строкой, впрочем, даже из азов изложены не все. Таких статей в сети 100500 миллионов, каждый блоггер отмечается на этой ниве. «А вы знаете, что в командой строке Ctrl-A переходит в начало строки?»
Хотелось бы более изощренных примеров, в статье с таким заголовком, вот и все.
bykvaadm
07.03.2017 12:30но ведь автор просто привел пример «полезной нагрузки» для используемой комбинации. в том то и соль что если вы не новичок, то вы просто оцениваете конструкцию и уж её применяете под свои задачи, используя другие команды вместо пинга и регулируя время между их запусками с помощью sleep.
acmnu
07.03.2017 13:19И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.
Самое главное значительно быстрее, поскольку scp не умеет организовывать сплошной поток и на кучке маленьких файлов никогда не добиться скорости сравнимой с tar.
MasMaX
07.03.2017 10:36+2Недавно для себя открыл фигурные строки в linux. Удобно создавать сразу много каталогов. Или применять параметры для многих каталогов.
Например нам нужна такая структура:
/var/lib/project1/test
/var/lib/project2/test
Создать эти каталоги можно одной командой:
mkdir -p /var/lib/{project1,project2}/test
E_STRICT
07.03.2017 11:33+4Немного короче:
mkdir -p /var/lib/project{1..10}/test
Ещё удобно переименовывать или копировать файлы в пределах одной директории.
mv /long/path/to/file.txt{,.orig}
centner100
07.03.2017 10:49Пропинговать и получить ответ от всех хостов в сети.
echo 192.168.1.{1..254}|xargs -n1 -P0 ping -c1|grep «bytes from»grossws
07.03.2017 11:03+2nmap -sn 192.168.1.0/24
, зачем эти извращения?centner100
07.03.2017 16:52К сожалению, не всегда имеется доступ к мировой паутине. Иногда он и вовсе запрещен.
# nmap
bash: nmap: команда не найдена
Съемный носитель с тулзами тоже не панацея. Его можно банально потерять/сломать/забыть.
echo, xargs, ping, grep — стандартные программы с большой вероятностью присутствующие в ОС.grossws
07.03.2017 17:10Если вы говорите про prod с отсутствием доступа к интернету и внутреннему зеркалу, то никто не мешает поставить нужное барахло в базовом образе/kickstart'е при установке и т. п.
find
/xargs
(findutils
) тоже могут отсутствовать, например. Всё зависит от того, что за базовый образ. То может быть мы вообще в контейнере с одним статическим бинарником, собранным противmusl
.romanegunkov
08.03.2017 00:13Иногда помогает заглянуть в busybox, если он есть.
busybox --help
покажет что встроено. Например, нуженuuencoode
, в на системе нет.
romanegunkov@re-host0:~$ echo Hello | uuencode -m - -bash: uuencode: command not found romanegunkov@re-host0:~$ echo Hello | busybox uuencode -m - begin-base64 644 - SGVsbG8K ==== romanegunkov@re-host0:~$
BigEl
07.03.2017 11:12Жесть, глазами Виндузятника бОльшая часть написанного здесь читается сложнее корейский иероглифов, тем не менее иногда сталкивался с различными проявлениями юникс систем на декстопных тачках, как то даже вторую систему дома ставил (не пошла, знаний не хватило освоить даже на уровне юниора).
Но… прочел с удовольствием, проснулось желание повторить попытку знакомства. Пользуясь случаем поинтересуюсь у гуру данной платформы, с чего лучше начать почти новичку в данной области. Много читал про Debian, но тем не менее по обзорам и функционалу привлекает Arch Linux — не будет ли он слишком сложен в освоении? Какие еще варианты можете предложить?ZyXI
07.03.2017 11:14Я начинал с Ubuntu, потом прямо из неё ставил Gentoo. По?моему, с неё всегда проще всего начинать.
BigEl
07.03.2017 11:27Вот Ubuntu то и пробовал когда-то, v10 или v12 дистриб. Поставить и немного настроить проблем не вызвало (гугл помог), даже какой то типовой софт поставил через apt-get install, не помню уже на чем запнулся и забил…
grossws
07.03.2017 11:47+1Я бы не рекомендовал Arch первой системой, у новичка он будет ломаться пять раз на дню, а через неделю забросите.
Для обучения лучше берите kubuntu/ubuntu, ставиться за 10-20 минут, почти никакого геморроя. Желательно перед установкой убедиться, что всё железо на машинке адекватное, то, опять же, намучаетесь.
Лучше поставить в виртуалку, сделать базовый образ и после этого ломать систему разными способами и пытаться восстановиться. Всякие стандартные вещи типа опечатка в
/etc/fstab
, полностью забитый диск, смонтированный на/
, неудачно снесенное ядро и т. п.
А потом можно уже спокойно брать Arch или Gentoo. Кстати, при работе и настройке вне зависимости от дистрибутива в вики арча и генты можно найти ответы на многие вопросы.
BigEl
07.03.2017 12:00Есть тестовая машинка, физическая: Камень Intel 2030 на 2.4 Hz, мать Асусовая из бюджетных, хард 200gb с копейками. Не люблю виртуалками баловаться на основной домашней машинке, «хвостов» куча остается или руки
из задкривые, был период когда на виртуалке Андроид десктопный тестировал (банально ради интереса, поковырять внутрянку без залоченности телефона), пару раз «окошки» переустанавливал, постоянно где то кучи файлов забивались на диске, в реестре много всего понаписалось. Поэтому собрал средненький комп для тестов всего нового, непроверенного и заведомо опасного. Так сказать физическая виртуалка ))
Sirikid
07.03.2017 12:08Если осилишь арч все остальное будет довольно просто, у него очень хорошая документация (арчвики).
centerv
07.03.2017 18:44Рекомендую arch. Если бы начинал с него, знакомство с Linux было бы на порядок продуктивнее. Ещё ставь zsh, oh-my-zsh.
centerv
07.03.2017 18:46А хочется десктоп то antergos. Это тоже arch, но красивый с установщиком. После кучи маков пересел.
romanegunkov
08.03.2017 00:25Сначала возьмите Debian или что-то популярное на на его основе Mint/Ubuntu, чем больше сообщество и документации, тем вам проще будет искать ответы на поисковиках. Когда освоитесь, этот момент можно определить как — вспомнил что ещё осталась винда на компе, надо бы снести, поработайте с CentOS, основан на Red Hat и опыт пригодится в работе. А потом можете пробовать что угодно, хоть Arch хоть Gentoo.
YaakovTooth
09.03.2017 04:14-2прочел с удовольствием, проснулось желание повторить попытку знакомства
7 марта 2017 в 11:12
Слишком жирно.
гуру данной платформы, с чего лучше начать почти новичку
DmitriyPanteleev
07.03.2017 15:02Просто оставлю это здесь :-)
Джоршуа Леви «Искусство коммандной строки»
https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md
bubuq
07.03.2017 19:24cat /etc/passwd | column -t –s:
column -t –s: < /etc/passwd
cat myfile | tr a-z A-Z > output.txt
tr a-z A-Z > output.txt < myfile
sudo !!
меж тем "!!" это повтор последней команды в любом контексте, sudo тут ни при чём.
ZyXI
07.03.2017 23:28+1!!
— это ни разу ни повтор какой?либо команды. Это history expansion: подстановка из истории. Ничто не мешает вам написатьfor arg in !! ; do echo $arg ; done
: найдите здесь «повтор последней команды».!!
при этом не единственный вариант: можно и взять предыдущую строку, соответствующую регулярному выражению, оставить от неё второе слово (оно же обычно первый аргумент) и заменить в этом слове x на y:!?regex?:1:s/x/y/
.
В любом случае, подстановка из истории оперирует не с командами, а со строками: «первым аргументом» в примере вполне может оказаться и
|
, a ?sudo
может заполучитьwhile
и, разумеется, не знать, что с ним делать (это часть синтаксиса оболочки и ни разу не команда, даже не shell builtin).
troggy
08.03.2017 20:08+2Алиас для более семантичного выполнения последней команды под рутом:
alias please='sudo $(fc -ln -1)'
BigEl
09.03.2017 08:28-1Как относитесь к обучению основ в игровом виде?
Вчера нашел игрушку Hacknet
рандомный скрин игрового интерфейса с просторов ынтеретаabyrkov
09.03.2017 18:57После выхода из сессии протокол будет записан в файл typescript.
Макрософт уже в суд подавал?
starfolk
10.03.2017 02:35а как послать в ребут после отработки команды. конкретно мне надо что бы после yum update -y комп перезагружался
senia
10.03.2017 07:59+1А что мешает так и написать? yum upate -y && reboot
Стандартный способ объединять последовательно несколько команд пока они успешно выполняются — через &&.
Хотите продолжить цепочку даже в случае ошибки — замените && на ;.
klounader
11.03.2017 08:07Когда-то я не знал, как в фильмах так быстро набирают в консоли всякие хакерские слова.
С помощью Tab-а дополнять набирающее стало намного проще.
В чём отличие cd -. от cd…?SeveneduS
11.03.2017 10:30+1cd- «предидущая директория» — та в которой вы были ранее. cd… — подняться на папку выше.
Пример:
Вы были в /home/user/folder5/, потом попали в директорию к примеру — /usr/lib/. если наберёте команду cd- то сразу вернётесь из /usr/lib/ в /home/user/folder5/. В случае же если вы из /usr/lib/ наюерёте cd… то попадетё всего лишь в /usr/
SeveneduS
11.03.2017 15:34+2Ну раз уж утилиту (команды это не что иное как скрипты либо утилиты/программы)
du
никто не упомянул то пожалуй это сделаю я. du -sh к примеру выводит размеры папок либо даже отдельных файлов. К примеру если запустить эту команду:
sudo du -sh /
Мы получим что то типа:
4.9G /
А вот если добавить * сразу после дроби (sudo du -sh /*) то вывод будет ещё интереснее:
7.4M /bin 21M /boot 0 /dev 6.9M /etc 12M /home 148M /lib 16K /lost+found 20K /man 4.0K /media 4.0K /mnt 797M /opt 0 /proc 28K /root 6.5M /run 7.0M /sbin 4.0K /srv 0 /sys 52K /tmp 3.6G /usr 362M /var
При поиске мусора захлямляющего диск для меня это порой единственный весомый иснтрумент.Merlyel
11.03.2017 19:41Ну и заодно du -sh * |sort -h, чтобы сразу отсортировать корректно
Правда -h в sort'е появился относительно недавно.servarius
13.03.2017 08:27Я бы использовал #du -sm, Он на большинстве версий *nix работает одинаково. Только HP-UX отличается. Зато даже на AIX показывает в мегабайтах.
Hissing_Bridge
13.03.2017 05:20+5Еще очень удобная фишка, если нужно отредактировать/написать длинную команду, к примеру какой-то цикл. Последовательность Ctrl + x, Ctrl + e запустит редактор, установленный переменной окружения EDITOR, в котором уже изменить скрипт, а по закрытию он выполнится
http://i.imgur.com/jmXmr3S.gifv
skymal4ik
Спасибо, было интересно!
Узнал про script, буду пробовать. Раньше бы сделал скриншот или фотку :)
Заметка про замену табов\пробелов — для этого есть специальные тулзы. Но можно и через универсальный tr, как у вас.
dmitryrublev
Возможно, вам будет интересно: showterm.io, как ещё более «живая» альтернатива к script
MarSoft
Ещё asciinema.org, примерно аналог.
jcmvbkbc
в отличие от expand и unexpand, tr заменит 8 идущих подряд пробелов на 8 табов.
SerheoNikolis
Я обычно копирую ~/.bash_history. При необходимости удалить за собой следы работы — history -cw.