Гость Опубликовано 23 февраля, 2003 Жалоба Опубликовано 23 февраля, 2003 Народ подскажите по шелу буду очень признателен. есть такой файл #!/bin/sh #d_b="228.2"; export d_b exec db $@ Чесно скажу долго искал по нэту кроме Соловьёва статей не нашёл скудновато... Хотелось используя цикл брать значение из file.lst (значения даны построчно) и запускать db в этом же цикле каждый раз при новом значении аргумента d_b и если возможно установить задержку И что вообще за команда выводит определённую строку и файла ? Цитата
Гость Опубликовано 23 февраля, 2003 Жалоба Опубликовано 23 февраля, 2003 Один из очень многих вариантов: awk ' { cmd=sprintf( "./db \"%s\"; sleep %d" , $0, 1 ) system( cmd ) }' file.lst Кстати мой совет использвать awk без system,тк это очень невыгодно с точки зрения ресурсов и времени исполнения. На каждую строчку мы стартуем новый процесс Гораздо выгоднее используя awk или sed трансформировать данные в нужный формат или сгенерировать сразу шелл скрипт на основе исходного файла и запустить его потом на выполнение Успехов --- sas Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 Спасибо за ответ но хотелось бы немного коментариев к блоку а именно %s , $0 и 1 Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 awk ' { cmd=sprintf( "./db \"%s\"; sleep %d" , $0, 1 ) system( cmd ) }' file.lst sprintf формирует команду ./db ваш шелл скрипт который и обрабатывает строчку \" двойные кавычки внутри строки ограниченной двойными кавычками %s сюда вставится содержимое $0, что означает вставить строку сюда %d сюда вставится единичка (для команды sleep) $0 когда awk читает файл (по умолчанию построчно) он кладет всю строку в переменную с зарезервированным именем $0 1 задержка в секундах --- sas Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 imho - изврат #! /bin/sh for i in `cat files.lst`; do db $i done Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 Предложенное решение не будет работать без IFS="" если каждая строка состоит больше чем из одного слова Сравните на любом файле IFS="";for l in `cat ttt.hh`; do echo "---> $l"; done Согласен это короче, но по гибкости awk лучше Успехов --- sas Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 Прошу прощение за опечатку: IFS=$'\n'; for l in `cat ttt.hh`; do echo "---> $l"; done Цитата
Гость Опубликовано 24 февраля, 2003 Жалоба Опубликовано 24 февраля, 2003 Кстати даже после этого прорамма пропустит све пустые строки А может быть это и нужно Вывод: awk незаменим для процессинга файлов ) Цитата
Гость Опубликовано 25 февраля, 2003 Жалоба Опубликовано 25 февраля, 2003 перечитайте условие внимательнее ) Цитата
Гость Опубликовано 25 февраля, 2003 Жалоба Опубликовано 25 февраля, 2003 А по поводу того какие значения и как они обрабатываются ничего не сказано за исключением что они хранятся построчно Строка таблицы например это тоже строка ;O))) Цитата
Гость Опубликовано 26 февраля, 2003 Жалоба Опубликовано 26 февраля, 2003 ясно прошу прощения за неточность или может я не врубаюсь но куда же девать : d_b="228.2"; export d_b exec db $@ именно значение d_b должно получать значения построчно из file.lst Цитата
Гость Опубликовано 26 февраля, 2003 Жалоба Опубликовано 26 февраля, 2003 а какого формата строчки в файле с данными? надо ли обрабатывать пустые строки если они есть? Дело в том, что решение Ananasa короче но менее универсально А на самом деле как я сказал в первом посте решенийй может быть куча --- sas Цитата
Гость Опубликовано 26 февраля, 2003 Жалоба Опубликовано 26 февраля, 2003 #! /bin/sh for i in `cat file.lst`; do export d_b="$i" exec db $@ done Цитата
Гость Опубликовано 26 февраля, 2003 Жалоба Опубликовано 26 февраля, 2003 странно , решение ананас работает правда выполнение запроса происходит лишь 1 раз. file.lst представляет собой значения записанные построчно пустых строк нет и их обработка не нужна а формат типа 123.123.123.123:8080 самое первое решение с использованием awk работает но получаеться куча pid-ов в системе , вероятно надо ждать окончание каждого запроса а их результат неважен Дело в том что значения из file.lst не должны быть аргументом %s export d_b=123.123.123.123 # exec db $@ Цитата
Гость Опубликовано 27 февраля, 2003 Жалоба Опубликовано 27 февраля, 2003 1. По поводу решения Ananasa. В ваших условиях оно лучше. Но оно содержит ошибку (ваш код) Надо убрать exec тк он замещает текущий скрипт те до первого выполнения exec мы в скрипте Ananasa а потом в скрипте db 2. по поводу решения c awk: должно создаваться максимум 3 процесса: 1 awk 2 sh -c "./bc ..." 3 sleep system() ждет пока 2 и 3 процессы закончатся Тк све приложение это цикл то пока есть строчки в file.lst 2 и 3 процессы будут заканчиваться и создаваться занова с новыми pid Успехов --- sas Цитата
Гость Опубликовано 27 февраля, 2003 Жалоба Опубликовано 27 февраля, 2003 прошу прощения за опечатки типа "занова" ( Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.