Итак, у меня есть такой код:
#!/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
.
Я только что протестировал в системе с 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
, вы можете упомянуть переменные в разделе BEGIN
awk
, и тогда он должен работать.
#!/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
@Ashutosh, я отредактировал его сейчас, здесь нужно обернуть ваш текст в "
и сохранить имена переменных как имена, только если вы упоминаете их в других переменных, таких как val = "test"
val1 = "my" val " value."
, чтобы val1
теперь стал как my test value.
.
Кроме того, у меня было еще одно сомнение, предположим, если я хочу сохранить значение переменной оболочки в переменной awk ip
и использовать ту же переменную awk внутри переменной awk line
. Это возможно. Кстати, ваш ответ работает как шарм.
@Ashutosh, здесь очень часто задают вопрос об использовании переменных оболочки в awk
, используйте его как variable = "value";awk -v val = "$variable" '{print val}'
, где variable
- это переменная BASH, а val
- переменная awk
.
Спасибо за помощь @ RavinderSingh13. Извини за сегодняшний день, если ты почувствовал, что я был груб, Ты отличный человек!
@Ashutosh, нп, продолжай учиться и делиться знаниями.
Если вы не используете переменные 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" ...
Второе решение дает синтаксическую ошибку:
awk: cmd. line:1: unterminated string
иawk: cmd. line:1: syntax error