Как использовать переменную awk внутри переменной awk?

Итак, у меня есть такой код:

#!/bin/bash
awk -v ip = "10.0.7.1" -v no = "8" -v line='#BalancerMember "ajp://" ip ":8009" route=node" no " loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60' '
/ProxySet lbmethod=byrequests/{
print "             " line ORS $0
next
}
1' /tmp/000-site.conf > /tmp/000-site.conf.tmp && mv /tmp/000-site.conf.tmp /tmp/000-site.conf

Итак, я не могу использовать awk-переменную ip и no внутри awk-переменной line.

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
0
98
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я только что протестировал в системе с GNU awk следующее:

awk -v val1 = "test" -v val2=val1 'BEGIN{print val1, val2}'

Что НЕ работает и дает результат как:

test val1

Итак, если вы хотите использовать несколько переменных, почему бы не использовать их в самой основной программе awk, как показано ниже (просто пример, вы также можете применить его к своему коду)

awk -v val1 = "test" -v val2 = "test2" 'BEGIN{print val1, val2,val1}'

Просто вы можете попытаться сломать свои переменные, и если чьи-то значения являются общими для других, несмотря на упоминание внутри -v, используйте их в print из awk.



Решение 2-е: Или, несмотря на использование -v, вы можете упомянуть переменные в разделе BEGINawk, и тогда он должен работать.

#!/bin/bash
awk 'BEGIN{ip = "your_ip";no = "8";line = "#BalancerMember "ajp"://" ip ":8009 route=node " no " loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60"}
/ProxySet lbmethod=byrequests/{
print "             " line ORS $0
next
}
1' /tmp/000-site.conf > /tmp/000-site.conf.tmp && mv /tmp/000-site.conf.tmp /tmp/000-site.conf

Второе решение дает синтаксическую ошибку: awk: cmd. line:1: unterminated string и awk: cmd. line:1: syntax error

Ashutosh 10.08.2018 08:33

@Ashutosh, я отредактировал его сейчас, здесь нужно обернуть ваш текст в " и сохранить имена переменных как имена, только если вы упоминаете их в других переменных, таких как val = "test"val1 = "my" val " value.", чтобы val1 теперь стал как my test value..

RavinderSingh13 10.08.2018 08:37

Кроме того, у меня было еще одно сомнение, предположим, если я хочу сохранить значение переменной оболочки в переменной awk ip и использовать ту же переменную awk внутри переменной awk line. Это возможно. Кстати, ваш ответ работает как шарм.

Ashutosh 10.08.2018 08:50

@Ashutosh, здесь очень часто задают вопрос об использовании переменных оболочки в awk, используйте его как variable = "value";awk -v val = "$variable" '{print val}', где variable - это переменная BASH, а val - переменная awk.

RavinderSingh13 10.08.2018 08:53

Спасибо за помощь @ RavinderSingh13. Извини за сегодняшний день, если ты почувствовал, что я был груб, Ты отличный человек!

Ashutosh 10.08.2018 08:56

@Ashutosh, нп, продолжай учиться и делиться знаниями.

RavinderSingh13 10.08.2018 08:56
Ответ принят как подходящий

Если вы не используете переменные no и ip в сценарии awk, проще всего использовать эти переменные в качестве переменных bash:

ip = "10.0.7.1";no = "8"; awk -v line = "#BalancerMember \"ajp://${ip}:8009\" route=node${no} loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60" ...

Другие вопросы по теме