2015-11-06 4 views
0

У меня есть код ниже (благодаря члену этого сообщества), который ведет себя странно. Когда я жестко кодирую динамическую часть, она работает ... Когда я использую параметры для запуска кода, он ничего не делает. Вот код (с и без переменных), а также выходы (скриншоты)AWK-скрипт перестает работать после добавления переменных оболочки

echo "Attempt A:" 
echo "--------------------" 
echo "awk -v n=4 '{a[p]=$0; p=(p+1)%n} 
       /(Something)/{for(i=p;i<p+n-1;i++) print a[i%n];f=1} 
       f{print} 
       /\/Interface/{f=0}' file.log | awk 'BEGIN{ORS=RS=\"</Interface>\n -------------------\"} 
     /name=\"Andy\"/' > AttemptA.txt" 

awk -v n=4 '{a[p]=$0; p=(p+1)%n} 
       /(Something)/{for(i=p;i<p+n-1;i++) print a[i%n];f=1} 
       f{print} 
       /\/Interface/{f=0}' file.log | awk 'BEGIN{ORS=RS="</Interface>\n -------------------"} 
     /Name="Andy"/' > AttemptA.txt 

aaid="Andy" 
aalog=file.log 

echo "-------------------------------------------------------------------------------------------------" 
echo "-------------------------------------------------------------------------------------------------" 
echo "" 
echo "" 
echo "Attempt B:" 
echo "awk -v n=4 '{a[p]=$0; p=(p+1)%n} 
       /(Something)/{for(i=p;i<p+n-1;i++) print a[i%n];f=1} 
       f{print} 
       /\/Interface/{f=0}' ${aalog} | awk 'BEGIN{ORS=RS=\"</Interface>\n -------------------\"} 
     /Name=\"${aaid}\"/' > AttemptB.txt" 

awk -v n=4 '{a[p]=$0; p=(p+1)%n} 
       /(Something)/{for(i=p;i<p+n-1;i++) print a[i%n];f=1} 
       f{print} 
       /\/Interface/{f=0}' ${aalog} | awk 'BEGIN{ORS=RS="</Interface>\n -------------------"} 
     /Name="${aaid}"/' > AttemptB.txt 

Вот результаты (скриншоты):

Идущие код: http://imgur.com/FEJW5uR

Файлы, созданные: http://imgur.com/NytUL02

Любая идея, почему она распознает все, печатая одни и те же команды, но на самом деле работает, а другая нет?

+1

W.r.t. используя '' $ {aaid} "' вместо '" Andy "' --- похоже, что вы пытаетесь обратиться к переменной оболочки из скрипта awk. У Awk нет доступа к этому. – jas

+1

вы можете вставлять переменную оболочки в awk-скрипт, переключаясь между одиночными кавычками и dbl-кавычками внутри скрипта awk, чтобы «выставить» значение оболочки var внутри скрипта awk, то есть 'awk '/ Name ='" $ {aaid } "'/ ......'' Я добавил пробел между одинарной кавычкой и dbl-цитатой, чтобы выделить эти символы отдельно. Удачи. – shellter

+0

Может ли кто-нибудь из вас ответить как ответ, чтобы я мог отметить его как правильно? Спасибо вам обоим! –

ответ

3
awk -v aaid="$aaid" 'BEGIN{ORS=RS="</Interface>\n -------------------"} 
    $0 ~ "Name=\""aaid"\""' > AttemptB.txt 
+0

Итак, вы говорите в -v, я могу создать мост между awk и shell? сколько переменных можно определить таким образом? как определить несколько варов? –

+2

Точно. '-v' - способ передать значения из оболочки в awk. Подобно тому, что у вас уже было с '-v n = 4', вместо жестко закодированного' 4' вы можете так же легко использовать переменную оболочки. Вы можете включить эту опцию несколько раз, например. '-v color = red -v size = XL -v quantity = 7'. – jas

+1

Gotcha. Спасибо, сэр. –

Смежные вопросы