awk或gawk中可以通过-F参数或者内置变量FS指定输入内容的分隔符,默认的分隔符为空格、制表符、换行符等空白字符。
下面详细介绍下指定不同类型的字符作为分隔符时的使用方法。
1. 使用默认分隔符或指定单个字符作为分隔符
若要将一个特殊字符,例如\、<、>、(、)、\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
2. 指定多个字符作为分隔符
例如,想要将如下字符串中的’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
3. 同时指定多个分隔符
有时候,可能需要使用多个不同的分隔符一次性将文本中行的内容进行分隔,例如下面这个文档ssh.txt
ssh:user1@192.168.1.10
ssh:user2@192.168.1.11
ssh:user3@192.168.1.12
我们可以使用两次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