Консольные хитрости

Опытные юниксоиды знают и осознают всю мощь использования командной строки и немного “свысока” посматривают на “мышевозов” :) Но и в консоли есть свои недостатки, которые побеждаются с помощью каких-то приемов. У каждого свой набор, а я хочу поделиться своими наработками-находками-привычками, которые появились за долгие годы использования командной строки. Эдакий небольшой cheat-sheet.
Начнем :)

1. Копирование файлов с указанием прогресса. Всегда чертовски не хватало информативности в cp

rsync --progress file1 file2

2. Преобразование текста в картинку. Использовал для создания простенькой капчи

echo -e "Some Text Line1\nSome Text Line 2" | convert -background none -density 196  -resample 72 -unsharp 0x.5 -font "Courier" text:- -trim +repage -bordercolor white -border 3  text.gif

3. Поиск и замена в текстовых файлах

find . -iname "FILENAME" -exec sed -i 's/SEARCH_STRING/REPLACE_STRING/g' {} \;

4. Метод Столлмана! Отправка веб-странички по почте :)

{ u="http://twitter.com/boombick"; echo "Subject: $u"; echo "Mime-Version: 1.0"; echo -e "Content-Type: text/html; charset=utf-8\n\n"; curl $u ; } | sendmail recipient@example.com

5. Запись iso-файла на диск

cdrecord -v speed=4 driveropts=burnfree dev=/dev/scd0 cd.iso

6. Ограничение канала для scp. В данном случае ограничен 10kbps

