5分钟入门AWK

AWK是Linux上卓越的文本处理工具,它具有非常简单的语法结构,拥有强大的文本处理能力。AWK 是一种解释执行的编程语言,AWK 的名称是由它们设计者的名字缩写而来 —— Afred Aho, Peter Weinberger 与 Brian Kernighan。


目前总共有如下几种不同的 AWK 版本。

AWK——这个版本是 AWK 最原初的版本,它由 AT&T 实验室开发。

NAWK ——NAWK(New AWK)是 AWK 的改进增强版本。

GAWK—— GAWK 即 GNU AWK,所有的 GNU/Linux 发行版都包括 GAWK,且 GAWK 完全兼容 AWK 与 NAWK。


AWK 可以做非常多的工作。 下面只是其中部分 AWK 的典型应用场景:

文本处理,

生成格式化的文本报告,

进行算术运算,

字符串操作,以及其它更多。


linux 默认安装了gawk,使用which gawk,如果输出/bin/gawk,说明已经安装了gawk,否则需要我们安装,可以使用 yum 包管理工具安装:

[root]# yum install gawk


另外我们也可以通过源码编译的方式安装gawk:

step 1——从可信的源下载源代码。可以在命令行使用 wget 命令下载。

[jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz

step 2——解压并提取下载的源代码。

[jerry]$ tar xvf gawk-4.1.1.tar.xz

step 3——切换至解压后的目录并运行 configure 命令

[jerry]$ ./configure

step 4——configure 命令成功执行后会生成一个 Makefile 文件。 接下来使用 make 命令编译源代码。

[jerry]$ make

step 5——你可以运行测试工具保证 build 是干净的。 这一步是可选的。

[jerry]$ make check

step 6——最后一步,安装 AWK。 安装前请确认你有超级用户的权限。

[jerry]$ sudo make install

通过以上六个步骤,你就成功地编译并安装了 AWK。 你可以通过如下的命令来确认 awk 安装成功:


gawk的版本通过: gawk --version 查看

[jerry]$ which awk

执行上面的命令,你将会得到如下的结果:

/usr/bin/awk


awk的工作流程:

读( Read )、执 行( Execute )与重复( Repeat )

读入一行执行一行,直到文件末尾。


gawk的程序结构:

开始块(BEGIN block),以大写BEGIN开头,必须大写,这一部分是可选的,可有可无。如:

BEGIN {awk-commands}

主体块(Body Block),如:

/pattern/ {awk-commands}

结束块(END Block),以大写END结束,必须大写,这一部分是可选的,可有可无。如:

END {awk-commands}


awk的整体语法格式是: awk '/pattern/ {action}' file 

其中单引号是为了和shell命令区分开;

/pattern/ 是一个过滤器,匹配这个模式的行才会被action的命令处理;

{}是一个命令组,action是具体执行的命令;

file是要处理的文件

其中/pattern/ 和{action}必须要有一个,

awk可以直接在命令行执行执行命令,也可以通过编写好脚本,然后执行脚本。

通过命令行的方式:

输出marks.txt文件的内容:

[jerry]$ awk '{print}' marks.txt 

再比如输出tomcat日志:

gawk '{print}' /usr/local/apache-tomcat-8.0.30/logs/catalina.out

另外一种提供 AWK 命令的方式——通过脚本文件提供:

awk [option] -f file ....

首先,创建一个文本文件 command.awk,在文件中输入如下 AWK 命令:

{print}

现在,我们可以调用 AWK 从文本文件中读入命令并执行。这里,我们实现了与上面例子相同的效果:

[jerry]$ awk -f command.awk marks.txt

awk有一些标准选项:

-v 选项

这个选项可以为变量赋值。它允许在程序执行之前为变量赋值。下面是一个 -v 选项使用的示例程序:

[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'

执行上面的命令可以得到如下的结果:

Name = Jerry

--dump-variables[=file] 选项

此选项会将全局变量及相应值按序输出到指定文件中。默认的输出文件名是 awkvars.out。

[jerry]$ awk --dump-variables ''

[jerry]$ cat awkvars.out 


awk的基本使用示例:

默认情况下,如果某行与模式串匹配,AWK 会将整行输出:

[jerry]$ awk '/a/ {print}' marks.txt

这个输出marks.txt文件中匹配 a 字符的所在行。

输出某一列,比如输出第三列:

[jerry]$ awk '/a/ {print $3}' marks.txt

统计模式串成功匹配的次数,并将该结果打印出来:

[jerry]$ awk '/JVM/ {++count} END {print count }' catalina.out 

输出字符数多于 18 的行:

[jerry]$ awk 'length($0) > 18' marks.txt

查询文件中匹配的字符:

awk '/uid=10001/' catalina.out

在catalina.out文件中找匹配uid=10001的行,和 grep类似的功能。

awk '/uid=10*/' catalina.out

awk数组操作,比如删除数组的元素:

[jerry]$ awk 'BEGIN {

fruits["mango"]="yellow";

fruits["orange"]="orange";

delete fruits["orange"];

print fruits["orange"]

}'

awk的逻辑语言ifelse:

[jerry]$ awk 'BEGIN {

a=30;

if (a==10)

  print "a = 10";

else if (a == 20)

  print "a = 20";

else if (a == 30)

  print "a = 30";

}'

awk的循环:

[jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

[jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

awk里面有很多内置函数,数学函数,字符串函数,日期函数等。

还可以自定义函数。

awk也可以把输出重定向到文件:

[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'

>> 双大于号是追加。

awk也可以使用管道:

[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

声明:本文转载自蛙课网官网

想获取更多资讯、更多视频、面试题答案,还有各种资源+源码+工具

就关注“蛙课网校”公众号吧!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355