在 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确实没有数值则意味着与当前记录相同:$5
var
$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
均按原样采用,不需要,因此$
这里实际上是变量名称是$0
ETC$anything
inbash
etc 用于获取名为 的变量的值anything
。然后是$(...)
用于命令替换的,所以你可以说这$
意味着贝壳中一般的“价值”。