给出以下命令:
echo "1: " | awk '/1/ -F ":" {print $1}'
为什么awk输出:
1:
答案 0 :(得分:330)
“ - F”是命令行参数而不是awk语法,请尝试:
echo "1: " | awk -F ":" '/1/ {print $1}'
答案 1 :(得分:55)
如果您想以编程方式执行此操作,可以使用FS
变量:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
请注意,如果您在主循环而不是BEGIN
循环中更改它,则会读入 next 行,因为当前行已被拆分。< / p>
答案 2 :(得分:23)
您可以通过多种方式将:
设置为分隔符:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
所有这些都是等效的,并且对于样本输入将返回1
&#34; 1:2:3&#34;:
$ 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
答案 3 :(得分:11)
-F
是awk
本身的一个参数:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
答案 4 :(得分:5)
AWK作为文本解释器按行显示整个文档,按字段顺序显示每行因此$ 1,$ 2 .. $ n是对字段的引用每一行($ 1是第一个字段,$ 2是第二个字段,依此类推......)。 您可以使用命令行下的“-F”开关或“FS = ...”的两个括号内定义字段分隔符。 现在考虑“JUERGEN”的答案:
echo "1: " | awk -F ":" '/1/ {print $1}'
在字段上方边界由“:”设置,所以我们有两个文件$ 1是“1”而$ 2是空的空格。之后,正则表达式“/ 1 /”指示过滤器输出第一个字段,只有当解释器偶然发现包含这种表达式的行时(我的意思是1); “echo”命令的输出是一行包含“1”,因此过滤器将起作用...
处理以下示例时:
echo "1: " | awk '/1/ -F ":" {print $1}'
语法很乱,解释器选择忽略F“:”部分 并切换到默认的字段拆分器,这是空的sapce,因此输出“1:”作为第一个字段,并且不会有第二个字段!
JUERGEN的答案包含了良好的语法......
答案 5 :(得分:4)
您还可以使用正则表达式作为字段分隔符,以下将使用正则表达式将数字“10”设置为分隔符来打印“bar”。
echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
答案 6 :(得分:2)
或者您可以使用:
echo "1: " | awk '/1/{print $1-":"}'
这真是一个有趣的方程式。