给定以下命令,

echo "1: " | awk '/1/ -F ":" {print $1}'

为什么AWK输出:

1:

?


当前回答

AWK是一个文本解释器,它对整个文档进行逐行处理,对每一行进行逐域处理。因此$1,$2…$n是对每行字段的引用($1是第一个字段,$2是第二个字段,依此类推……)

您可以通过在命令行下使用“-F”开关或在两个括号内使用“FS=…”来定义字段分隔符。

现在考虑Jürgen的答案:

echo "1: " | awk -F  ":" '/1/ {print $1}'

在字段上方,边界由“:”设置,因此我们有两个字段$1是“1”,$2是空白区域。后面是正则表达式“/1/”,它指示过滤器只有在解释器偶然发现包含这样一个表达式的行(我的意思是1)时才输出第一个字段。

“echo”命令的输出是一行包含“1”,因此过滤器将工作…

在处理以下示例时:

echo "1: " | awk '/1/ -F ":" {print $1}'

语法混乱,解释器选择忽略部分F“:” 并切换到默认的字段分割器,即空白区域,因此输出“1:”作为第一个字段,并且不会有第二个字段!

Jürgen的答案包含了良好的语法…

其他回答

或者你可以用:

echo "1: " | awk  '/1/{print $1-":"}' 

这是一个非常有趣的方程。

-F是命令行参数,不是AWK语法。试一试:

echo '1: ' | awk -F  ':' '/1/ {print $1}'

没有必要写这么多。只需在AWK命令中使用-F选项输入所需的字段分隔符,并根据您提到的字段分隔符打印要分隔的列号。

echo "1: " | awk -F: '{print $1}'
1

echo "1#2" | awk -F# '{print $1}'
1

-F是awk本身的参数:

$echo "1: " | awk -F":" '/1/ {print $1}'
1

AWK是一个文本解释器,它对整个文档进行逐行处理,对每一行进行逐域处理。因此$1,$2…$n是对每行字段的引用($1是第一个字段,$2是第二个字段,依此类推……)

您可以通过在命令行下使用“-F”开关或在两个括号内使用“FS=…”来定义字段分隔符。

现在考虑Jürgen的答案:

echo "1: " | awk -F  ":" '/1/ {print $1}'

在字段上方,边界由“:”设置,因此我们有两个字段$1是“1”,$2是空白区域。后面是正则表达式“/1/”,它指示过滤器只有在解释器偶然发现包含这样一个表达式的行(我的意思是1)时才输出第一个字段。

“echo”命令的输出是一行包含“1”,因此过滤器将工作…

在处理以下示例时:

echo "1: " | awk '/1/ -F ":" {print $1}'

语法混乱,解释器选择忽略部分F“:” 并切换到默认的字段分割器,即空白区域,因此输出“1:”作为第一个字段,并且不会有第二个字段!

Jürgen的答案包含了良好的语法…