给定以下命令:
为什么AWK会输出:
echo "1: " | awk '/1/ -F ":" {print $1}'
为什么AWK会输出:
1:
?
-F
是命令行参数,而不是AWK语法。尝试使用:
echo '1: ' | awk -F ':' '/1/ {print $1}'
(模式){动作}
。如果模式
(通常是一个条件语句)为_true_,则执行动作
。如果模式
不可用,则默认为_true_。在这里,模式
是/1/
,它表示在当前记录$0
中是否匹配正则表达式1
。 - kvantour如果您想以编程方式完成该操作,可以使用FS
变量:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
请注意,如果你在主循环而不是 BEGIN
循环中更改它,则它将对下一行读入产生影响,因为当前行已经被分割。
您有多种方式来设置分隔符:
:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
它们都是等效的,并将在给定样本输入"1:2:3"时返回1
:
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
语句会更正确(与整个 awk
语法保持一致)。 - user4104817BEGIN
,而对于一行命令,-F
很方便。 - fedorquiawk 'BEGIN{print split("foo:bar",a)}' FS=":" file
和 awk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
。 - kvantoursplit()
中明确设置分隔符,特别是在函数内部,而不是让它完全取决于当前的FS
(除非我正在拆分一个空字符串以清除数组,在这种情况下,这根本不重要)。 - RARE Kpop Manifesto您也可以使用正则表达式作为字段分隔符。以下代码将使用正则表达式将数字“10”设置为分隔符并打印“bar”。
echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
-F
是传递给awk
本身的参数:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
或者你可以使用:
echo "1: " | awk '/1/{print $1-":"}'
这是一个非常有趣的公式。
/1/
是什么意思? - user4104817-F
选项输入所需的字段分隔符和要打印的列号,即可根据您提供的字段分隔符打印所需列。echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK是一种文本解释器,它会按行处理整个文档,对于每一行又会逐个字段处理。因此$1、$2...$n代表每行的字段($1代表第一个字段,$2代表第二个字段以此类推)。
您可以使用命令行下的“-F”开关或在两个括号中使用“FS=…”来定义字段分隔符。
现在考虑Jürgen的答案:
echo "1: " | awk -F ":" '/1/ {print $1}'
"echo" 命令的输出是包含 "1" 的一行,因此过滤器将起作用...
当处理以下示例时:
echo "1: " | awk '/1/ -F ":" {print $1}'
语法混乱,解释器选择忽略F ":"这一部分,并切换到默认的字段拆分器——空格,因此将“1:”作为第一个字段输出,并且不会有第二个字段!
Jürgen的回答包含了良好的语法...
awk
忽略它 - awk
将其视为一个正则表达式的布尔结果(1/0),然后进行数字减法运算,再与一个单冒号(:
)字符串连接,这意味着总模式为真,因为它是一个非空字符串,因此 $1
默认按空格分隔并打印。 - RARE Kpop Manifestoecho "1: " | "456:abc:515:xyz "
awk -F: NF=/1/
1 | 456
更新:意识到我之前的回答有些啰嗦了
awk '/1/ -F ":" {print $1}'
无论输入行中是否实际存在"1"
,它都将始终打印出$1
或空行。 - RARE Kpop Manifesto