Программированние в shell и проблемы (Давайте делиться траблами здесь)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
Warderer
Модератор
Сообщения: 1055
Статус: киберпИнгвин на гусеничном ходу
ОС: Debian unstable

Программированние в shell и проблемы

Сообщение Warderer »

Понадобилось создать по данным из текстового файла каталоги:
Исходные данные: текстовый файл представляющий собой таблицу, разделенную символами ":"
Требуется: Создать в текущем каталоге папки по третьему полю в этом файле.

Рассуждения: Нужно обеспечить вытаскивание текстового поля - соответственно awk, сделать его уникальность, соответственно uniq и создать каталоги, соответственно mkdir.

Пробуем для начала на echo, чтобы потом не чистить каталог:
for i in `awk -F ":" {print $2} | unique` ; do echo ./$i ; done
Лезет полная фигня, ибо пробелы внутри поля считаются разделителями для echo.
Пока что обошелся заменой пробелов на подчеркивания, но как-то это некузяво...
Пока вот так:
for i in `awk -F ":" {print $2} | unique | sed {s/ /_/}` ; do mkdir ./$i ; done
Как бы сделать получше, сохранив понятность?

Есть подозрения, что может помочь xargs, но как, пока не представлю....
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программированние в shell и проблемы

Сообщение Jan2ary »

Первое что в голову приходит

for i in `awk -F ":" {print $2} | unique | sed {s/ /\ /}` ; do mkdir ./$i ; done

т.е. ставить перед пробелом слеш...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
Warderer
Модератор
Сообщения: 1055
Статус: киберпИнгвин на гусеничном ходу
ОС: Debian unstable

Re: Программированние в shell и проблемы

Сообщение Warderer »

Скажи честно, ты это пробовал, прежде чем посоветовать? Я это делал. Не катит.
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

cat src.file | sed -e 's/\([^:]\+:\)\{2,2\}\([^:]\+\)\(.\+\)/\2/;s/\ /\\ /g' | sort | uniq | xargs mkdir -p

проверил. работает. :new_megalol:

ну или просто замени в примере Jan2ary: sed {s/ /\ /} на sed {s/\ /\\ /g}
слава роботам!
Спасибо сказали:
Аватара пользователя
JaGoTerr
Сообщения: 380

Re: Программированние в shell и проблемы

Сообщение JaGoTerr »

Странно... sed, awk... Ведь куда проще заюзать cut в данном случае:

Код: Выделить всё

cat file.txt | cut -d ':' -f 3 | xargs mkdir -p

ЗЫ: ключик -p более для того, чтобы mkdir не матюгался на уже имеющиеся каталоги, но и создание вложенных не помешает, наверное.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

не катит. все равно надо пробелы заменять.
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

Для JaGoTerr: респект - правильно, но нет uniq

А я добавлю, что если надо в цикле обрабатывать фразы с пробелами, то можно идти двумя путями:
1. Перед циклом изменить переменную IFS (убрать оттуда пробел)
2. ИМХО, более правильный - использовать while read

Код: Выделить всё

awk -F ":" {print $2} file.txt | sort -u | while read i; do mkdir "./$i"; done


(...где-то я уже об этом писал...)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

вот так вот. оказывается я не знаком даже с базовым инструментарием. стыдно, а что делать?

кстати, тогда уж
cut -d ":" -f 3 src | sort -u | while read i; do mkdir "./$i"; done
получается по символам короче, чем с awk.
а уже если mkdir -p, так и вовсе от sort -u можно избавиться...
cut -d":" -f3 src | while read i; do mkdir -p "./$i"; done
слава роботам!
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программированние в shell и проблемы

Сообщение Jan2ary »

(Strangerrr @ Понедельник, 27 Декабря 2004, 16:18) писал(а):Скажи честно, ты это пробовал, прежде чем посоветовать? Я это делал. Не катит.

Честно - нет. Нет возможности сейчас. Так что прошу прощения за. :new_unsure:
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

(elide @ Понедельник, 27 Декабря 2004, 19:15) писал(а):вот так вот. оказывается я не знаком даже с базовым инструментарием. стыдно, а что делать?

кстати, тогда уж
cut -d ":" -f 3 src | sort -u | while read i; do mkdir "./$i"; done
получается по символам короче, чем с awk.
а уже если mkdir -p, так и вовсе от sort -u можно избавиться...
cut -d":" -f3 src | while read i; do mkdir -p "./$i"; done


Не-а, с awk'ом короче

Код: Выделить всё

awk -F: '{print "mkdir -p \""$3"\""}' src|sh

:new_megalol:
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

