awk或gawk中可以通过-F
参数或者内置变量FS
指定输入内容的分隔符,默认的分隔符为空格、制表符、换行符等空白字符。
下面详细介绍下指定不同类型的字符作为分隔符时的使用方法。
若要将一个特殊字符,例如\
、<
、>
、(
、)
、\n
、\t
、&
、;
、'
、"
、管道符、空格或反引号等在shell中有特殊意义的字符作为分隔符,那么必须将其使用双引号或者单引号包裹起来
例如下面这个例子,指定>
为字段分隔符,如果不使用单引号或双引号包裹,将会报错,因为>
被当作了重定向的命令:
$ echo '100>89>43'| awk -F > '{ print $1,$2,$3}'
awk: field separator FS is empty
awk: no program given
使用单引号或者双引号将其包裹后,则可以正确输出
$ echo '100>89>43'| awk -F ">" '{ print $1,$2,$3}'
100 89 43
例如,对于下面这个文本文档list.txt,其内容如下,每行中的各个字段之间使用制表符分隔:
jason 33 male
cherry 24 female
alex 27 male
要打印出每一行的姓名,可是使用不加-F
参数的awk命令或者指定分隔符为\t
或空格
$ awk '{ print $1}' list.txt
jason
cherry
alex
$
$ awk -F '\t' '{ print $1}' list.txt
jason
cherry
alex
$
$ awk -F " " '{ print $1}' list.txt
jason
cherry
alex
例如,想要将如下字符串中的’abc’这个字符串指定为一个分隔符
123abc456abc789abc
可以使用如下的命令
$ echo 123abc456abc789abc|awk -F 'abc' '{ print $1,$2,$3}'
123 456 789
如果指定多个字符作为一个整体作为一个分隔符,那么,其中每出现一个如下的特殊字符,就需要使用两个或者两个以上的\
对该特殊字符进行转义:
$
、^
、*
、(
、)
、[
、]
、?
、.
、|
例如,对于如下的字符串
123$.456$.789
要将$.
作为一个分隔符,如果不对$
进行转义,那么将得不到想要的结果
$ echo '123$.456$.789'|awk -F '$.' '{print $1,$2,$3}'
123$.456$.789
要得到正确的结果,可以使用如下的命令
$ echo '123$.456$.789'|awk -F '\\$.' '{print $1,$2,$3}'
123 456 789
如果将上例中的点号.
换成另外一个特殊字符,例如管道符\
,如下所示:
123$|456$|789
如果要只打印出123, 456, 789
,那么需要对其中的$
和|
都使用两个或两个以上的\
进行转义
$ echo '123$|456$|789'|awk -F '\\$\\|' '{print $1,$2,$3}'
123 456 789
有时候,可能需要使用多个不同的分隔符一次性将文本中行的内容进行分隔,例如下面这个文档ssh.txt
ssh:[email protected]
ssh:[email protected]
ssh:[email protected]
我们可以使用两次awk -F
命令,每次分别指定一个分隔符来进行操作,但是这样太麻烦,还有更简单的方法,即一次指定多个分隔符。
要一次指定多个分隔符,需要将分隔符用中括号[]
包裹起来,如果多个分隔符中有至少一个特殊字符,那么还需要在中括号外加上双引号或者单引号,并且使用两个或两个以上的\
将其进行转义
$
、^
、(
、)
、[
、]
、?
、.
、|
要对上述的文件内容进行操作,可以使用如下命令
$ awk -F [:@] '{ print $2, $3 }' ssh.txt
user1 192.168.1.10
user2 192.168.1.11
user3 192.168.1.12
将上述文件中的冒号:
和@
换为^
和|
,文件内容变为
ssh^user1|192.168.1.10
ssh:user2|192.168.1.11
ssh:user3|192.168.1.12
如果要打印出同样的内容,需要使用如下的命令
$ awk -F '[\\^\\|]' '{ print $1,$2,$3}' ssh.txt
user1 192.168.1.10
user2 192.168.1.11
user3 192.168.1.12
对于内容如下所示的文本文件name.txt
george[walker]bush
william[jefferson]clinton
如果要打印出由分隔符[
和]
分隔的三段数据,即可以分别使用两个或两个以上的\
对[
和]
进行转义,如下所示:
$ awk -F '[\\[\\]]' '{ print $1,$2,$3}' name.txt
george walker bush
william jefferson clinton
也可以使用如下的方法
$ awk -F '[][]' '{ print $1,$2,$3}' name.txt
george walker bush
william jefferson clinton