Перейти к содержанию

Передать массив из awk в shell


Рекомендуемые сообщения

Помогите пожалуйста новичку!!!

Необходимо с помощью awk прочитать значения из файла. В файле список: заголовок, обособленным квадратными кавычками [ ], список значений, каждое начинается с новой строки.

Так вот нужно распарсить этот файл: прочитать все значения после заголовка, и загнать в массив. Ну а после передать этот массив обратно в shell.

Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell?

Очень нужно, если кто откликнется - большое спасибо.

Ссылка на комментарий
Поделиться на другие сайты

A_White писал(а) Пнд, 12 Декабрь 2011 18:05

Очень нужно именно последнее, так как с остальным более-менее понятно - как передать массив обратно из awk в shell?

Очень нужно, если кто откликнется - большое спасибо.

Либо писать во временный файл и считывать, либо через конвеер - шелл читает со стандартного вывода авк.

awk -f ini.awk test.ini | while read var value; do...; done

Если не получится, подправим. Программа не сложная.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое за ответ!

Просто есть большой скрипт на баш, и в одном месте нужно прописать, чтобы он взял из файла значения (файл такого типа:

[prov_name]

dddwws

hfaser

jaker

[host]

127.1.1.1.0

[port]

5587

1112

8080

так вот, нужно присвоить 3 разным переменным список значений соответственно из этих групп (например 3-й переменной из 3-й группы: от 5587 до 8080), и потом передать этот массив обратно в тело скрипта, чтобы иметь доступ к i-тому значению.

Если не сильно напрягаю, помогите пожалуйста!

Ссылка на комментарий
Поделиться на другие сайты

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

В авк передаются две переменные: секция и номер позиции и через стандартный вывод возвращается нужная строка

В скрипт передается номер позиции.

Если логика задачи предполагает извлекать сразу из трех секций по позиции, то можно изменить скрипты и обойтись одним вызовом авк с возвратом трех строк.

Загрузить сразу все в массивы, как вы предполагаете, имеет смысл, если скрипт использует сразу все данные. Это хотя и повысит производительность, но усложнит логику шелл скрипта.

Ссылка на комментарий
Поделиться на другие сайты

Добрый день! Задача немного видоизменилась, и у меня опять не все получается прошу помощи.

Имеется файл:

[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

Если есть возможность помочь, буду очень признателен!

Ссылка на комментарий
Поделиться на другие сайты

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      

А можно и напрямую шеллом читать построчно.

Впрочем, если задача будет усложняться и структура входного файла обрастать новыми сущностями, не плохо сразу задуматься о использовании более мощного скриптового языка, типа Перла или Питона.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...