如何区分$ 1作为shell变量和$ 1作为awk变量?

时间:2017-11-22 19:25:07

标签: linux bash shell awk command-line

当我将命令行参数传递给我的脚本时,我们必须使用$ 1,$ 2等来访问该值。同样,当我们使用awk时,我们可以提到文件的列为$ 1,$ 2等。 ,

 #!/bin/bash
 cat $1 | awk '$1 > 20'
  • 我们假设我已经将文件名作为命令行参数传递,我们可以使用$ 1来引用该参数。
  • 我们假设文件内容如下。

     20 A         
     10 B   
     5  D  
     13 K
     50 C
    

如何在阅读此代码时告诉它是否会访问命令行$1 - 输入文件名 - 还是cat输出的第一列?

2 个答案:

答案 0 :(得分:1)

这里有一个简单的规则: shell不对单引号字符串执行任何扩展。

在其他情况下也是如此:echo '$1'打印完整的字符串$1

因此,在下面的代码中(为了正确性而编辑 - 在shell变量周围缺少双引号导致了一个错误,并且cat的使用产生了不必要的低效率):

awk '$1 > 20' <"$1"

...我们将$1 > 20视为shell的字面值,仅由awk"$1"解析为代码 - 用双引号解析,由shell扩展。 / p>

答案 1 :(得分:0)

  

使用awk时是否有任何其他方式来表示列   在shell脚本中?

您可以使用变量来表示它们例如

awk '{for(i=1;i<NF;i++){print $i}}' file

此处NF是字段总数(可以视为列。)当i在循环中获得不同的值时,$i会扩展为{{1 },$1等等。