专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序员小灰  ·  蔚来汽车裁员约10%,20分钟完成裁员。。。 ·  2 天前  
OSC开源社区  ·  地表最强「开源版PS」——GIMP ... ·  2 天前  
OSC开源社区  ·  本周六,OSC源创会·南京站:聊聊生成式AI ... ·  3 天前  
51好读  ›  专栏  ›  OSC开源社区

详解 awk 工具的使用方法

OSC开源社区  · 公众号  · 程序员  · 2017-05-14 08:38

正文


当你第一次拿起双手在电脑上使用 awk 命令处理一个或者多个文件的时候,它会依次读取文件的每一行内容, 然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。


awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。说了这么多,你肯定还是一脸的懵逼。你猜对了,上面这些都是废话。先别急,客官请往下看...


awk 命令的基本格式


options 这个表示一些可选的参数选项,反正就是你爱用不用,不用可以拉到。


program 这个表示 awk 的可执行脚本代码,这个是必须要有的。 file 这个表示 awk 需要处理的文件,注意是纯文本文件,不是你的 mp3,也不是 mp4 啥的~


来个 awk 的使用例子热热身


awk 命令的可执行脚本代码使用单引号括起来,紧接着里面是一对花括号,记住是 "花括号" 不是 "花姑娘",然后花括号里面就是一些可执行的脚本代码段。


当 awk 每读取一行之后,它会依次执行双引号里面的每个脚本代码段,在上面这个例子中, $0 表示当前行。


当你执行了上面的命令之后,它会依次将 /etc/passwd 文件的每一行内容打印输出,你一定在想:这有个毛用,用 cat 命令也能搞定。没错!上面这个命令没个毛用,请往下看。


awk 自定义分隔符

awk 默认的分割符为空格和制表符,我们可以使用 -F 参数来指定分隔符



上面的命令将 /etc/passwd 文件中的每一行用冒号 : 分割成多个字段,然后用 print 将第 1 列字段的内容打印输出


如何在 awk 中同时指定多个分隔符

比如现在有这样一个文件 some.log 文件内容如下



现在我们想将上面的 some.log 文件中按照 "水果名称(重量)年份" 来进行分割



在 -F 参数中使用一对方括号来指定多个分隔符,awk 处理 some.log 文件时就会使用 "(" 和 ")" 来对文件的每一行进行分割。


awk 内置变量的使用

$0 这个表示文本处理时的当前行


$1 表示文本行被分隔后的第 1 个字段列


$2 表示文本行被分割后的第 2 个字段列


$3 表示文本行被分割后的第 3 个字段列


$n 表示文本行被分割后的第 n 个字段列


NR 表示文件中的行号,表示当前是第几行


NF 表示文件中的当前行列的个数,类似于 mysql 数据表里面每一条记录有多少个字段


FS 表示 awk 的输入分隔符,默认分隔符为空格和制表符,你可以对其进行自定义设置


OFS 表示 awk 的输出分隔符,默认为空格,你也可以对其进行自定义设置


FILENAME 表示当前文件的文件名称,如果同时处理多个文件,它也表示当前文件名称


比如我们有这么一个文本文件 fruit.txt 内容如下,我将用它来向你演示如何使用 awk 命令工具,顺便活跃一下此时尴尬的气氛。



我们来瞧一瞧下面这些简单到爆炸的例子,这个表示打印输出文件的每一整行的内容



下面这个表示打印输出文件的每一行的第 1 列内容



下面面这个表示打印输出文件的每一行的第 1 列、第 2 列和第 3 列内容



其中加入的逗号表示插入输出分隔符,也就是默认的空格


赋值

文件的每一行的每一列的内容除了可以用 print 命令打印输出以外,还可以对其进行赋值



上面的例子就是表示通过对 $2 变量进行重新赋值,来隐藏每一行的第 2 列内容,并且用星号 * 来代替其输出


在参数列表中加入一些字符串或者转义字符之类的东东



像上面这样,你可以在 print的参数列表中加入一些字符串或者转义字符之类的东东,让输出的内容格式更漂亮,但一定要记住要使用双引号。


awk 内置 NR 变量表示每一行的行号



awk 内置 NF 变量表示每一行的列数



awk 中 $NF 变量的使用



上面这个 $NF 就表示每一行的最后一列,因为 NF 表示一行的总列数,在这个文件里表示有 5 列,然后在其前面加上 $ 符号,就变成了 $5 ,表示第 5 列



上面 $(NF-1) 表示倒数第 2 列, $(NF-2) 表示倒数第 3 列,依次类推。


现在除了刚才说的有一个 fruit.txt 文件之外,我们又多了一个新文件叫 company.txt 内容如下



我们用 fruit.txt 和 company.txt 两个文件来向你演示 awk 同时处理多个文件的时候有什么效果



当你使用 awk 同时处理多个文件的时候,它会将多个文件合并处理,变量 FILENAME 就表示当前文本行所在的文件名称。


看到这里是不是感觉 awk 命令的使用方法真的是简单到爆炸,现在不要太高兴,请举起你的双手跟我一起摇摆。哦,不对!请拿起你的双手在电脑上试一试上面这些例子。 你会知道我没有骗你,因为讲了这么多,傻子都会了。—_—


BEGIN 关键字的使用

在脚本代码段前面使用 BEGIN 关键字时,它会在开始读取一个文件之前,运行一次 BEGIN 关键字后面的脚本代码段, BEGIN 后面的脚本代码段只会执行一次,执行完之后 awk 程序就会退出



awk 脚本中可以用多个花括号来执行多个脚本代码,就像下面这样



END 关键字使用方法

awk 的 END 指令和 BEGIN 恰好相反,在 awk 读取并且处理完文件的所有内容行之后,才会执行 END 后面的脚本代码段



一定要多动手在电脑上敲一敲这些命令,对身体好。脑子是个好东西,要多用。



在 awk 中使用变量

可以在 awk 脚本中声明和使用变量








请到「今天看啥」查看全文