вот черт.... :new_ohmy:
elide добавил в 27.12.2004 19:11
вот черт.... :new_ohmy:
почти sh golf (:
слава роботам!
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Программированние в shell и проблемы

Сообщение nercus »

навеяно madskull
sed 's!.*:!mkdir -p "!;s!$!"!' src|sh

:new_megalol:
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

Для nercus: так я и думал, s!.*: матчит последнюю колонку. если строка имеет вид f1:f2:dir1:dir_wrong, то создастся папка dir_wrong, а не dir1, как положено.
слава роботам!
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Программированние в shell и проблемы

Сообщение nercus »

(elide @ Понедельник, 27 Декабря 2004, 20:00) писал(а):Для nercus: так я и думал, s!.*: матчит последнюю колонку. если строка имеет вид f1:f2:dir1:dir_wrong, то создастся папка dir_wrong, а не dir1, как положено.


ммм... ну разумееться:) не заметил про третье поле (думал abc:def)... эх, моя невнимательность когда-нибудь меня доканает :new_megalol:

С другой стороны, если по последнему столбцу, то мона еще на 2 символа укоротить (вместо |sh - флаг e для sed)...:)
sed 's!.*:!mkdir -p "!;s!$!"!e' src

Мдя... ничего более путного, чем
sed 's![^:]*:[^:]*:!mkdir -p "!;s!:.*!"!e' src
с sed'ом у меня не вышло... awk рулит на 2 символа:(
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
Warderer
Модератор
Сообщения: 1055
Статус: киберпИнгвин на гусеничном ходу
ОС: Debian unstable

Re: Программированние в shell и проблемы

Сообщение Warderer »

Спа-си-бо!!!!
Может еще у кого схожие вопросы есть? Я смотрю тут настоящие Гуру собрались, по их решениям учиться можно!
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

Да чё там...

info sed и info gawk (а лучше, pinfo) -- оченно интересно и пользительно, особливо примеры
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

а я вот сегодня наткнулся на страничку http://misanthropia.net и решил утянуть оттуда все картинки размером 1280х1024. а огнелисного плагина для этого под рукой не оказалось. сохранил страничку как текст,
awk -F\" '/1280x1/ {print $2}' Misanthropia.htm|wget -i-
и оп. все картинки лежат (:

кстати, предлагаю следующее: очень часто нужное просто решение не приходит в голову, хотя все необходимые сведения для этого есть. (вот и я бы эту строчку никогда не придумал бы, если бы не вдохновивший меня madskull) так давайте переименуем эту тему во что-нить вроде "практика shell scripting'а" и будем постить сюда всевозможные success stories: ценные приемы, необычные решения, которые делают жизнь приятнее. потирая весь оффтопик. тогда эта тема превратится в ценный довесок к FAQ.
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

(elide @ Вторник, 28 Декабря 2004, 19:04) писал(а):кстати, предлагаю следующее: очень часто нужное просто решение не приходит в голову, хотя все необходимые сведения для этого есть. (вот и я бы эту строчку никогда не придумал бы, если бы не вдохновивший меня madskull) так давайте переименуем эту тему во что-нить вроде "практика shell scripting'а" и будем постить сюда всевозможные success stories: ценные приемы, необычные решения, которые делают жизнь приятнее. потирая весь оффтопик. тогда эта тема превратится в ценный довесок к FAQ.


Это то, конечно не жалко.
Вот только как отличить "ценное" от "рутинного", если я постоянно в своей работе и досуге леплю такие "однострочники"? (которые иногда на две-три-и-больше строк в терминале растягиваются)

Ну, вот, например, такая небольшая строчечка

Код: Выделить всё

 wget --save-cookies $cookies --post-data "login=USER&password=PASS" "http://login.allofmp3.com/login.shtml?logging=on" -O /dev/null &>/dev/null && wget --load-cookies $cookies "http://reg.allofmp3.com/mylinks.shtml?rnd=$RANDOM" -O - 2>/dev/null | sed 's/ /\n/g' | awk -F\" '/^href/{print$2}'
скачивает список заказанных песенок с allofmp3. Точнее, скачивал пару месяцев назад, ибо давно я там не был.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

как отличить "ценное" от "рутинного"
сложный вопрос... я тоже думал. мне кажется, что нужно скидывать имеено короткие однострочники, которые представляют собой своеобразные patterns и ломают определенные стереотипы. например большинство пользователей знает, что команды можно направлять на ввод sh. но очень не многие используют это. мне как раз этим и понравился, например, кусочек про "awk -F: '{print "mkdir -p \""$3"\""}' src|sh" - очень короткий, и все в нем понятно, но после него я переписал половину своих скриптов из ~/bin.
при том, что я всегда знал, что можно так сделать. но как-то всегда извращался по другому....
слава роботам!
Спасибо сказали:
Аватара пользователя
Lemurian
Сообщения: 87
ОС: Zenwalk Linux 2.6

Re: Программированние в shell и проблемы

Сообщение Lemurian »

2 All
Господа, а чего вы такого читали?
XFCE 4.3.90, KDE 3.5.1
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

