关于双美元符号($$)的含义及awk代码$$1~/^[^0-9]/ {print $$1;}的功能咨询
关于Awk中双美元符号($$)的含义与指定代码解析
咱们分两部分来拆解你的问题,先搞懂双美元符号的作用,再一步步分析那段Awk代码的逻辑~
一、双美元符号($$)在Awk中的含义
首先要区分场景:在普通Shell脚本里,$$代表当前Shell进程的ID,但在Awk脚本中,它是间接引用字段的特殊语法:
- 平时我们用
$n(比如$1、$2),是直接调用第n个字段的内容; - 而
$$var则是先获取变量var的值,把这个值当作字段编号,再取出对应编号的字段。举个例子:如果当前行的$1(第一个字段)的值是"3",那$$1就等价于$3,也就是第三个字段的内容;如果$1是字符串"foo",Awk会尝试把它转成数字,结果是0,此时$$1就等价于$0(整行内容)。
二、这段Awk代码的工作原理
先把代码明确出来:
$$1~/^[^0-9]/ {print $$1;}
我们拆成几个部分理解:
1. 核心条件:$$1~/^[^0-9]/
这部分是Awk的条件判断,拆解来看:
$$1:如前面所说,是间接引用字段——先取当前行第一个字段的值作为字段号,再获取对应字段的内容;~/^[^0-9]/:这是正则表达式匹配,意思是判断目标内容是否以非数字字符开头:^表示字符串的起始位置;[^0-9]表示任意非0-9的字符(比如字母、符号、空格等)。
2. 完整执行逻辑
对每一行输入内容,Awk会按以下步骤处理:
- 提取当前行的第一个字段
$1,用它的值作为字段编号,取出对应的字段内容(也就是$$1); - 检查
$$1的内容是否以非数字开头; - 如果满足条件(开头是非数字),就打印出
$$1的内容。
举个实际例子验证
假设我们有以下输入内容:
2 123 apple name alice bob 5 456 cherry
逐行执行的结果是:
- 第一行:
$1是"2",$$1是$2即"123",开头是数字,不满足条件,不打印; - 第二行:
$1是"name",转成数字0,$$1是整行内容name alice bob,开头是字母"n"(非数字),满足条件,打印整行; - 第三行:
$1是"5",但这一行只有3个字段,$5是空字符串,不满足“以非数字开头”的条件,不打印。
内容的提问来源于stack exchange,提问作者Kajquo
相关产品推荐
相关产品推荐

