awk中的输入分隔符

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:[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

你可能感兴趣的:(Linux)