2010-06-23 88 views
14

創建的變量我有腳本,看起來像這樣如何使AWK使用bash腳本

#!/bin/bash 
#exampel inputfile is "myfile.txt" 
inputfile=$1 
basen=`basename $inputfile .txt` # create basename 

cat $inputfile | 
awk '{print $basen "\t" $3} # this doesn't print "myfile" but the whole content of it. 

我想上面做的是打印出AWK調用之前創建的「倍欣」的變量。但不知怎的,它沒有做到我希望的那樣。

因此,例如myfile.txt包含這些線路

foo bar bax 
foo qux bar 

通過上述bash腳本我希望得到

myfile bax 
myfile bar 

怎樣做正確的方式?

回答

12

你可以像這樣使用它。

for i in `find $1 -name \*.jar` 
do 
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile 
done 

您應該使用

「 '$ {I}'」

在AWK

使用

$ I

創建在Bash Scr IPT。

+2

使用'$()'而不是反引號。用'for for'循環''find'就會發現它會打破空間文件。引用你的'$ 1'變量 – ghostdog74 2010-06-23 05:44:16

2

原因是bash變量(環境變量)沒有在單引號字符串中擴展。嘗試用

"{print \"$basen\" \"\t\" \$3}" 
+0

那邊有一顆寶石:)謝謝DavidZ! – Deian 2016-06-30 18:58:11

29

-v標誌是用於在命令行設置變量替換

'{print $basen "\t" $3}' 

。試試這樣:

awk -v "BASEN=$basen" '{print BASEN "\t" $3}' 
+2

+1這是注入變量的最好方法,因爲即使'$ basen'包含特殊字符(如撇號,引號或空格),它也可以工作。 – 2010-06-23 03:47:24

1

最簡單的方法是創建一個awk變量。 awk -v awkvar=$bashvar 'awkscript'

+0

你需要在'doublequotes下放置'awkvar = $ bashvar',否則它會帶有空格的bashvariables問題:'awk -v「awkvar = $ bashvar」'awkscript'' – syss 2017-06-28 11:52:58

4

你可以做AWK

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt 
3

一切假設你AWK 運行作爲外殼的子過程中,你聲明的瓦爾
內殼

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access. 
echo ""| awk '{ 
    print "Reading values from within awk : "ENVIRON["MY_VARS"]; 
}' 

結果:

讀值從內部awk:無論

通知出口的重要性。除此之外,來自外殼的變量被認爲是本地的 ,並且不會被傳遞給協處理。