Jür*_*zel 356

"-F"是命令行参数而不是awk语法,请尝试:

 echo "1: " | awk -F  ":" '/1/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

  • Ignorant的问题在这里:/ 1 /部分是告诉awk只处理包含数字1的行(或更精确的记录)吗? (38认同)
  • @rantsh Awk 语法看起来像“(pattern){action}”。如果“pattern”(主要是条件语句)为“true”,则执行“action”。如果“pattern”不可用,则隐含“true”。这里的“pattern”是“/1/”,它表明正则表达式“1”在当前记录“$0”中匹配 (7认同)
  • 完全是@rantsh (2认同)

Pau*_*ce. 59

如果要以编程方式执行此操作,可以使用FS变量:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Run Code Online (Sandbox Code Playgroud)

请注意,如果在主循环而不是BEGIN循环中更改它,则读取下一行会生效,因为当前行已经被拆分.


fed*_*qui 28

您有多种方法可以设置:为分隔符:

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'
Run Code Online (Sandbox Code Playgroud)

所有这些都是等效的,并且对于1样本输入"1:2:3" 将返回:

$ 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
Run Code Online (Sandbox Code Playgroud)


dan*_*ben 12

-F是一个awk自己的论点:

$echo "1: " | awk -F":" '/1/ {print $1}'
1
Run Code Online (Sandbox Code Playgroud)

  • 无需引用冒号。 (2认同)

Zle*_*ni 6

您也可以使用正则表达式作为字段分隔符,下面将通过使用正则表达式将数字“ 10”设置为分隔符来打印“条”。

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
Run Code Online (Sandbox Code Playgroud)


小智 5

AWK作品文本翻译是去面向行整个文档那去fieldwise每行因此$ 1,$ 2 .. $ n的每一行的字段引用($ 1是第一个字段,$ 2是第二场等等...)。您可以通过在命令行下方或两个带有“ FS = ...”的方括号内使用“ -F”开关来定义字段分隔符。现在考虑“ JUERGEN”的答案:

echo "1: " | awk -F  ":" '/1/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

字段边界上方由“:”设置,因此我们有两个字段$ 1为“ 1”和$ 2为空白。之后,出现正则表达式“ / 1 /”,指示过滤器仅输出第一个字段当解释器偶然发现包含这样的表达式的行时(我的意思是1);“ echo”命令的输出是包含“ 1”的一行,因此过滤器可以工作...

处理以下示例时:

echo "1: " | awk '/1/ -F ":" {print $1}'
Run Code Online (Sandbox Code Playgroud)

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

JUERGEN的答案包含良好的语法...


Von*_*ton 5

或者您可以使用:

echo "1: " | awk  '/1/{print $1-":"}' 
Run Code Online (Sandbox Code Playgroud)

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