Полезные Забавы
Заменить повторяющиеся пустые строки на одну пустую строку
Допустим у вас есть файл в котором множество повторяющихся пустых строк. А вам
хотелось бы повторяющиеся пустые строки заменить на одну пустую строку (что бы
было легче читать например).
sed -e ':a;/^$/N;/\n$/{D;ba}' file.txtПримечание:
В *BSD системах, однострочник придется оформить так:
sed -e :a -e '/^$/N;/\n$/{D;ba' -e '}' file.txtтак как после имени метки и перед } необходим перевод строки.
Объяснение как это работает
Удалённое выключения компа без входа в систему
В консоли от root выполняем следующие действия:
# adduser smile -u 0 -g 0 -d / -s /bin/smile # cat > /bin/smile
внутри cat пишем:
#!/bin/sh
shutdown -h nowжмём ctrl+d и далее выполняем:
# chmod +x /bin/smile # echo /bin/smile >> /etc/shells
Теперь с другой консоли или через ssh вползаем в систему под юзером smile
Информер в консоли
Этот однострочник забирает и чистит "погодный информер" с gismeteo.ru, и может использоваться например в conky или в .bashrc
curl -s http://informer.gismeteo.ru/text/33345-1.JS|sed -e 's/^.*write("//g'|\ sed -e 's/\(<[^>]*>\)\+/\n/g'|sed -e 's/");//g'|iconv -f cp1251 -t UTF-8
Алгоритм подсчета кол-ва бит в числе
смотрим функцию bit_set_cnt()
работает, но сам алгоримт неочевиден Ж:-)
/* подсчет кол-ва бит в числе */
#include <stdio.h>
int bit_set_cnt(unsigned long);
int main()
{
unsigned long i = 0xff;
while(i--)
printf ("i = %#x, set bit count = %d\n", i, bit_set_cnt(i));
return 0;
}
int bit_set_cnt(unsigned long i)
{
int cnt = 0;
while (i)
{
i &= i - 1;
cnt++;
}
return cnt;
}перевод чисел между 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 (видел и такое Ж:-)
Перевод шеснадцатиричного представления 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; echo4) 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. но это только смотреть, пайпы не пройдут Ж:-)