scp -l10 boombick@srv02:/home/svnstat/* .

7. Скриншот на удаленной машине :) (С запущенными иксами конечно)

DISPLAY=":0.0" import -window root screenshot.png

8. Качаем и сразу распаковываем :)

wget -qO - http://example.com/path/to/blah.tar.gz | tar xzf -

9. url_encode :) Достаточно примитивно, но часто помогает

echo "$url" | sed 's/%/%25/g;s/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g'

10. Погода в Москве :) Подставьте свой город

curl -s "http://www.google.com/ig/api?weather=Moscow" | sed 's|.*<temp_c data="\([^"]*\)"/>.*|\1|'

Пока все, to be continued


 

Система Orphus

 


 

Comments: 18

  1. Flycat February 28th, 2010 at 11:46 am

    Первым — ну просто убил наповал! Позавчера синкал два диска на 1.7T, жалел, что нет такого. В общем, покраснел и ушёл читать man-ы. :-)

  2. SemenSemenych February 28th, 2010 at 12:11 pm

    При копировании дисков, всё же через dd наверное быстрее будет. А у dd можно посмотреть его прогресс, если увести его в бэкграунд и посылать ему сигнал USR1. К примеру как написано тут:
    http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

  3. GiNeR February 28th, 2010 at 12:23 pm

    В 8-м лучше tar xf или tar xvf.

  4. Ivan A-R February 28th, 2010 at 12:37 pm

    Ты бы длинные команды разбил обратными слешами на строки. А то со скроллами нечитабельно.

    Кстати, tar без ключа f и так читает из stdin ;-)

    bonus: Отправлять файлы по почте удобно через mutt:

    echo “Body” | mutt -s “subject” -a file.name — some@body.domain

  5. jungehexe February 28th, 2010 at 12:44 pm

    вместо пятого лучше пользоваться dvdbackup

    вместо изо будет нормальная файловая структура

  6. anonimous February 28th, 2010 at 8:26 pm

    Интересно.

    Добавил по cron’у запуск notify-send с результатом команды – можно и в conky :
    wget -q –header=’Accept-Language: ru’ “http://www.google.com/ig/api?weather=Moscow” -O – | sed “s|/>|\n|g”|egrep “<(temp_c data|condition data|day_of_week data|low data|high data)=” | iconv -f cp1251 -t utf8 |tr -d \”|while IFS=”=” read A B;do echo “$A” | grep -q “forecast_conditions” && echo; echo -ne ” \t$B”;done

    Сплошная облачность -3
    Вс -3 0 Местами солнечно
    Пн 1 3 Местами солнечно
    Вт -1 4 Снегопад
    Ср -7 1 Местами солнечно

  7. boombick February 28th, 2010 at 11:15 pm

    2anonimous
    спасибо, круто! :)

  8. tux March 1st, 2010 at 12:41 pm

    благодарю , мне как новичку очень интересно потестить ваши примеры, но вот на втором что-то я забуксовал, мне вот так отвечают:
    convert: option requires an argument `-background’ @ convert.c/ConvertImageCommand/691.
    чтобы это значило, не подскажите ?

  9. tux March 1st, 2010 at 12:51 pm

    ops все исправил, извините за пост выше )

  10. adw0rd March 2nd, 2010 at 10:51 am

    Спасибо, кое что возьму себе на вооружение.
    А по поводу прогресс-баров, вы не юзал отдельные утилиты для этих целей? Что-то типа http://www.theiling.de/projects/bar.html

  11. boombick March 4th, 2010 at 11:16 am

    2adw0rd
    Спасибо, любопытно :)

  12. Alazavar @ Израиль March 5th, 2010 at 2:38 pm

    Согласен с Flycat… Сижу красный как рак… Стыдно…Ну еще бы – не додуматься до такой простой вещи! Хотя может я это знал да забыл))

  13. HomeCreate March 6th, 2010 at 1:52 pm

    По поводу первого:

    use pv, Luk!

  14. Damon March 9th, 2010 at 6:46 pm

    2adw0rd
    Когда-то шляясь по вэбу нашел интересный вариант прогрессбара на чистом шелле. К сожалению не помню уже источник…

    #!/bin/sh

    # usage: progress
    #PB_NOPERC=1 # если определена, не выводятся проценты
    #PB_NOITEM=1 # если определена, не выводится текущее_положение/максимум

    progress()
    {
    local width=50
    local max=$1 curr=$2 pos=$width perc=100
    if [ $curr -lt $max ]; then
    pos=$((curr*width/max))
    perc=$((curr*100/max))
    fi
    local str=”\r[$(printf "%${pos}s" \
    | sed 's/ /#/g')$(printf "%$((width-$pos))s" \
    | sed 's/ /-/g')]”
    [ -z "$PB_NOPERC" ] && str=”$str $perc%”
    [ -z "$PB_NOITEM" ] && str=”$str ($curr/$max)”
    echo -ne $str 1>&2
    [ $perc -eq 100 ] && echo
    }

    Для себя реализовал на нем простейший скрипт для бэкапа некоторых директорий (дописать после progress() ):

    title()
    {
    LEN=`echo $1 | wc -c`
    [ $(($LEN%2)) -eq 0 ] && ((LEN++))
    POS=$(( (25-$LEN)/2 + $LEN ))
    printf “+++++[%${POS}s" $1
    printf "%$(($POS-$LEN))s]+++++\n” ” ”
    }

    NOW=`date +%Y.%m.%d_%H.%M.%S`; echo -ne “33[1;34m"; echo ; echo +--------------------------------------+; echo "| Create backup: $NOW |"; echo +--------------------------------------+; echo -ne "33[m"; ls -l | grep '^d' | grep -v '\-=backup=-' | sed 's/^.* \([^ ]\+\)$/\1/’ | while read i; do echo ; title $i; ALL=`find $i | wc -l`; MAXCOUNT=$((ALL/100)); if [ $MAXCOUNT -eq 0 ]; then MAXCOUNT=1; fi; mkdir -p — -=backup=-/$NOW; ( cd — -=backup=-/$NOW; title $i >>-=log=-; tar -cvjf $i.tar.bz2 ../../$i 2>>-=log=- | while read j; do COUNT=$((COUNT+1)); if [ $(($COUNT%$MAXCOUNT)) - eq 0 ] || [ $ALL -eq $COUNT ]; then progress $ALL $COUNT; fi; done ); done

    Когда-то, ради прикола накатал его в одну строчку, теперь разбираться не охота, как он работает. Но в двух словах — подсчитывается общее кол-во файлов и поддиректорий и по мере вывода имен пакуемых файлов tar’ом, декрементируется и передается progress’у.

    PS: Я это к тому, что в UNIX’е можно обойтись и более простыми средствами, не обязательно под каждый чих выкачивать и собирать что-то бинарное… :-)

  15. Damon March 9th, 2010 at 6:48 pm

    Пример работы:
    bash-3.1$ ./backup.sh

    +————————————–+
    | Create backup: 2010.03.09_18.44.02 |
    +————————————–+

    +++++[ ACE_TAO ]+++++
    [##################################################] 100% (14/14)

    +++++[ COBRA ]+++++
    [######--------------------------------------------] 13% (6/46)
    ^C
    bash-3.1$

  16. cmp@nml.ru March 9th, 2010 at 9:28 pm

    Черт, дополнительный ввывод промежуточных данных замедляет процесс, и при определенных условиях очень сильно, поэтому только dd при больших объемах, пока копирует покурить, а если уже не лезет killall -USR1 dd, может и на кофе времени хватит.

  17. boombick March 9th, 2010 at 10:30 pm

    Damon, ого, фундаментально! :)
    Я готовлю очередной пост примерно на эту же тематику, вы позволите использовать ваши наработки?

  18. Damon March 10th, 2010 at 11:46 am

    boombick, без вопросов.
    progress(), все равно не моя ф-ция, а остальное тривиально, вобщем-то. :-)

Add a Comment