如何让AWK使用在Bash Script中创建的变量

时间:2010-06-23 03:17:08

标签: linux bash unix awk

我的脚本看起来像这样

#!/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中打印之前创建的名为“basen”的变量。 但不知怎的,它没能按照我希望的那样做。

因此,例如myfile.txt包含这些行

foo bar bax
foo qux bar

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

myfile bax
myfile bar

这样做的正确方法是什么?

6 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:12)

你可以这样使用它。

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

你应该使用

  

“ '$ {I}'”

在AWK中

使用

  

$ I

在Bash Script中创建。

答案 2 :(得分:4)

你可以在awk中做所有事情

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

答案 3 :(得分:4)

假设你运行awk 作为shell的子进程,你声明了vars
在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中读取值:无论

注意导出的重要性。在它外面,考虑来自shell的变量 本地的,并没有传递给协同进程。

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

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