首页 » Linux » awk分隔符用法

awk分隔符用法

 
文章目录

上篇文章介绍了awk的语法和基础的使用方法,这里将akw的分隔符单独拿出来说一说。

用法

默认awk使用空白字符,即空格或tab作为分隔符,如果需要指定不同的分隔符,可以使用-F参数或对变量FS赋值
例如:

其中分隔符可用单引号或双引号包围,具体看使用情况,其意义与shell中的单引号双引号一样。

实例:

# echo "123:456" | awk -F ":" '{print $1 "\t" $2}'
123     456

或者:

注意分隔符赋值的语法前的BEGIN关键字,同时分隔符只能用双引号包围。

实例:

# echo "123:456" | awk 'BEGIN{FS=":"} {print $1 "\t" $2}'
123     456

同时awk也支持以字符串作为分隔符,例如:

多个连续分隔符

如果处理过程中碰到多个连续的分隔符时,awk会怎么处理呢?我们以实验来说明。

实例:

先想象一下结果会如何?
.
.
.
.
.
.
.
.
.
.
.
答案揭晓:

# echo "123:456::789" | awk -F ":" '{print $1 "\t" $2 "\t" $3}'
123     456

怎么样,789并没有输出出来。为什么?
注意到中间的::了吗?awk将这两个分隔符中间并不存在的字符也放入了一个域当中去填充,结果$3就变成了空字符串(注意不是空格哦),我们来改变一下写法:

# echo "123:456::789" | awk -F ":" '{print $1 "\t" $2 "\t" $3 "\t" $4}' |cat -A
123^I456^I^I789$

看到其中的【^I】了吗?他表示一个tab占位符,而其中有两个连续的tab中间是没有任何内容的,他就是$3了。

由此可以得出结论,如果有连续出现的分隔符,那么awk也会进行多次切割,将空内容保存到下一个域中。
那么如果我们想避免出现空的域应该怎么做呢?下一节揭晓。

多分隔符

awk分隔符除了支持常规的字符和字符串外,还支持使用正则表达式作为分隔符,这给分隔符创造了非常多种可能。
举个例子:123:456@789,我希望分别将123,456,789划分到3个域中,那么可以这样写:

# echo "123:456@789" | awk -F "[:@]" '{print $1 "\t" $2 "\t" $3}'
123     456     789

也可以这样写:

# echo "123:456@789" | awk -F ":|@" '{print $1 "\t" $2 "\t" $3}'
123     456     789

可以看到结果是一样的。其中[]是标准正则表达式,而|则是扩展正则表达式的写法。

正则表达式分隔符

前面提到正则表达式写法的分隔符,最后这里再做一些扩展。

例1:划分123:456::789:::abc
如果采用上以一节提到的写法会稍显麻烦,是否有更简单的呢?当然,请看下面

# echo "123:456::789:::abc" |awk -F ":+" '{print $1 "\t" $2 "\t" $3 "\t" $4}'
123     456     789     abc

依然很简介,其中的:+表示一个以上的:。

例2:划分123,456.789:abc~def

]# echo "123,456.789:abc~def" |awk -F "[[:punct:]]" '{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5}'
123     456     789     abc     def

其中正则表达式写法[:punct:]表示任意标点符号。

以上两个例子其实也就是正则表达式的两种用法而已,暂且就说这么多,文中如有错漏的欢迎指正。

原文链接:awk分隔符用法,转载请注明来源!

9