Comments 149
Узнал про script, буду пробовать. Раньше бы сделал скриншот или фотку :)
Заметка про замену табов\пробелов — для этого есть специальные тулзы. Но можно и через универсальный tr, как у вас.
expand - convert tabs to spaces
unexpand - convert spaces to tabs
Заметка про замену табов\пробелов — для этого есть специальные тулзы. Но можно и через универсальный tr,
в отличие от expand и unexpand, tr заменит 8 идущих подряд пробелов на 8 табов.
>Пожалуй, эта команда – одна из тех, о которой забывают чаще всего,
… потому что пользуются screen.
А вообще же
$ ping -c 5 google.com > out.txt 2>&1 &
Не-а. Это не спасёт от получения SIGHUP при отключении. Попробуйте сделать ssh localhost, запустить эту команду, а потом нажать ~.
для разрыва ssh-сессии.
cat /var/log/nginx/access.log | awk '{ print $1 }'
Неплохой пример антипаттерна "useless cat" (кстати, к большинству команд в статье тоже относится). Короче и, в некоторых случаях, оптимальнее (например cat не позволяет командам использовать random access) писать так:
awk '{ print $1 }' /var/log/nginx/access.log
или так:
< /var/log/nginx/access.log awk '{ print $1 }'
Я не знаю, с какой радости это «антипаттерн». По производительности вы выиграете крохи, seek большинству программ, которые применяются в таких однострочниках нафиг не нужен, зато есть плюсы: можно быстро поменять cat
на что‐то ещё, можно быстро поменять команду на что‐то ещё (обычно, конечно, меняется команда, а не cat
), можно использовать с tr
и файл явно визуально отделён от команды с помощью |
. И ещё, команда нифига не знает, что это за файл, поэтому, к примеру, less
не будет умничать и отображать не то, что я прошу (поведение less можно где‐то настроить, но, во‐первых, я не знаю, где, а, во‐вторых, зачем настраивать на всех машинах less, если можно просто писать cat file | less
?).
Да, на мелких файлах незаметно, но когда нужно цепочкой файлик в несколько сотен Гб отфильтровать, то оптимизация пайпов становится заметной.
Небольшой бенчмарк:
#немножко тестовых строк (возможно, можно сделать это лучше, но мне ничего другое в голову не пришло) файл занял 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 раза и неполное использование ядер процессора. Если мой бенчмарк неверен, то скажите пожалуйста где.
можно быстро поменять cat на что‐то ещёJust FYI, в варианте с файлом-аргументом тоже можно легко поменять:
awk '{ print $1 }' <(mutley do something)
Очень часто использовал именно построение с «cat» при работе с большим числом логов, часть из которых уже заархивированна, а часть — ещё нет. Приходится лишь дописывать z, чтобы получить zcat:
cat log.log | awk '{ print $1 }'
zcat log.log.gz| awk '{ print $1 }'
Одновременный просмотр нескольких лог-файлов
Вполне можно сделать
tail -f file1 file2
Строчки будут появляться на экране по мере записи в файл. Не очень удобно, тем что они «перемешиваются», но в один лог падает много, а в другой мало (например access и error логи, в error очень редко что-то попадает), то вполне приемлемо.
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'
У меня Gentoo, там и в man tailf
, и в tailf --help
явно написано, что оно “deprecated” и “may have unfixed bugs and will be removed from util-linux in March 2017”. Так что не уже есть, а ещё есть, если только в debian не будут зачем‐то поддерживать эту программу своими силами. Напомнить, какой месяц сейчас? Конечно, когда это изменение окажется в последней стабильной версии будет уже не март, но всё равно лучше написать alias
.
По по-воду «еще» и «уже», окей, не знал. тем не менее не вижу причин не использовать эту утилиту.
ifconfig
пока не удаляют. И в man ifconfig
слов «deprecated» или «obsolete» у меня нет. В интернете можно найти man ifconfig
, где говорят про «obsolete», но заявлений вида «ifconfig
будет удалён {дата}» нет и там.
tail
, кстати, умеет вещи вроде «завершись, когда процесс с PID умрёт», «пробуй читать файл, даже если он удалён», «переоткрой файл, если его размер не изменился за N итераций», «читай файл каждые N секунд». Ничего из этого tailf
не умеет, а единственный ключ (кроме версии и помощи) -n
/--lines
/-{number}
совместим с tail
(версия и помощь, правда, не совместимы: tail
не поддерживает короткие варианты -V
и -h
). Ну и в чём смысл использовать tailf
вместо alias
а?
Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail.
linux != debian
find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz
Чтобы xargs'у не снесло крышу, необходимо поменять -print на -print0 и добавить -0 после xargs. Тогда файлы с пробелами в названии будут интерпритироваться как один файл, а не несколько.
И ещё хорошо бы закавычить *.png
, иначе команда find
будет вести себя неожиданно, если в текущей папке есть хотя бы один .png
-файл.
Плюс если файлов будет очень много, то xargs запустит tar больше одного раза, и в результате он попытается создать несколько раз архив с одним и тем же именем.
history | grep openconn
Вместо
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 !".
Файлы быстрее создавать через fallocate (особенно актуально для больших, типа свопа):
fallocate -l 10M out.txt
cat /etc/passwd | column -t –s:
После -s нужно пробел поставить.
column
из sys-apps/util-linux-2.28.2, работает без пробела.
mount | column –t
матерится:
column: –t: Нет такого файла или каталога
Вот что с людьми лень делает.
«Обычный минус» называется «дефисоминус» (U+002D HYPHEN-MINUS). А замена в комментарии не «длинный минус», а «короткое тирэ» (U+2013 EN DASH). Минус в юникоде тоже есть, и даже не один. По «чёрточкам» на хабре есть статья: https://habrahabr.ru/post/20588/.
Кстати, именно «длинного минуса» я в юникоде как‐то не вижу. Есть тяжёлый.
Ещё одна проблема с column — он не умеет учитывать ANSI escape sequence, поэтому есть вывод mount расцвечивается чем-нить вроде grc то фактически
mount | column -t
превращается в
grc /bin/mount | column -t
и колонки ломаются. Починить можно изменив порядок, но это набирать уже не очень удобно:
/bin/mount | column -t | grcat conf.mount
top интерактивный. Нажмите "?" для справки, там много полезного.
cat myfile | tr a-z A-Z > output.txt
cat myfile | tr "[:lower:]" "[:upper:]" > output.txt
Если мне хочется, чтобы что-нибудь выполнялось после закрытия консоли, я обычно запускаю в фоне (& на конце). Что позволяет nohup/script, чего не даёт просто фоновый режим?
Как ни странно, с учетом, что все примеры хорошо знакомы, самым неожиданным и приятным открытием стало узнавание про таблицификацию вывода… Очень круто, спасибо!
И конечно Advanced Bash-Scripting Guide.
Где приемлемо подождать, лучше вместо
while true
использовать
while sleep 1
Когда-нибудь вспомните хорошим словом.
С 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$
nohup wget site.com/file.zip
Можно ведь просто поставить "&" после команды?
wget site.com/file.zip &
Для создания файла определённого размера иногда всё же лучше не копировать нули, а сделать seek. Это и быстрее, и экономит ресурс ssd (если файл создаётся там). Правда, при этом для создания файла точно заданного размера придётся заняться арифметикой (чтобы скипнуть на нужный размер без единицы, а потом дописать 1 байт). Но и это можно упростить, если писать не байт, а удобное количество нулей, чтоб мозг не напрягать (например, для 100М файла не bs=1 count=1 seek=104857599, что трудно считать или помнить, а bs=1k count=1 seek=102399, что уже тривиально)
Другое дело, если нужно не просто создать файл, а именно выделить (зарезервировать) место. Там да, придётся честно писать все нули.
#Последний аргумент предыдущей команды
$_
#Удобно создавать директорую и переходить в неё
mkdir /var/www/project && $_
Статья для совсем новичков. Помню, раньше во всяких TLDP, LinuxJournal, LWN.net и т.д. печататлись статьи о совершенно зубодробительных командах и их комбинациях, типа, как передать бэкап каталога по ssh при помощи tar и т.п.
В примере с пингом google лучше вставить sleep 30s
или еще больше: к чему мучить несчастные сервера непрерывным пингом… Один хост погоды не сделает, но если все начнут писать подобные скрипты, то начнется DDOS. Особенно когда какой-нибудь китайский или филиппинский недоучка прочитает подобную статью и впендюрит подобный скрипт в прошивку недорогого, но распространенного роутера.
Статья для совсем новичков. Помню, раньше во всяких 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с не доступен непривилегированному пользователю.
DDOS начнется, когда десятки тысяч людей начнут использовать это в своих скриптах. Да и просто с дидактической точки зрения стоит объяснить, почему плохо, когда в примере в скрипте нет никакой задержки. Получается нерациональное решение, которое раз 5 в секунду запускает ping зря поедая ресурсы компьютера и сети.
По поводу сложности, в статье изложены самые азы работы с командной строкой, впрочем, даже из азов изложены не все. Таких статей в сети 100500 миллионов, каждый блоггер отмечается на этой ниве. «А вы знаете, что в командой строке Ctrl-A переходит в начало строки?»
Хотелось бы более изощренных примеров, в статье с таким заголовком, вот и все.
И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.
Самое главное значительно быстрее, поскольку scp не умеет организовывать сплошной поток и на кучке маленьких файлов никогда не добиться скорости сравнимой с tar.
Например нам нужна такая структура:
/var/lib/project1/test
/var/lib/project2/test
Создать эти каталоги можно одной командой:
mkdir -p /var/lib/{project1,project2}/test
echo 192.168.1.{1..254}|xargs -n1 -P0 ping -c1|grep «bytes from»
nmap -sn 192.168.1.0/24
, зачем эти извращения?
# nmap
bash: nmap: команда не найдена
Съемный носитель с тулзами тоже не панацея. Его можно банально потерять/сломать/забыть.
echo, xargs, ping, grep — стандартные программы с большой вероятностью присутствующие в ОС.
Если вы говорите про prod с отсутствием доступа к интернету и внутреннему зеркалу, то никто не мешает поставить нужное барахло в базовом образе/kickstart'е при установке и т. п.
find
/xargs
(findutils
) тоже могут отсутствовать, например. Всё зависит от того, что за базовый образ. То может быть мы вообще в контейнере с одним статическим бинарником, собранным против musl
.
Иногда помогает заглянуть в 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:~$
Но… прочел с удовольствием, проснулось желание повторить попытку знакомства. Пользуясь случаем поинтересуюсь у гуру данной платформы, с чего лучше начать почти новичку в данной области. Много читал про Debian, но тем не менее по обзорам и функционалу привлекает Arch Linux — не будет ли он слишком сложен в освоении? Какие еще варианты можете предложить?
Я начинал с Ubuntu, потом прямо из неё ставил Gentoo. По‐моему, с неё всегда проще всего начинать.
Я бы не рекомендовал Arch первой системой, у новичка он будет ломаться пять раз на дню, а через неделю забросите.
Для обучения лучше берите kubuntu/ubuntu, ставиться за 10-20 минут, почти никакого геморроя. Желательно перед установкой убедиться, что всё железо на машинке адекватное, то, опять же, намучаетесь.
Лучше поставить в виртуалку, сделать базовый образ и после этого ломать систему разными способами и пытаться восстановиться. Всякие стандартные вещи типа опечатка в /etc/fstab
, полностью забитый диск, смонтированный на /
, неудачно снесенное ядро и т. п.
А потом можно уже спокойно брать Arch или Gentoo. Кстати, при работе и настройке вне зависимости от дистрибутива в вики арча и генты можно найти ответы на многие вопросы.
Рекомендую arch. Если бы начинал с него, знакомство с Linux было бы на порядок продуктивнее. Ещё ставь zsh, oh-my-zsh.
А хочется десктоп то antergos. Это тоже arch, но красивый с установщиком. После кучи маков пересел.
Сначала возьмите Debian или что-то популярное на на его основе Mint/Ubuntu, чем больше сообщество и документации, тем вам проще будет искать ответы на поисковиках. Когда освоитесь, этот момент можно определить как — вспомнил что ещё осталась винда на компе, надо бы снести, поработайте с CentOS, основан на Red Hat и опыт пригодится в работе. А потом можете пробовать что угодно, хоть Arch хоть Gentoo.
прочел с удовольствием, проснулось желание повторить попытку знакомства
7 марта 2017 в 11:12
Слишком жирно.
гуру данной платформы, с чего лучше начать почти новичку
Джоршуа Леви «Искусство коммандной строки»
https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md
cat /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 тут ни при чём.
!!
— это ни разу ни повтор какой‐либо команды. Это history expansion: подстановка из истории. Ничто не мешает вам написать for arg in !! ; do echo $arg ; done
: найдите здесь «повтор последней команды». !!
при этом не единственный вариант: можно и взять предыдущую строку, соответствующую регулярному выражению, оставить от неё второе слово (оно же обычно первый аргумент) и заменить в этом слове x на y: !?regex?:1:s/x/y/
.
В любом случае, подстановка из истории оперирует не с командами, а со строками: «первым аргументом» в примере вполне может оказаться и |
, a ́sudo
может заполучить while
и, разумеется, не знать, что с ним делать (это часть синтаксиса оболочки и ни разу не команда, даже не shell builtin).
alias please='sudo $(fc -ln -1)'
Вчера нашел игрушку Hacknet
основанную на псевдо-взломах при помощи Терминала и набора команд (по заявлениям разработчиков — все команды рабочие и используются в реальной жизни для решения тех или иных задач)
По крайней мере после нескольких тренеровочных заданий из комментов узнал команду «cat».
Пока интересно.
Может кто то сталкивался с этим проектом, стоит ли продолжать или не заниматься ерундой, так как ничего толкового там нет (хотя основы все таки какие то закладываются)?
PS: пост не преследует целей прорекламировать что либо, крайне надеюсь что не нарушает (косвенно) правил ресурса и не вызовет агрессивной реакции участников сообщества.
PSS: обход защиты реальных сетевых объектов преследуется по закону (странно как игрострой вообще пропустил проект, ну да ладно)
После выхода из сессии протокол будет записан в файл typescript.
Макрософт уже в суд подавал?
С помощью Tab-а дополнять набирающее стало намного проще.
В чём отличие cd -. от cd…?
Пример:
Вы были в /home/user/folder5/, потом попали в директорию к примеру — /usr/lib/. если наберёте команду cd- то сразу вернётесь из /usr/lib/ в /home/user/folder5/. В случае же если вы из /usr/lib/ наюерёте cd… то попадетё всего лишь в /usr/
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
При поиске мусора захлямляющего диск для меня это порой единственный весомый иснтрумент.
Но помню своё удивление, когда я впервые начал изучать командную строку *nix систем: нужно помнить много заклинаний. Нельзя просто логически найти или вывести по какой-то закономерности название нужной команды, нужно просто про неё знать. Было бы круто сделать какой-то автоподсказчик, где ты постепенно углубляясь по некоторой логической структуре, в итоге находишь нужную команду и получаешь основную информацию о том, как её использовать.
man — это не то, т.к. это просто набор гипертекстовых документов, которые надо прочесть целиком в больших количествах, чтобы понять, что вообще происходит, а потом, опять же, помнить все заклинания наизусть. Что и я делал, когда изучал систему самостоятельно.
Самые полезные приёмы работы в командной строке Linux