A_White Опубликовано 12 декабря, 2011 Жалоба Поделиться Опубликовано 12 декабря, 2011 Помогите пожалуйста новичку!!! Необходимо с помощью awk прочитать значения из файла. В файле список: заголовок, обособленным квадратными кавычками [ ], список значений, каждое начинается с новой строки. Так вот нужно распарсить этот файл: прочитать все значения после заголовка, и загнать в массив. Ну а после передать этот массив обратно в shell. Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell? Очень нужно, если кто откликнется - большое спасибо. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 12 декабря, 2011 Жалоба Поделиться Опубликовано 12 декабря, 2011 A_White писал(а) Пнд, 12 Декабрь 2011 18:05 Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell? Очень нужно, если кто откликнется - большое спасибо. Либо писать во временный файл и считывать, либо через конвеер - шелл читает со стандартного вывода авк. awk -f ini.awk test.ini | while read var value; do...; done Если не получится, подправим. Программа не сложная. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
A_White Опубликовано 13 декабря, 2011 Автор Жалоба Поделиться Опубликовано 13 декабря, 2011 Спасибо большое за ответ! Просто есть большой скрипт на баш, и в одном месте нужно прописать, чтобы он взял из файла значения (файл такого типа: [prov_name] dddwws hfaser jaker [host] 127.1.1.1.0 [port] 5587 1112 8080 так вот, нужно присвоить 3 разным переменным список значений соответственно из этих групп (например 3-й переменной из 3-й группы: от 5587 до 8080), и потом передать этот массив обратно в тело скрипта, чтобы иметь доступ к i-тому значению. Если не сильно напрягаю, помогите пожалуйста! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 13 декабря, 2011 Жалоба Поделиться Опубликовано 13 декабря, 2011 A_White писал(а) Втр, 13 Декабрь 2011 09:21 файл такого типа: [prov_name] dddwws hfaser jaker [host] 127.1.1.1.0 [port] 5587 1112 8080 так вот, нужно присвоить 3 разным переменным список значений соответственно из этих групп (например 3-й переменной из 3-й группы: от 5587 до 8080), и потом передать этот массив обратно в тело скрипта, чтобы иметь доступ к i-тому значению. Если не сильно напрягаю, помогите пожалуйста! Способы передачи данных я вам перечислил в прошлом ответе. В любом случае передается не массив в смысле, к которому вы привыкли в процедурных языках, а текстовый поток. Нужно понимать, что каждая задача запущена в отдельном процессе (своей отдельной копией шелла). Если файл именно такой, как вы написали то можно попробовать что-то такое gg@/home/gg/bin: cat prov.awkBEGIN { flag= 0 }/^\[.*\].*/ { c= 0 if (match ($0, sect) > 0) flag= 1 else flag= 0 next} { if (flag == 0) next c++ if (c == n) print $0} А в скрипте, например, #!/bin/shprov=$(awk -f ./prov.awk -v n=$1 -v sect=prov_name ./prov.ini)host=$(awk -f ./prov.awk -v n=$1 -v sect=host ./prov.ini)port=$(awk -f ./prov.awk -v n=$1 -v sect=port ./prov.ini)echo $prov $host $port Вызов gg@/home/gg/bin: ./prov.sh 3jaker 127.1.1.1.0 8080 В авк передаются две переменные: секция и номер позиции и через стандартный вывод возвращается нужная строка В скрипт передается номер позиции. Если логика задачи предполагает извлекать сразу из трех секций по позиции, то можно изменить скрипты и обойтись одним вызовом авк с возвратом трех строк. Загрузить сразу все в массивы, как вы предполагаете, имеет смысл, если скрипт использует сразу все данные. Это хотя и повысит производительность, но усложнит логику шелл скрипта. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
A_White Опубликовано 14 декабря, 2011 Автор Жалоба Поделиться Опубликовано 14 декабря, 2011 Спасибо Вам огромное за ответ! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
A_White Опубликовано 21 декабря, 2011 Автор Жалоба Поделиться Опубликовано 21 декабря, 2011 Добрый день! Задача немного видоизменилась, и у меня опять не все получается прошу помощи. Имеется файл: [serv] dddwws 0 5587 #не нужная для считывания строка hfaser 0 1112 jaker 127.1.1.1.0 [rserv] fffdfd 0 3335 derdd 0 1122 [term] reffd 0 8881 derrs 0 2554 asaaa 0 2223 Как можно присвоить переменным значения, например, переменной: Prov_serv = dddwws hfaser jaker Prov_host = 0 0 127.1.1.1.0 И, например: Prov_term = reffd derrs asaaa Если есть возможность помочь, буду очень признателен! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 21 декабря, 2011 Жалоба Поделиться Опубликовано 21 декабря, 2011 A_White писал(а) Срд, 21 Декабрь 2011 09:32 Добрый день! Задача немного видоизменилась, и у меня опять не все получается прошу помощи. Имеется файл: [serv] dddwws 0 5587 #не нужная для считывания строка hfaser 0 1112 jaker 127.1.1.1.0 [rserv] fffdfd 0 3335 derdd 0 1122 [term] reffd 0 8881 derrs 0 2554 asaaa 0 2223 Как можно присвоить переменным значения, например, переменной: Prov_serv = dddwws hfaser jaker Prov_host = 0 0 127.1.1.1.0 И, например: Prov_term = reffd derrs asaaa Если есть возможность помочь, буду очень признателен! Можно немного авк файл подправить. Получится что-то типа gg@c-1:~/bin$ cat prov2.awk BEGIN { flag= 0 }/^#.*/ { next }/^\[.*\].*/ { if (substr ($0, 2, length (sect)) ~ sect ) flag= 1 else flag= 0 next} { if (flag == 0) next split ($0, s) prov = prov s[1] " "; host= host s[2] " "; port= port s[3] " "}END { print prov; print host; print port }gg@c-1:~/bin$ awk -f prov2.awk -v sect=serv ./prov2.inidddwws hfaser jaker 0 0 127.1.1.1.0 5587 1112gg@c-1:~/bin$ awk -f prov2.awk -v sect=term ./prov2.inireffd derrs asaaa 0 0 0 8881 2554 2223 А можно и напрямую шеллом читать построчно. Впрочем, если задача будет усложняться и структура входного файла обрастать новыми сущностями, не плохо сразу задуматься о использовании более мощного скриптового языка, типа Перла или Питона. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
A_White Опубликовано 22 декабря, 2011 Автор Жалоба Поделиться Опубликовано 22 декабря, 2011 В очередной раз ОГРОМНОЕ СПАСИБО за Вашу помощь! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.