TIMTOWTDI
There Is More Than One Way To Do It
Заменить повторяющиеся пустые строки на одну пустую строку
Допустим у вас есть файл в котором множество повторяющихся пустых строк. А вам
хотелось бы повторяющиеся пустые строки заменить на одну пустую строку (что бы
было легче читать например).
sed -e ':a;/^$/N;/\n$/{D;ba}' file.txtПримечание:
В *BSD системах, однострочник придется оформить так:
sed -e :a -e '/^$/N;/\n$/{D;ba' -e '}' file.txtтак как после имени метки и перед } необходим перевод строки.
Объяснение как это работает
перевод чисел между 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; 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. но это только смотреть, пайпы не пройдут Ж:-)

