【问题标题】:How to make AWK use the variable created in Bash Script [duplicate]如何使 AWK 使用在 Bash 脚本中创建的变量 [重复]
【发布时间】:2011-03-07 03:17:24
【问题描述】:

我的脚本看起来像这样

#!/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

正确的做法是什么?

【问题讨论】:

  • @tripleee 这个帖子怎么可能是重复的?这是 7 年前发布的,而您建议的帖子是 4 年前发布的。
  • 您的常见问题解答。在对重复项进行排序时,问题年龄不是一个重要的考虑因素。另见例如meta.stackoverflow.com/questions/252929/…

标签: linux bash unix awk


【解决方案1】:

你可以这样使用它。

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

你应该使用

"'${i}'"

在AWK中使用

$i

在 Bash 脚本中创建。

【讨论】:

  • 使用 $() 而不是反引号。而findfor 这样的循环会破坏带有空格的文件。引用您的 $1 变量
【解决方案2】:

假设您将 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 中读取值:随便

注意出口的重要性。没有它,shell中的vars被认为是 本地并且不会传递给协同进程。

【讨论】:

    【解决方案3】:

    你可以在 awk 中做任何事情

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您需要将awkvar=$bashvar 放在双引号下,否则会出现带有空格的bash 变量问题:awk -v "awkvar=$bashvar" 'awkscript'
      【解决方案5】:

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

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

      【讨论】:

      • +1 这是注入变量的最佳方式,因为即使$basen 包含撇号、引号或空格等特殊字符,它也可以工作。
      【解决方案6】:

      原因是 bash 变量(环境变量)没有在单引号字符串中展开。换个试试

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

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

      【讨论】:

      • 那里有一颗宝石 :) 谢谢 DavidZ!
      猜你喜欢
      • 2016-09-24
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2021-08-13
      • 2020-12-13
      • 2019-01-17
      • 2020-04-03
      相关资源
      最近更新 更多