awk 的 $ 与 shell 的 $ 有何不同?

awk 的 $ 与 shell 的 $ 有何不同?

在 awk 中,我们用来$提取由 分隔的匹配行的内容(基于模式)IFS

awk `/LIG/{print $1, $2}' topol.top

在 shell 中,我们用于$提取为变量存储的值。例如。for环形。

for i in *; do
    mv -- $i $i.pdb; done 

(根据答案更正)

这两种情况下的用法本质上是$相同还是不同?

如果不同,为什么会有差异?如何将awk和shell混合使用$

答案1

$在 shell 和$awk 中只是看起来相关,因为有时$在 shell 之后可能有一个数字,有时有一个变量,在 awk 中也是如此,但它们没有任何相关性,只是 2 使用相同的字符2 个完全不同的上下文中完全不同的工具,并且$<number>$<variable>在 shell 中的含义与它们在 awk 中的含义完全不同。

在 shell 中,您可以通过在变量前面添加来取消引用变量$,并且位置参数等在这方面被视为与变量相同,因此您可以:

$0 = the path to the current command
$1 = the first argument passed to the command
$2 = the second argument passed to the command
$# = the number of arguments passed to the command
$? = the exit status of the last command run
$var = the value of the shell variable var
etc.

在 awk 中$,是当前记录被分割成的字段数组(概念上)的名称,因此您可以仅有的$在这些表达式中使用:

$0 = the current record being processed
$1 = the first field of the current record
$2 = the second field of the current record

要取消引用 awk 变量var,只需使用它的名称var,就像在 C 中一样,事实上 awk 语法与 C 的相似度远高于与 shell 的相似度。

如果您在 awk 中看到过$var使用,那么它不是$解引用var,而是单独使用名称var来解引用,var并且 ifvar有一个数字值,例如,5, then的含义与当前记录的第 5 个字段$var相同,而 if确实没有数值则意味着与当前记录相同:$5var$var$0

var=0 => $var = $0 = the current record being processed
var=1 => $var = $1 = the first field of the current record
var=2 => $var = $2 = the second field of the current record
var="" => $var = $0 = the current record being processed
var="foo" => $var = $0 = the current record being processed

awk 和 shell 是两个完全不同的工具,它们有自己的语法、语义和变量范围等。因此,只需将它们视为这样,并且不要假设您在 awk 脚本中看到的任何内容与您在 awk 脚本中看到的任何内容有任何关系。 shell 脚本的语法、语义或范围,反之亦然。

答案2

$只是一个语法元素,在 shell 中awk和 shell 中使用类似(但不相同):

  • $0$1包含awk整行 ( $0) 或由 分隔的行的相应部分FS。中的所有其他变量名称awk均按原样采用,不需要,因此$这里实际上是变量名称 $0ETC
  • $anythingin bashetc 用于获取名为 的变量的值anything。然后是$(...)用于命令替换的,所以你可以说这$意味着贝壳中一般的“价值”。

相关内容