LINUX.ORG.RU

Как из awk вызвать функцию bash-скрипта?

 ,


0

1

Здравствуйте!
Необходимо из команды awk выполнить вложенную команду awk.
Чтобы не лепить трудно читаемую команду через system( «awk \047 ....... \047 filename» ) хочу вынести ее в отдельную функцию.
Возможно ли это? Пробую делать так:

function Test() {
  echo $1
return {}
}

awk '
    { if ($1!="#")
        {
          #....
          Test($2)
          #...
        }
    }' /etc/hosts.deny

получаю: awk: cmd. line:4: (FILENAME=/etc/hosts.deny FNR=9) fatal: function `Test' not defined

Как правильно написать команду вызова функции ?

Необходимо из команды awk выполнить вложенную команду awk.

Ты хочешь странного (и глупого).

sdio ★★★★★
()

В awk есть возможность делать свои функции:

man awk

function name(parameter list) { statements }

undertaker ★★
()

awk: cmd. line:4: (FILENAME=/etc/hosts.deny FNR=9) fatal: function `Test' not defined Как правильно написать команду вызова функции ?

так и написать. Только ВНУТРИ gawk. (ты в bash'е определил, а gawk это другой ЯП)

Ты хочешь странного (и глупого).

хм. Иногда sdio бывает прав.

emulek
()
Ответ на: комментарий от emulek

хм. Иногда sdio бывает прав.

Крайне редко.

anonymous
()
Ответ на: комментарий от emulek

Странно (и глупо) - это отвечать там, где тебе совсем нечего ответить по делу.

Каким образом вы предлагаете записать данную функцию в awk (Вы ведь внимательно прочитали мой вопрос и заметили, что требуется чтение данных из другого файла? ), не нарушая читаемость кода?

function isAllowed() {
    awk '(index("'$1'",$2)==1) && ($2 ~/[0-9]+\.$/) || ("'$1'" == $2) {printf "\tALLOWED"}' /etc/hosts.allow
return
}
Данной функции должен передаваться $10 из awk.

Пока что вижу только такой вариант (рабочий):

awk '{ if ($1=="#" && $2=="DenyHosts:" && NF=10)
         {
          # .....
          # ...
          system( "awk \047 (index(\""$10"\",$2)==1) && ($2 ~/[0-9]+\.$/) || (\""$1"\" == $2) { printf \"\tALLOWED\" } \047 /etc/hosts.allow " )
          # ...
         }
       else
          # ...
    }' /etc/hosts.deny #>hosts.deny.new

Но считаю это сложно читаемым извратом, который и хочу оптимизировать.

Man1980
() автор топика
Ответ на: комментарий от Man1980

Но считаю это сложно читаемым извратом, который и хочу оптимизировать.

Может тут надо взять вместо молотка отвертку?

Перламутровую или там пятанистую?

habamax ★★★
()
Ответ на: комментарий от Man1980

Странно (и глупо) - это отвечать там, где тебе совсем нечего ответить по делу.

ты читать что-ли не умеешь?

или просто тупой?

$ echo "test1 test2 test3" | awk 'function f() { print $1 }; { f() }'
test1

emulek
()

То что ты хочешь запускать во внешнем awk, просто запускай в виде

while (getline s0 < filename) {
   split(s0,s," ")

   ### здесь твои действия
   ### вместо $0 -- s0
   ### вместо $1,$2,... --- s[1], s[2], ...

}

sdio ★★★★★
()
Ответ на: комментарий от emulek

а теперь объясни для тупых, если конечно сам таковым не являешься, где в твоем примере чтение из второго файла?

Man1980
() автор топика
Ответ на: комментарий от Man1980

а теперь объясни для тупых, если конечно сам таковым не являешься, где в твоем примере чтение из второго файла?

а если я его введу, то ты скажешь, что «оно нарушает читаемость». Т.ч. сам вводи, awk внутри awk это говнокод по определению.

emulek
()
Ответ на: комментарий от Man1980

может уже пора читать «man awk» про чтение из второго/третьего/etc файла ?


       getline <file         Set $0 from next record of file; set NF, RT.

       getline var           Set var from next input record; set NR, FNR, RT.

       getline var <file     Set var from next record of file, RT.

       command | getline [var]
                             Run command piping the output either into $0 or var, as above, and RT.

       command |& getline [var]
                             Run  command  as a co-process piping the output either into $0 or var, as above, and RT.  Co-processes are a gawk extension.
                             (command can also be a socket.  See the subsection Special File Names, below.)

Ager
()
Ответ на: комментарий от Man1980

И вдогонку, тебе надо в секции BEGIN {} один раз прочитать и распарсить /etc/hosts.allow и в дальнейшем пользоваться результатами, а не дергать этот файл на каждый чих.

sdio ★★★★★
()
16 августа 2014 г.

понимаю, что время прошло, но это 2 разных интерпретатора, они физически не могут знать о каких-то структурах внутри друг-друга

IvanR ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.