2013-04-05 76 views
0

新手在這裏。我試圖用awk打印一些信息。所以我寫了一個shell腳本爲什麼在awk printf中使用變量不起作用?

#!/bin/bash 

turbVar="U" 
bcName="outlet" 
str="$turbVar $bcName b.c. = " 
# method-1 
awk -v RS='}' '/'$bcName'/ { printf "%20s = %s\n" $str $4; exit;}' BCFile | tr -d ";" 
# method-2 
awk -v RS='}' -v var1=$bcName '$0 ~ var1 { printf "%20s = %s\n" $str $4; exit;}' BCFile | tr -d ";" 

BCFile文件內容

boundary 
{ 
    inlet 
    { 
     type   fixedValue; 
     value   uniform (5 0 0); 
    } 

    outlet 
    { 
     type   inletOutlet; 
     inletValue  $internalField; 
     value   $internalField; 
    } 

    .... 
} 

我希望輸出像

U outlet b.c. = inletOutlet 

可悲的是,這是行不通的。它抱怨awk: (FILENAME=0/U FNR=4) fatal: not enough arguments to satisfy format string %20s = %s

爲什麼我不能在awk printf中使用$ str變量?

第二個問題,哪種方法更好?使用'/'$bcName'/或使用-v var1=$bcName '$0 ~ var1 ?,爲什麼我不能直接使用'/$bcName/'/"$bcName"/?強引號和弱引用在這裏有什麼區別?清理應該是

+0

'0/U'是什麼意思? – 2013-04-05 17:48:39

+0

這是一個文件。它的內容顯示在這篇文章中'http:// stackoverflow.com/questions/15825150 /如何找到多行模式匹配 - 他們必須首次匹配' – Daniel 2013-04-05 17:56:13

+0

文件' U'在一個名爲'0'的文件夾中。 :) – Daniel 2013-04-05 17:58:39

回答

2

您代碼:

awk -v RS="}" -v v1="$bcName" -v s="$str" '$0~v1{gsub(/;/,"");printf "%s%s\n",s,$4;exit}' 
U outlet b.c. = inletOutlet 

注:

  • 不要用shell擴展玩,引用它是一個真正的頭痛。與-v很好地傳遞任何shell變量。

  • 您需要用逗號分隔參數printf

  • 總是引用你的shell變量!

  • 你應該在做gsub(/;/,"")裏面的awk腳本而不是tr -d ";"

然而,它可能不是最好的方法,但我不能說沒有上下文被提供。

+0

我使用'exit'是因爲出現了很多'}' – Daniel 2013-04-05 18:00:22

+0

不,它不工作輸出很糟糕,因爲文件中有很多關鍵字'outlet' :( – Daniel 2013-04-05 18:06:20

+1

那是因爲你想要'$ str'將從shell中擴展 - sudo_O可能錯過了......但解決方案是在他的答案中:將值傳遞給'-v str =「$ str」' – 2013-04-05 18:11:36