Jump to content

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


A_White
 Share

Recommended Posts

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

[prov_name]

dddwws

hfaser

jaker

[host]

127.1.1.1.0

[port]

5587

1112

8080

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

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

Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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

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

[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

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

Link to comment
Share on other sites

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      

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

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...