(Lemurian @ Среда, 02 Февраля 2005, 12:34) писал(а):2 All
Господа, а чего вы такого читали?


Пушкина :)


/me откинулся в кресле и начал вещать:
Понимаешь ли, милый друг, чтобы достигнуть таких высот надо десять лет работать программером, потом пять лет сисадмином, сто железных сапог стереть и сто железных хлебов сгрызть, спасти восемь прекрасных принцесс и кучу данных, завалить десяток драконов, кащеев и сайтов, написать операционку и письмо султану, познакомиться лично с Торвальдсом и Путиным и тому подобное.

А если серьезно, то, как ни странно, man bash&sed&awk и правильные вопросы гуглю, да плюс к этому всегда рекомендую Advanced Bash Scripting Guide (даже название документа выучил :) )

Ну и, естесно, экспа, получаемая при решении своих задач и попыток решить их еще красивее и оптимальнее.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Программированние в shell и проблемы

Сообщение nercus »

А вот для любителей померяться... uptime'ом:

Код: Выделить всё

uptime | sed 's/.*up \([0-9]\+\) days.*/\1/;T;s/^/-/;T;
:0;h;s/[0-9]$//;T3;x;s/.*\([0-9]\)/\1/;T3;
:1;s/0//;t2;y/987654321/876543210/;x;s/-/-=/g;x;t1;
:2;x;s/-/----------/g;b0;:3;s/-//g;s/.*/8&D/'
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

(nercus @ Пятница, 11 Февраля 2005, 0:07) писал(а):А вот для любителей померяться... uptime'ом:

Код: Выделить всё

uptime | sed 's/.*up \([0-9]\+\) days.*/\1/;T;s/^/-/;T;
:0;h;s/[0-9]$//;T3;x;s/.*\([0-9]\)/\1/;T3;
:1;s/0//;t2;y/987654321/876543210/;x;s/-/-=/g;x;t1;
:2;x;s/-/----------/g;b0;:3;s/-//g;s/.*/8&D/'


И что должно получиться? У меня строка uptime осталась без изменений
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Программированние в shell и проблемы

Сообщение nercus »

2madskull:
Странно. У меня и дома и на работе работает. Полагаю, проблема в "s/.*up \([0-9]\+\) days.*/\1/".
uptime у меня выдает строчку вида:
22:11:16 up 7 days, 2:22, 7 users, load average: 1.54, 1.23, 0.97

Хотелось бы увидеть, что выводит uptime у вас (не обязательно в числах). Посмотрю, что не учел.
Refix #0: заменить days на day...
nercus добавил в 12.02.2005 22:41
А пока попробуйте echo 'up 15 days' вместо uptime. Хотя это и не так интересно.
nercus добавил в 12.02.2005 22:50
А пока попробуйте echo 'up 15 days' вместо uptime. Хотя это и не так интересно.
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

Для nercus:
если я правильно понял, что делает твой скрипт, то, имхо, так будет ладнее

Код: Выделить всё

w|awk '/,/{ORS="";print 8;while($3--)print"=";print"D\n"}'
или это не то?
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

А, понятно. Я то пробовал на только что включенной машинке! :)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Программированние в shell и проблемы

Сообщение nercus »

(elide @ Воскресенье, 13 Февраля 2005, 16:22) писал(а):Для nercus:
если я правильно понял, что делает твой скрипт, то, имхо, так будет ладнее

Код: Выделить всё

w|awk '/,/{ORS="";print 8;while($3--)print"=";print"D\n"}'
или это не то?

наш ответ чемберлену:)

Код: Выделить всё

w|perl -ane 'print "8"."="x@F[2]."D\n";exit 0'
w|perl -ane 'die "8"."="x@F[2]."D\n"'

первое - если важен код выхода
второе - если пофик

а вообще, я не про то, как это сделать короче. я про то, как это можно сделать на седе:)
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Программированние в shell и проблемы

Сообщение elide »

а я на краткость и не претендовал. просто я сначала вообще не понял, что седовый скрипт делает... вот и написал так, чтоб было понятно с первого взгляда.
слава роботам!
Спасибо сказали:
Аватара пользователя
Miko
Сообщения: 39

Re: Программированние в shell и проблемы

Сообщение Miko »

Здорово тут у вас.
У меня такой вопрос

Файл

username:password

В цикле читается с этим проблем нет,

Но как сделать пользователя ...???

Застрял вот тут

Код: Выделить всё

echo $PSWD | passwd miko


Там пароль надо подтверждать.

useradd с параметром -p не добавляет.

Допомажите ???
Умным хочет быть всякий, те же, кому это не удается, почти всегда хитрят. (Сэмюэл Джонсон)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Программированние в shell и проблемы

Сообщение madskull »

Кросспостинг - это не хорошо, а совсем даже плохо.
ArchLinux / IceWM
Спасибо сказали: