2010-06-23 127 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:无论

通知出口的重要性。除此之外,来自外壳的变量被认为是本地的 ,并且不会被传递给协处理。