如何使AWK使用在Bash脚本中创build的variables

我有看起来像这样的脚本

#!/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中打印出之前创build的名为“basen”的variables。 但不知怎的,它做不到我所希望的。

所以例如myfile.txt包含这些行

 foo bar bax foo qux bar 

用上面的bash脚本我希望得到

 myfile bax myfile bar 

什么是正确的方法来做到这一点?

你可以像这样使用它。

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

你应该使用

“ '$ {I}'”

在AWK中使用

$ I

在Bash脚本中创建。

-v标志用于设置命令行中的变量。 尝试这样的事情:

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

你可以在awk中做所有的事情

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

假设你运行awk 作为shell的子进程,你声明了变量
在壳内

 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中读取值:无论如何

注意出口的重要性。 除此之外,来自外壳的变量被认为是本地的,不会被传递到协同处理。

原因是bash变量(环境变量)不在单引号字符串中扩展。 尝试更换

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

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

最简单的方法是做一个awk变量。 awk -v awkvar=$bashvar 'awkscript'