для написания стартовых скриптов в debian по совету ramok можно использовать темплейт /etc/init.d/skeleton, предварительно прочитав /etc/init.d/README
sh
создание собственных стартовый скриптов в debian
Как узнать размеры терминала в скрипте
Иногда полезно узнать размеры терминала в котором работает ваш скрипт (например при использовании dialog).
0. По умолчанию терминалы под X-Window устанавливают размеры терминалов в переменные LINES и COLUMNS.
Но к сожалению в скрипты они не экспортятся Ж:-(
1. Можно воспользоватся программой stty, если она поддерживает параметр size
$ stty size 71 159 $ eval `stty size | sed -e 's/\(.*\) \(.*\)/LINES=\1 COLUMNS=\2/'` $ echo $LINES $COLUMNS 71 159 $
2. Если на машине установлен ncurses (а сейчас сложно тайти машину на которой он не стоит Ж:-)
то можно воспользоваться программой tput.
COLUMNS=`tput cols` LINES=`tput lines`
3. Если на машине установлен X-Window, то можно воспользоваться командой resize которая возвращает
код на sh для установки переменных LINES и COLUMNS.
$ resize COLUMNS=159; LINES=71; export COLUMNS LINES; $ eval `resize` $ echo $LINES $COLUMNS 71 159 $
Маска для дот-файлов
Иногда возникает необходимость скопировать все файлы настройки из домашней директории (так называемые дот-файлы, так как они начинаются с точки) куда нибуть в другую директорию или залить на другую систему. Казалось бы чего проще?
cp -r .* backup-dir
То есть .* говорит "любое имя файла или директории начинающиеся с точки". Но тут есть подвох. Дело в том что в каждой директории есть две директории с именами . и .., что обозначает "текущая директория" и "родительская директория" соответсвенно.
cp -r .??* backup-dir
То есть .??* говорит "любое имя файла или директории начинающиеся с точки и содержащая не меньше двух символов". Хотя конечно эта маска не охватывает файлы короче трех символов. Лично я часто пользуюсь этой маской, потому что она применима для большинства случаев и короткая Ж:-)
Спасибо darkk-у, подсказал правильную sh маску .[^.]*
Самая правильная маска для этого выглядит в zsh так:
cp -r .*~(.|..)(^@) backup-dir
.* "все файлы начинающиеся с точки"
~ "отрицание,все маски что идут после ~ не влючены в результат"
(.|..) "имя файлов . или .."
(^@) "не символические ссылки"
ну или еще более правильная для копирования дот-файлов из домашней директории
cp -r ${HOME}/.*~${HOME}/(.|..)(^@) backup-dir
PS
как это выглядит в bash?
Цифровые аргументы для dd в шеснадцатиричном виде
Как ни странно утилита dd не поддерживает цифровые аргументы в шеснадцатиричном виде, хотя часто бывает нужно указать смещение или размер блока в более удобном для этого шеснадцатиричном виде. Более того в зависимости от аргумента, если передать число в шеснадцатиричном виде, в С нотации, то dd может или закончится ошибкой или проинтерпретировать как 0. Например:
$ dd bs=0x1 dd: неверный номер `0x1' $ dd count=0x1 0+0 записей считано 0+0 записей написано скопировано 0 байт (0 B), 1,248e-05 секунд, 0,0 kB/s
Запуск команды climm во всех аккаунтах
К сожалению встроенной возможности запускать команду climm во всех аккаунтах climm нет, но можно дописать необходимое Ж:-)
1. Качаем скрипт
$ wget http://rusmafia.org/linux/files/climm-global-cmd.txt -O climm-global-cmd
2. Копируем его в директорию ~/bin и даем право на исполнение
$ cp climm-global-cmd ~/bin && chmod +x ~/bin/climm-global-cmd
3. В любимом редакторе изменяем в скрипте переменную CONN_NUM в которой нужно через пробел перечислить все соединения в которых мы хотим выполнять команды.
Номера соединений можно подсмотреть в climm командой conn.
4. В climm создаем алиас 'g' (от "global") в котором вызываем скрипт и не забываем сохранится.
climm> alias auto g !~/bin/climm-global-cmd climm> save
5. Используем макрос. Например перейдем во всех аккаунтах в away
climm> g away
Посмотреть кто в онлайне во всех аккаунтах
climm> g e
Вертикальная конкатенация файлов
Склеивание столбцов данных из файлов 1.txt и 2.txt, с разделителем пробел, производится командой:
$ paste -d " " 1.txt 2.txt > 3.txt $ cat 1.txt 1 1 2 2 3 3 $ cat 2.txt 4 5 6 $ cat 3.txt 1 1 4 2 2 5 3 3 6
Либо можно сделать так:
$ paste -s -d " " 1.txt 2.txt > 3.txt $ cat 3.txt 1 1 2 2 3 3 4 5 6
Статья взята отсюда http://www.opennet.ru/tips/info/1460.shtml
Сколько строчек в файле?
Так как узнать сколько строк в файле? Как всегда в Unix есть множество способов это узнать Ж:-)
ramok@~/ wc -l .zshrc 724 .zshrc ramok@~/ cat .zshrc | wc -l 724 ramok@~/ sed -ne '$=' .zshrc 724 ramok@~/ awk 'END{print NR}' .zshrc 724 ramok@~/ grep -c "" .zshrc 724 ramok@~/ printf "G\n=\n" | ed -s .zshrc 2> /dev/null 724
Использование команды перенаправления без команды
# если файла tmp.txt не существовало, создается файл нулевого размера sh% ~/ > tmp.txt sh% ~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt # если файл tmp.txt существовал, то файл обнуляется sh% ~/ echo 123 > tmp.txt sh% ~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt sh% ~/ > tmp.txt sh% ~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txtВ zsh это идея, как всегда, более развита Ж:-) Существуют переменные окружения NULLCMD и READNULLCMD, по умолчанию установленные в cat и more соответственно. Что позволяет такие дополнительные возможности:
# аналог cat > tmp.txt. ничего не вводим, сразу жмем ctrl-d # получаем файл нулевого размера. ramok@~/ > tmp.txt ^D ramok@~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt # аналог cat > tmp.txt. вводим то что нужно внести в файл и жмем ctrl-d ramok@~/ > tmp.txt 123 ^D ramok@~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt # аналог cat >> tmp.txt. вводим то что нужно добавить в файл и жмем ctrl-d ramok@~/ >> tmp.txt 456 ^D ramok@~/ ls -l tmp.txt -rw-rw-r-- 1 ramok ramok 8 2007-06-09 11:33 tmp.txt # аналог more < tmp.txt ramok@~/ < tmp.txt 123 456Естественно можно установить NULLCMD и READNULLCMD в свои значения, например в true и less соответственно. Или придумать что-нибудь лучшее Ж:-)
PS
и кой чего в нагрузку Ж:-) в шеллах есть встроенная команда :, аналог команда true, которую тоже можно использовать для создания/обнуления файлов более коротким способом, чем echo -n > файл:
ramok@~/ :> tmp.txt
ramok@~/ ls -l tmp.txt
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt
Вывод отладочной информации в скриптах shell
При отладке скрпитов sh часто очень удобно видеть какие команда выполняется в результате работы скрипта. Включить вывод отладочной информации в скрипте можно командой:
set -xЕсли скрипт большой и хочется выводить отладочную информацию только для проблемного куска кода, то отключить вывод можно командой:
set +x
перевод чисел между 10 и 16-тиричными системами исчисления в консоли
#1) sh
$ printf "%x\n" 29 $ printf "%d\n" 0x2c $ let 0xff # в OpenBSD не работает, в GNU и FreeBSD работает $ echo $((16#2c)) # в FreeBSD не работает, в GNU и OpenBSD работает $ echo $((0xff)) и echo $((077))
#2) bc
$ echo "obase=16;29" | bc $ echo "ibase=16;2C" | bc
#3) dc
$ echo 29 | dc -e "16o?p" $ echo 2C | dc -e "16i?p"
#4) awk
$ echo 29 | awk '{printf "%x\n", $0}' $ echo 0x2c | awk '{print strtonum($0)}'
#5) perl
$ echo 29 | perl -ne 'printf "%x\n", $_' $ echo 2c | perl -ne 'print hex $_'
я знаю есть еще множество способов, предлагайте еще! Ж:-)
как минимум редствами bash, zsh, sed (видел и такое Ж:-)
как посчитать сумму чисел в выводе программы
довольно часто возникает необходимость посчитать сумму чисел в выводе какой-либо программы.
например, если сделать grep pppd /var/log/daemon.s | grep -Po '(?<=received )\d+', то можно получить что-то вроде
994 3301302 259550 4825 91793 103160 171276 58533 2563
это число байт, принятых по модему за несколько последних сессий. просуммировать такой вывод очень просто. достаточно создать скрипт, содержащий всего две строчки:
#!/bin/sh
awk '{print $1}' | grep -Po '^\d+([.,]\d+)?' | sed -n '{s/$/+/;s/,/./;H;}; ${g;s/\n//g;s/+$//g;p}' | bc
назвать его, скажем, sum, а потом сделать
Перевод шеснадцатиричного представления IP в стандартную форму в конс
перевод hex IP -> dec IP
1) bash only by ams
$ i=ffffffc0; echo $((0x${i:0:2})).$((0x${i:2:2})).$((0x${i:4:2})).$((0x${i:6:2}))
2) так короче но $[] dericated
$ i=ffffffc0; echo $[0x${i:0:2}].$[0x${i:2:2}].$[0x${i:4:2}].$[0x${i:6:2}]
3) тоже вроде только для bash как имеющий опцию -n в read
$ echo ffffffc0 | while read -n 2 D; do [ -z $D ] || printf "%d." 0x$D; done; echo
4) sh+sed
$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)\(..\)\(..\)\(..\)/0x\1 0x\2 0x\3 0x\4/'`
5) тоже но немного разбираясь в sed Ж:-)
$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)/0x\1 /g'`
6) printf only by ams. но это только смотреть, пайпы не пройдут Ж:-)
[code]

Последние комментарии
1 час 38 минут назад
2 часа 22 минуты назад
2 часа 26 минут назад
2 часа 51 минута назад
3 часа 34 минуты назад
4 часа 5 минут назад
4 часа 10 минут назад
23 часа 31 минута назад
2 дня 2 часа назад
2 дня 13 часов назад