Программированние в shell и проблемы (Давайте делиться траблами здесь)
Модераторы: /dev/random, Модераторы разделов
Программированние в shell и проблемы
Понадобилось создать по данным из текстового файла каталоги:
Исходные данные: текстовый файл представляющий собой таблицу, разделенную символами ":"
Требуется: Создать в текущем каталоге папки по третьему полю в этом файле.
Рассуждения: Нужно обеспечить вытаскивание текстового поля - соответственно 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, но как, пока не представлю....
Исходные данные: текстовый файл представляющий собой таблицу, разделенную символами ":"
Требуется: Создать в текущем каталоге папки по третьему полю в этом файле.
Рассуждения: Нужно обеспечить вытаскивание текстового поля - соответственно 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/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
И восемь строк матом...(бесплатно)
Re: Программированние в shell и проблемы
Первое что в голову приходит
for i in `awk -F ":" {print $2} | unique | sed {s/ /\ /}` ; do mkdir ./$i ; done
т.е. ставить перед пробелом слеш...
for i in `awk -F ":" {print $2} | unique | sed {s/ /\ /}` ; do mkdir ./$i ; done
т.е. ставить перед пробелом слеш...
Не шалю, никого не трогаю, починяю примус...
Re: Программированние в shell и проблемы
Скажи честно, ты это пробовал, прежде чем посоветовать? Я это делал. Не катит.
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
И восемь строк матом...(бесплатно)
Re: Программированние в shell и проблемы
cat src.file | sed -e 's/\([^:]\+:\)\{2,2\}\([^:]\+\)\(.\+\)/\2/;s/\ /\\ /g' | sort | uniq | xargs mkdir -p
проверил. работает. :new_megalol:
ну или просто замени в примере Jan2ary: sed {s/ /\ /} на sed {s/\ /\\ /g}
проверил. работает. :new_megalol:
ну или просто замени в примере Jan2ary: sed {s/ /\ /} на sed {s/\ /\\ /g}
слава роботам!
Re: Программированние в shell и проблемы
Странно... sed, awk... Ведь куда проще заюзать cut в данном случае:
ЗЫ: ключик -p более для того, чтобы mkdir не матюгался на уже имеющиеся каталоги, но и создание вложенных не помешает, наверное.
Код: Выделить всё
cat file.txt | cut -d ':' -f 3 | xargs mkdir -p
ЗЫ: ключик -p более для того, чтобы mkdir не матюгался на уже имеющиеся каталоги, но и создание вложенных не помешает, наверное.
Re: Программированние в shell и проблемы
Для JaGoTerr: респект - правильно, но нет uniq
А я добавлю, что если надо в цикле обрабатывать фразы с пробелами, то можно идти двумя путями:
1. Перед циклом изменить переменную IFS (убрать оттуда пробел)
2. ИМХО, более правильный - использовать while read
(...где-то я уже об этом писал...)
А я добавлю, что если надо в цикле обрабатывать фразы с пробелами, то можно идти двумя путями:
1. Перед циклом изменить переменную IFS (убрать оттуда пробел)
2. ИМХО, более правильный - использовать while read
Код: Выделить всё
awk -F ":" {print $2} file.txt | sort -u | while read i; do mkdir "./$i"; done
(...где-то я уже об этом писал...)
ArchLinux / IceWM
Re: Программированние в shell и проблемы
вот так вот. оказывается я не знаком даже с базовым инструментарием. стыдно, а что делать?
кстати, тогда уж
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
кстати, тогда уж
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
слава роботам!
Re: Программированние в shell и проблемы
(Strangerrr @ Понедельник, 27 Декабря 2004, 16:18) писал(а):Скажи честно, ты это пробовал, прежде чем посоветовать? Я это делал. Не катит.
Честно - нет. Нет возможности сейчас. Так что прошу прощения за. :new_unsure:
Не шалю, никого не трогаю, починяю примус...
Re: Программированние в shell и проблемы
(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
Re: Программированние в shell и проблемы
вот черт.... :new_ohmy:
elide добавил в 27.12.2004 19:11
вот черт.... :new_ohmy:
почти sh golf (:
elide добавил в 27.12.2004 19:11
вот черт.... :new_ohmy:
почти sh golf (:
слава роботам!
Re: Программированние в shell и проблемы
навеяно madskull
sed 's!.*:!mkdir -p "!;s!$!"!' src|sh
:new_megalol:
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 | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Re: Программированние в shell и проблемы
Для nercus: так я и думал, s!.*: матчит последнюю колонку. если строка имеет вид f1:f2:dir1:dir_wrong, то создастся папка dir_wrong, а не dir1, как положено.
слава роботам!
Re: Программированние в shell и проблемы
(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 | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Re: Программированние в shell и проблемы
Спа-си-бо!!!!
Может еще у кого схожие вопросы есть? Я смотрю тут настоящие Гуру собрались, по их решениям учиться можно!
Может еще у кого схожие вопросы есть? Я смотрю тут настоящие Гуру собрались, по их решениям учиться можно!
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
И восемь строк матом...(бесплатно)
Re: Программированние в shell и проблемы
Да чё там...
info sed и info gawk (а лучше, pinfo) -- оченно интересно и пользительно, особливо примеры
info sed и info gawk (а лучше, pinfo) -- оченно интересно и пользительно, особливо примеры
ArchLinux / IceWM
Re: Программированние в shell и проблемы
а я вот сегодня наткнулся на страничку http://misanthropia.net и решил утянуть оттуда все картинки размером 1280х1024. а огнелисного плагина для этого под рукой не оказалось. сохранил страничку как текст,
awk -F\" '/1280x1/ {print $2}' Misanthropia.htm|wget -i-
и оп. все картинки лежат (:
кстати, предлагаю следующее: очень часто нужное просто решение не приходит в голову, хотя все необходимые сведения для этого есть. (вот и я бы эту строчку никогда не придумал бы, если бы не вдохновивший меня madskull) так давайте переименуем эту тему во что-нить вроде "практика shell scripting'а" и будем постить сюда всевозможные success stories: ценные приемы, необычные решения, которые делают жизнь приятнее. потирая весь оффтопик. тогда эта тема превратится в ценный довесок к FAQ.
awk -F\" '/1280x1/ {print $2}' Misanthropia.htm|wget -i-
и оп. все картинки лежат (:
кстати, предлагаю следующее: очень часто нужное просто решение не приходит в голову, хотя все необходимые сведения для этого есть. (вот и я бы эту строчку никогда не придумал бы, если бы не вдохновивший меня madskull) так давайте переименуем эту тему во что-нить вроде "практика shell scripting'а" и будем постить сюда всевозможные success stories: ценные приемы, необычные решения, которые делают жизнь приятнее. потирая весь оффтопик. тогда эта тема превратится в ценный довесок к FAQ.
слава роботам!
Re: Программированние в shell и проблемы
(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}'
ArchLinux / IceWM
Re: Программированние в shell и проблемы
сложный вопрос... я тоже думал. мне кажется, что нужно скидывать имеено короткие однострочники, которые представляют собой своеобразные patterns и ломают определенные стереотипы. например большинство пользователей знает, что команды можно направлять на ввод sh. но очень не многие используют это. мне как раз этим и понравился, например, кусочек про "awk -F: '{print "mkdir -p \""$3"\""}' src|sh" - очень короткий, и все в нем понятно, но после него я переписал половину своих скриптов из ~/bin.как отличить "ценное" от "рутинного"
при том, что я всегда знал, что можно так сделать. но как-то всегда извращался по другому....
слава роботам!
Re: Программированние в shell и проблемы
2 All
Господа, а чего вы такого читали?
Господа, а чего вы такого читали?
XFCE 4.3.90, KDE 3.5.1
Re: Программированние в shell и проблемы
Пушкина
/me откинулся в кресле и начал вещать:
Понимаешь ли, милый друг, чтобы достигнуть таких высот надо десять лет работать программером, потом пять лет сисадмином, сто железных сапог стереть и сто железных хлебов сгрызть, спасти восемь прекрасных принцесс и кучу данных, завалить десяток драконов, кащеев и сайтов, написать операционку и письмо султану, познакомиться лично с Торвальдсом и Путиным и тому подобное.
А если серьезно, то, как ни странно, man bash&sed&awk и правильные вопросы гуглю, да плюс к этому всегда рекомендую Advanced Bash Scripting Guide (даже название документа выучил )
Ну и, естесно, экспа, получаемая при решении своих задач и попыток решить их еще красивее и оптимальнее.
ArchLinux / IceWM
Re: Программированние в shell и проблемы
А вот для любителей померяться... 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 | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Re: Программированние в shell и проблемы
(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
Re: Программированние в shell и проблемы
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. Хотя это и не так интересно.
Странно. У меня и дома и на работе работает. Полагаю, проблема в "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 | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Re: Программированние в shell и проблемы
Для nercus:
если я правильно понял, что делает твой скрипт, то, имхо, так будет ладнееили это не то?
если я правильно понял, что делает твой скрипт, то, имхо, так будет ладнее
Код: Выделить всё
w|awk '/,/{ORS="";print 8;while($3--)print"=";print"D\n"}'
слава роботам!
Re: Программированние в shell и проблемы
А, понятно. Я то пробовал на только что включенной машинке!
ArchLinux / IceWM
Re: Программированние в shell и проблемы
(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 | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Re: Программированние в shell и проблемы
а я на краткость и не претендовал. просто я сначала вообще не понял, что седовый скрипт делает... вот и написал так, чтоб было понятно с первого взгляда.
слава роботам!
Re: Программированние в shell и проблемы
Здорово тут у вас.
У меня такой вопрос
Файл
username:password
В цикле читается с этим проблем нет,
Но как сделать пользователя ...???
Застрял вот тут
Там пароль надо подтверждать.
useradd с параметром -p не добавляет.
Допомажите ???
У меня такой вопрос
Файл
username:password
В цикле читается с этим проблем нет,
Но как сделать пользователя ...???
Застрял вот тут
Код: Выделить всё
echo $PSWD | passwd miko
Там пароль надо подтверждать.
useradd с параметром -p не добавляет.
Допомажите ???
Умным хочет быть всякий, те же, кому это не удается, почти всегда хитрят. (Сэмюэл Джонсон)
Re: Программированние в shell и проблемы
Кросспостинг - это не хорошо, а совсем даже плохо.
ArchLinux / IceWM