bash
Замер времени выполенения команды
Как раз сейчас понадобилось замерить время работы скрипта... Поискал тут, не нашел :( Зато гугль помог. А все оказалось не просто, а очень просто:
$ time for i in {1..100000} ; do echo $i $>/dev/null ; done real 0m3.680s user 0m2.964s sys 0m0.692s
ЗЫЖ В sh этого нету.
Распаковка архивов
### Handy Extract Program extract () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted via >extract<" ;; esac else echo "'$1' is not a valid file" fi }
Уже не помню где нашел, не мое :)
Поместить в ~/.bashrc или profile
выход из bash без сохранения истории
перевод типса из shell-fu.
самый простой вариант это SIGKILL своего шелла:
kill -9 $$
вариант по-нежнее:
unset SAVEFILE; unset HISTFILE;
Из TIF в PDF и сбор всех PDF в один
Собрал небольшой скриптик для перевода из tif в pdf, а потом сбор всех pdf файлов в один.
Использовал:
http://www.opennet.ru/docs/RUS/bash/bash-1.html
http://flerant.in.nnov.ru/blog/1188235.html
http://www.togaware.com/linux/survivor/Convert_MS_Word.html
http://www.linuxgraphics.ru/forum/viewthread.php?thread_id=566#post_5215
UPD: new version
Линки в тему:
- Способы объединения pdf-файлов
- Imagemagick. Создать из jpeg pdf
- pdf, doc и другие не совсем текстовые файлы в vim
Просмотр ника по ICQ UID на bash
#!/bin/bash curl http://people.icq.com/people/about_me.php?uin=$1 2> /dev/null | \ grep "<div class=\"h5-2-new\">" | awk -F ">" '{print $2}' |\ iconv -f cp1251 -t utf-8 | awk -F "<" '{print $1}'
UPD:
#!/bin/sh if [ -z "$1" ]; then echo Usage: $(basename $0) ICQ-UIN exit 1 fi curl http://people.icq.com/people/about_me.php?uin=$1 2> /dev/null | \ sed -ne 's,.*<div class="h5-2-new">\([^<]*\)</div>.*,\1,p' | iconv -f cp1251 -t utf-8
Удобный алиас в zsh для copy/paste примеров из советов
На linsovet.com многие советы содержат примеры запуска команд из командной строки в формате в подобном формате
$ echo команда 1 $ echo команда 2
Этот формат неудобен если вы хотите скопировать сразу несколько команд и скопировать прямо в терминал. Если добавить в ~/.zshrc алиас
alias \$=''
то эта проблема будет решена. Если команда начинается с $, то он будет автоматически убран
Идея взята отсюда
Установка свежего Chromium
Многим из нас хорошо известен браузер Chromium (да-да, тот самый, основа Google Chrome), который на данный момент очень активно разрабатывается, да так, что свежие сборки выходят буквально каждые пару часов. Он все еще довольно нестабилен, особенно на сайтах со сложным содержимым, однако его с успехом можно использовать в качестве быстрого просмотрщика ссылок. ПPредставленный здесь скрипт поможет вам установить Chromium на свою Linux-машину и поддерживать версию этого браузера в актуальном состоянии.
Создайте скрипт, обозвав, например, update.sh. Запустите. При следующих запусках будет проверяться локальная версия и свежая сборка, и если таковая существует - локальная версия будет обновлена.
Добавьте в свой PATH=$HOME/bin:$PATH (если еще нет)
Пишем альтернативный поиск по истории переписки в Pidgin
Итак, для начала скажу что я меньше месяца в линуксе, и естественно, пока что ламер. Поэтому предоставляю не столько код, сколько идею.
Многие мои знакомые (да и я сам) недовольны странно реализованным способом поиска в истории по ключевым словам. Хочется чего-то более удобного.
Этот элементарнейший bash-скрипт позволяет нам автоматически проискать всю историю переписки с определенным человеком, сгенерировать на ее основе HTML документ содержащий строки с искомым ключевым словом и открыть его для просмотра. Я не хотел публиковать этот позор, но друзья сказали, что это очень удобная штука...
Пользуйтесь, делайте что хотите, изменяйте, улучшайте, доведите до ума, делайте из фекалий кондитерское изделие. :) Критика приветствуется, улучшения КРАЙНЕ приветствуются. Особая просьба пофиксить костыль в коде, он заметен. А все от незнания.
Bash: Добавляем дату и время в историю команд
Данная функция будет очень полезна, если сервер администрирует несколько человек, или даже в случае если вы единственный администратор сервера, вам будет полезна вспомнить когда та или иная команды была выполенены.
Отредактируйте ~/.bashrc добавив внизу такую строку:
Маленький однострочник на баше для получения погоды в консольку (на 3 дня)
wget -q -O - http://wap.gismeteo.ru/26702.wml |\ sed -e '/^<br\/>.*\|<\/\?p>\|<a href.*\|(c).*\|.*wapstart.ru.*\|.*wml.*\|.*?xml.*\|<\/card>/d;s/^.*title="\(.*\)">/\1\n\n/;s/<br\/>//g;s/<img src=.*alt="\(.*\)"\/> <b>\(.*\) .*<\/b>/\1 - \2/g'
Чтобы получить погоду на свой город, идем по линку http://wap.gismeteo.ru/, жмем линк "Другие города", дальше находим свой город и смотрим его адрес, для Калининграда это http://wap.gismeteo.ru/wap2/towns/26702.wap2, вот тут нам нужно число, которое стоит перед ".wap2". Запоминаем его и вписываем в скрипт перед ".wml". Все :)
ЗЫЖ Знаю, что скрипт можно написать и лучше, но писал его "на коленке" за минут 15, главное чтобы работало. Да и не для себя делал, а по просьбе одного знакомого, как простенький пример.
Различные стили автодополнения в командной строке vim
Для тех кто хочет в командной строке vim автодополнение файлов как в bash заносим в ~/.vimrc
set wildmode=longest,list
При нажатии Tab имя файла дополнится до наибольшего совпадения и выведет список альтернатив.
Мне больше нравится автодополнение как в моем zsh
set wildmode=list:longest,full
подробности :help wildmode
timeout: запуск команды с таймаутом по истечении которого команде посылается сигнал
интересный и очень полезный скрипт нашел в документации к башу
запуск команды с таймаутом. по истечении которого команде посылается сигнал. например -9
$0 [-signal] [timeout] [:interval] [+delay] [--] <command> SIG=-TERM # default signal sent to the process when the timer expires timeout=60 # default timeout interval=15 # default interval between checks if the process is still alive delay=2 # default delay between posting the given signal and # destroying the process (kill -KILL)
редирект STDERR в пайп
В баше на первый взгляд нельзя отправить поток STDERR через пайп в другую программу. По крайней мере нельзя просто добавить '2' к операторам '|' и '>()'.
Но на самом деле это делается очень просто:
$ ./command 2>&1 >log_normal | tee log_errors | mailДело в том, что операторы редиректа обрабатываются с конца команды. Таким образом, в данном случае сначала stdout будет перенаправлен в файл log_normal, затем stderr будет скопирован в stdout.
Команда
$ ./command >log_normal 2>&1 | tee log_errors | mailЗапишет в log_normal сообщения и из stdout и из stderr, а в log_errors не попадет ничего.
Подобная запись может быть полезна при запуске скриптов из крона, когда лог хочется сохранить в файле, а ошибки - и сохранить в файл, и получить по почте.
PS
Подробнее здесь
Использование списка аргументов в bash и zsh в интерактивном режиме
Как то был совет "Вставка последнего аргумента предыдущей команды в bash и zsh." который показывает как более эффективно работать в командной строке.
Но он не поможет если вам нужен не один аргумент, а несколько. В этом совете представлен пример работы когда многим командам нужно указывать как параметр имена нескольких файлов.
Для этого используется механизм передачи параметров, который позволяет ссылаться на параметры с помощью переменно $@.
Задача: создать два скрипта, дать им права и добавить их в cvs репозиторий.
port-check - чекаем порты без проблем или скрипт для проверки доступности портов
Нам, админам, довольно часто, точнее постоянно, приходится мониторить различные ресурсы своей сети и не редко удаленной. Если нет возможности поставить на хост средства мониторинга, то приходится проверить по портам. Раньше я это делал так:
$ netcat -w3 -z host port && echo OKА что если нужно проверять несколько хостов и/или портов? Вот для этих целей и был написан скрипт.
Алиас для показа самых больших файлов и директорий в текущей директории
"Резиновый винчестер это не игрушка, это мечта" Ж:-)
Как всегда не хватает места, и при поиске чего бы такого удалить может помочь алиас который показывает файлы и директории которые занимают больше мегабайта.
для bash, заносим в ~/.bashrc
alias dud="(shopt -s dotglob;du -ks * | sort -nr | sed -e 's/^\([0-9]\{1,\}\)[0-9]\{6\}[^0-9]/\1G\t/;t;s/^\([0-9]\{1,\}\)[0-9]\{3\}[^0-9]/\1M\t/;t;d')" #или альтернативный вариант с perl alias dud="(shopt -s dotglob;du -ks * | sort -nr | perl -pe 's/^(\d+)\d{6}[^\d]/\$1G\t/ || s/^(\d+)\d{3}[^\d]/\$1M\t/ || s/.*\n//')"
для zsh, заносим в ~/.zshrc
alias dud="(setopt globdots;du -ks * | sort -nr | sed -e 's/^\([0-9]\{1,\}\)[0-9]\{6\}[^0-9]/\1G\t/;t;s/^\([0-9]\{1,\}\)[0-9]\{3\}[^0-9]/\1M\t/;t;d')" #или альтернативный вариант с perl alias dud="(setopt globdots;du -ks * | sort -nr | perl -pe 's/^(\d+)\d{6}[^\d]/\$1G\t/ || s/^(\d+)\d{3}[^\d]/\$1M\t/ || s/.*\n//')"
Цифры примерные, так как считается что в мегабайте не 1024 байт, а 1000.
Пример использования:
Настройка функциональных клавиш в ZSH
Как единообразно задействовать функциональные клавиши в zsh на различных терминалах
Ссылка: 10 трюков в командной строке, о которых вы не знали. Честное слово.
10 трюков в командной строке, о которых вы не знали. Честное слово.
Рекомендую так же почитать коментарии, так как в статье не всегда оптимально.
via nexus
Как съесть один пирог дважды: bash, tee, process substitution
Задача проста: обработать один стандартный ввод с помощью двух (или более) фильтров.
Тривиальное решение: сохранить ввод в файл и потом его дважды обработать.
$ some_cmd > tmp_file; filtr1 < tmp_file; filtr2 < tmp_file; rm tmp_fileСуществует однако полезная программа tee, которая умеет свой стандартный ввод записывать в много разных мест. Вот бы взять да и отослать результат не в разные файлы, а послать на вход разным процессам! Если в bash разрешена такая штука как process substitution, то это вполне возможно.
Пример: выведем список юзеров, у которых логин-шелл установлен в /bin/bash, а также число таких юзеров.
$ grep /bin/bash /etc/passwd | tee >(wc -l)Здесь мы составили нужный список с помощью grep, размножили его с помощью tee и одну из копий подали на вход команде wc -l, которая сосчитает количество строк. Пример, конечно, игрушечный, но общая идея должна быть ясна :)



