A_White Posted December 12, 2011 Report Posted December 12, 2011 Помогите пожалуйста новичку!!! Необходимо с помощью awk прочитать значения из файла. В файле список: заголовок, обособленным квадратными кавычками [ ], список значений, каждое начинается с новой строки. Так вот нужно распарсить этот файл: прочитать все значения после заголовка, и загнать в массив. Ну а после передать этот массив обратно в shell. Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell? Очень нужно, если кто откликнется - большое спасибо. Quote
gogi Posted December 12, 2011 Report Posted December 12, 2011 A_White писал(а) Пнд, 12 Декабрь 2011 18:05 Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell? Очень нужно, если кто откликнется - большое спасибо. Либо писать во временный файл и считывать, либо через конвеер - шелл читает со стандартного вывода авк. awk -f ini.awk test.ini | while read var value; do...; done Если не получится, подправим. Программа не сложная. Quote
A_White Posted December 13, 2011 Author Report Posted December 13, 2011 Спасибо большое за ответ! Просто есть большой скрипт на баш, и в одном месте нужно прописать, чтобы он взял из файла значения (файл такого типа: [prov_name] dddwws hfaser jaker [host] 127.1.1.1.0 [port] 5587 1112 8080 так вот, нужно присвоить 3 разным переменным список значений соответственно из этих групп (например 3-й переменной из 3-й группы: от 5587 до 8080), и потом передать этот массив обратно в тело скрипта, чтобы иметь доступ к i-тому значению. Если не сильно напрягаю, помогите пожалуйста! Quote
gogi Posted December 13, 2011 Report Posted December 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 В авк передаются две переменные: секция и номер позиции и через стандартный вывод возвращается нужная строка В скрипт передается номер позиции. Если логика задачи предполагает извлекать сразу из трех секций по позиции, то можно изменить скрипты и обойтись одним вызовом авк с возвратом трех строк. Загрузить сразу все в массивы, как вы предполагаете, имеет смысл, если скрипт использует сразу все данные. Это хотя и повысит производительность, но усложнит логику шелл скрипта. Quote
A_White Posted December 14, 2011 Author Report Posted December 14, 2011 Спасибо Вам огромное за ответ! Quote
A_White Posted December 21, 2011 Author Report Posted December 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 Если есть возможность помочь, буду очень признателен! Quote
gogi Posted December 21, 2011 Report Posted December 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 А можно и напрямую шеллом читать построчно. Впрочем, если задача будет усложняться и структура входного файла обрастать новыми сущностями, не плохо сразу задуматься о использовании более мощного скриптового языка, типа Перла или Питона. Quote
A_White Posted December 22, 2011 Author Report Posted December 22, 2011 В очередной раз ОГРОМНОЕ СПАСИБО за Вашу помощь! Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.