Linux中awk工具的使用详解

当你第一次拿起双手在电脑上使用 awk 命令处理一个或者多个文件的时候,它会依次读取文件的每一行内容, 然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块 。awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言 。说了这么多,你肯定还是一脸的懵逼 。你猜对了,上面这些都是废话 。先别急,客官请往下看 。。。
awk 命令的基本格式
awk [options] 'program' file
这个表示一些可选的参数选项,反正就是你爱用不用,不用可以拉到 。。。这个表示 awk 的可执行脚本代码,这个是必须要有的 。file这个表示 awk 需要处理的文件,注意是纯文本文件,不是你的 mp3,也不是 mp4 啥的 。。
先来一个 awk 的使用例子热热身
$ awk '{print $0}' /etc/passwd
awk 命令的可执行脚本代码使用单引号括起来,紧接着里面是一对花括号,记住是 "花括号" 不是 "花姑娘",然后花括号里面就是一些可执行的脚本代码段,当 awk 每读取一行之后,它会依次执行双引号里面的每个脚本代码段,在上面这个例子中,$0表示当前行 。当你执行了上面的命令之后,它会依次将 /etc/ 文件的每一行内容打印输出,你一定在想:这有个毛用,用 cat 命令也能搞定 。没错!上面这个命令没个毛用,请往下看 。
awk 自定义分隔符
awk 默认的分割符为空格和制表符,我们可以使用 -F 参数来指定分隔符
$ awk -F ':' '{print $1}' /etc/passwdrootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobody
上面的命令将 /etc/ 文件中的每一行用冒号:分割成多个字段,然后用 print 将第 1 列字段的内容打印输出
如何在 awk 中同时指定多个分隔符
比如现在有这样一个文件 some.log 文件内容如下
Grape(100g)1980raisins(500g)1990plum(240g)1997apricot(180g)2005nectarine(200g)2008
现在我们想将上面的 some.log 文件中按照 "水果名称(重量)年份" 来进行分割
$ awk -F '[()]' '{print $1, $2, $3}' some.logGrape 100g 1980raisins 500g 1990plum 240g 1997apricot 180g 2005nectarine 200g 2008
在-F参数中使用一对方括号来指定多个分隔符,awk 处理 some.log 文件时就会使用 "(" 和 ")" 来对文件的每一行进行分割 。
awk 内置变量的使用
$0这个表示文本处理时的当前行
$1表示文本行被分隔后的第 1 个字段列
$2表示文本行被分割后的第 2 个字段列