awk以空格为分隔符

root@ubuntu:/home# echo "1 2 3 4" | awk -F' ' '{print $1}'
1
root@ubuntu:/home# echo "1 2 3 4" | awk -F' ' '{print $2}'
2
root@ubuntu:/home# echo "1 2 3 4" | awk -F' ' '{print $3}'
3
root@ubuntu:/home# 

如果存在多个空格时,例如在1和2直接增加一个空格,下面这样单独设置的可以正确输出

root@ubuntu:/home# echo "1  2 3 4" | awk -F' ' '{print $2}'
2
root@ubuntu:/home# 

如果是带方括号,$2会输出空格,$3会输出2

root@ubuntu:/home# echo "1  2 3 4" | awk -F'[ ]' '{print $2}'

root@ubuntu:/home# echo "1  2 3 4" | awk -F'[ ]' '{print $3}'
2

如果带方括号,再加加号(表示连续多个或1个),$2正常输出

root@ubuntu:/home# echo "1  2 3 4" | awk -F'[ ]+' '{print $2}'
2

但是如果第一个为空格时,会输出:

root@ubuntu:/home# echo " 1  2 3 4" | awk -F' ' '{print $1}'
1
root@ubuntu:/home# echo " 1  2 3 4" | awk -F' ' '{print $2}'
2
root@ubuntu:/home# echo " 1  2 3 4" | awk -F'[ ]+' '{print $1}'

root@ubuntu:/home# echo " 1  2 3 4" | awk -F'[ ]+' '{print $2}'
1
root@ubuntu:/home# 

搞晕了。。。

后面看大佬总结
awk手册

  • 行中的连续空格不会分隔空字段。当 FS 的值为 " " 时,awk 首先从记录中去除行首和行尾的空白,然后再分割字段。

  • 如果 FS 是其他字符,比如”,“,连续两次出现将分隔一个空字段。如果字符出现在行首或行尾,也会分隔空字段。空格字符做为默认分隔符,是唯一不遵守这些规则的字符。

  • 如果通过 -F “[ ]” 指定,执表示通过单个空格分隔,此时,将失去其做为默认分隔符的特性,与其它字符一样,遵守同样的分隔规则。

总结:

示例一,没有指定分隔符,用的默认分隔符,此时行首的连续空白字符被自动去除。
示例二,指定分隔符为空格,等价于默认分隔符。
示例三,指定分隔符为一个或多个连续的“冒号或 tab 键“,此时行首多个连续空白字符被一起计入第一个字段。
示例四,指定分隔符为一个或多个连续的”空白字符或冒号或 tab 键“,此时行首多个连续的空白字符被分隔为一个独立的字段。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