Fat-Zer пишет:скажите как это в одном sed скрипте сделать, учитывая наличие N. простым способом у меня с ходу не получилось...
doc@dt:~/tmp$ grep 'processor\|core id\|physical id' ci | sed -re 'N;N;s/[^:]*: (.*)\n[^:]*: (.*)\n[^:]*: (.*)/\1 \2 \3/' -e 's/[^ ]* //'
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
doc@dt:~/tmp$ grep 'processor\|core id\|physical id' ci | sed -re 'N;N;s/[^:]*: (.*)\n[^:]*: (.*)\n[^:]*: (.*)/\1 \2 \3/;s/[^ ]* //'
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
doc@dt:~/tmp$ grep 'processor\|core id\|physical id' ci | sed -r 'N;N;s/[^:]*: (.*)\n[^:]*: (.*)\n[^:]*: (.*)/\1 \2 \3/;s/[^ ]* //'
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
0 0
0 1
0 9
0 10
1 0
1 1
1 9
1 10
м... чем вам N помешала-то? N прибавляет к внутреннему буферу sed следующую строку. Кстати, если команда не туда что-то добавляет (как =), то ваше -e всё равно не поможет, и необходимо ставить вторую sed. Насколько я помню, -e необходима только в ОДНОМ случае: когда вам внутри sed-скрипта потребуется использовать команду с параметром типа "строка", ну например
sed -e 'W имя_файла' -e 'ещё_команды'
тут точка с запятой будет считаться как часть "имя_файла" внутри скрипта, а если -e не написать, то вторая часть скрипта будет считаться за имя входного файла. Правда можно разделять команды переводом строки, а не только точкой с запятой, если ваша оболочка конечно на такое способна. Однако, команды с параметрами в одностроках - большая редкость. Следует подумать о sed-скрипте в виде файла.
Fat-Zer пишет:ну да.... ничего лучшего пока не придумал... доков по сабжу не видел, код ковырять - не хочется... к тому же, если --=XliN=-- не обманул всех со злым умыслом, то пример вполне достоверен.
у нас этот пример ЕДИНСТВЕННЫЙ. Найдите хотя-бы штук 10, а то у меня вот тоже нет под рукой многоядерных и многопроцессорных систем. Я доки видел, но таки не вдавался. Потому не помню.
чёрт его знает, что это за НЁХ.
Fat-Zer пишет:две логические части: первая - выстроить в одну строчку три числа, вторая - удалить одно из них.
эх... Ваще-то задача: выделить второе и третье число. Вы зачем-то выделяете ещё и первое. Если так рассуждать, то что вы [^:]* в начале не выделяете? Не число? Кстати вот ещё одна грубая ошибка: условие должно быть как можно более жёстким. Если в поле ТОЛЬКО ЦИФРЫ, то так и пишите: [0-9]+, скрипты и так опасные, потому всегда надо думать, и если условие не выполнилось, то либо выдавать ошибку и её проверять, либо эту ошибку обрабатывать как-то. Вот у вас только цифры, а вы пишите .* => злоумышленник сможет скормить вашему скрипту любую НЁХ. Да, это конечно в данном случае не важно, но... Зачем вам оставлять лишнюю дыру? Тут и не только в безопасности дело - если попадётся что-то не то, то поведение скрипта станет непредсказуемым. Оно может и не опасно, или безопасность вас не волнует, просто скрипт сработает хрен знает как, и выдаст хрен знает что. А дальше вы кормите конвейер хрен знает чем, и в итоге получаете не только хрен знает какую ошибку или хрен знает что, но ещё и хрен знает где. Естественно, исправлять тоже хрен знает как. Проще выкинуть скрипт в мусорку, как и всю вашу работу по созданию костылей и подпорочек. Уж поверьте мне, я такого быдлокода повыкидывал немало (ИЧСХ своего). Впрочем: наступать на грабли - ваше священное право. А если кто вам говорит "не ходи туда, грабли", то можете его и послать, а чё - вы свободны.
Fat-Zer пишет:ну не знаю я awk, и пока не испытываю потребности в его изучении... и что мне теперь? не предлагать альтернативные варианты? лизнуть розетку? повеситься?
нет. Продолжать забивать шурупы молотком, ибо - работает. Ненадёжно, криво, сложно и долго; ну и хрен с ним. Разве это повод учится пользоваться отвёрткой? :p
Fat-Zer пишет:для этого уже предполагается использовать bash...
дык bash во первых считает через хрен пойми как, так и со строками работает не лучше. Его только как связку, ну или там для _простых_ операций с числами и строками. Ещё он тормооооознооооой. Т.е. в теоретических примерчиках bash всё умеет, вплоть до встроенной СУБД, а на практике... Как морской бой на BrainFuck'е. Т.е. только простенькие задачи можно, вот например Патрег сделал БД в виде простого текствого файла, который потом грузится в bash-массив. Для сетевых интерфейсов, eth0, eth1, и т.д. Всё отлично работает. Вот как у меня. У меня этих eth ровно 3 штуки (на одном из компьютеров, на других вообще по одному).
Fat-Zer пишет:это всеобщий метод и он вполне имеет право на существование.
это с какого такого перепугу он стал "всеобщим"? Всеобщий метод - поделить программу на отдельные модули, и развивать их самостоятельно, до тех пор, пока разработчик сможет этот модуль целиком в голове держать. Как не сможет - делить модуль на отдельные части. Как же вы скрипт пишете, если даже один однострок в голове удержать не в состоянии?? IRL задачки куда как больше. У нас задачка вполне примитивная, и делить её имеет смысл только если у нас нет подходящего инструмента (т.е. в нашем случае нужно grep и sed записать одним скриптом, причём так, что-бы в этом скрипте было как можно меньше структурных единиц, например команд s, ну а потом нам придётся решить, как выделять повторяющиеся строчки, sed'ом делать sort -u довольно костыльно(хоть и можно), потому придётся применить другой инструмент, при этом ещё и придётся подумать, что произойдёт на стыке этих команд, если что-то пойдёт не так. IRL это очень непростая задача, в итоге получится sed через bash-связку sort -u)
Fat-Zer пишет:т.к. самое главное. чтобы что-то работало, работало без ошибок
по вашему, правильный ответ в ЕДИНСТВЕННОМ случае это значит "работает"? Не... "Работает", это когда строго доказано, что при ЛЮБЫХ входных данных программа выдаст верный ответ, или вменяемое сообщение об ошибке, если входные данные недопустимы. Это конечно идеал, но вашему скрипту до этого идеала как до самой дальней галактики.
Fat-Zer пишет:и имело очевидный интерфейс
в данном случае "интерфейса" в смысле человеко-машинного просто тупо нет. Есть интерфейс с ядром, потому тут проще. Это я про входной. Что касается выходного, то перед wc -l неплохо было-бы выдать удобочитаемый для человека листинг, в котором написано, на основании какой информации из ядра программа сделала такой вывод. Полезно хотя-бы в отладочных целях. Просто cat /proc/cpuinfo на такой листинг не катит, нужно где-то по середине оформить вывод в консоль нужных оформленных строчек. А то к ответу "17" веры у меня никакой нет. Т.ч. с интерфейсом у вас тоже никак.
Fat-Zer пишет:а уж красота - это второй план.
если честно, что такое "красота" по отношению к программе - я не знаю. Программа может быть "рабочей и удобной", и "нерабочей и неудобной". Это две крайние точки двухмерного пространства. Наша задача - достигнуть бесконечно удалённой точки, где абсцисса и ордината сходятся вместе, двигаясь из точки 0. Вот и всё.
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)