awk(1)

概述
awk是一个功能非常强大的的数据操作实用程序。作为一个程序,awk可以对大范围的数据进行匹配搜索和修改,同时它还具有一些其他编程语言类似的特征。实用程序awk与grep相同,都是一个模式匹配工具。除此之外,它还拥有以下功能:当找到某模式的匹配项后,对该匹配项,进行特定的复杂操作。另外,与其他编程语言一样,在awk中,可以使用循环,条件语句以及变量。

1. 使用awk选择记录:

下面我们就进入awk的用法测试。
测试文件内容如下:

awk01.png

例子1:

[root@VM_89_124_centos awk]# awk '/Fish/{print}' test.txt 
Fish Meat 3.79 3 n

分析:

  • awk :指示shell运行实用程序awk
  • ' ' : 指示shell不解释单引号之间的数据,以确保awk收到的信息未被更改。
  • /Fish/ : 一对斜线指明了匹配模式,即选择特定数据库中记录的一个标准。所有含有目标行的都会被匹配,并运行其后的操作。
  • {print} : 大括号间的print命令动作语句指示awk输出选定的记录。语句print是awk中的众多动作之一。除非另有指示,否则print命令将输出含有目标的全部记录。
  • test.txt : 输入文件名。awk读取该文件,并将指定的模式-动作语句应用于该数据库中的每行。
awk02.png

上面图文并茂的解释了awk命令的执行流程。下面用更多的例子来加深理解。

更多的例子说明

  1. 不指定动作
[root@VM_89_124_centos awk]# awk '/Meat/' test.txt 
Chichen Meat 4.89 2 n
Fish Meat 3.79 3 n

awk的默认动作是使用print命令输出符合标准要求的全部记录。

  1. 不指定模式
[root@VM_89_124_centos awk]# awk '{print}' test.txt 
Carrots veg 1.39 1 n
Milk Dairy 1.89 2 n
Magazine Sundry 3.50 2 n
Cheese Dairy 4.39 1 n
Sandwich Deli 3.89 2 y
Onions Veg .89 6 n
Chichen Meat 4.89 2 n
Newspaper Sundry 1.00 1 y
Fish Meat 3.79 3 n
Floorwax Hshld 4.65 1 y
Melon Fruit 1.98 3 n
Celery Veg 1.79 1 n
Napkins Hshld 1.49 6 y

如果没有指定模式(目标),awk认为数据库中的所有记录都是匹配项,并且对所有记录(行)运行awk语句中的指定动作。

2.使用awk操作数据库

2.1 输出数据库中的一个字段元素

[root@VM_89_124_centos awk]# awk '{print $1}' test.txt 
Carrots
Milk
Magazine
Cheese
Sandwich
Onions
Chichen
Newspaper
Fish
Floorwax
Melon
Celery
Napkins

2.2 使用awk的预定义变量

上列中,变量$1指示awk仅显示数据库test.txt中所有记录的第一个字段。对awk来说,变量$1指各记录第一个字段的值。

变量(variable)是一个具有变量名和变量值的表达式。在书写awk脚本时,变量通常由用户或程序员定义。此外,awk程序代码中还有一些类似$1的预定义变量。在awk程序代码中,经常可以看到由一个美元符号$和一个数字组成的字段变量。符号$是字段操作符(field operator),1代表着相应的字段序号(literal number component)。上例中,变量$1指的就是数据库中各记录第一个字段的值。通常,各个记录或数据库的第一个字段值都不相同。但是,对awk来说,当前检查的记录的第一个字段值就是$1的值,因为这种变量关系是awk已经预先定义的。

2.3 显示多个字段

[root@VM_89_124_centos awk]# awk '{print $1 $3 $2}' test.txt 
Carrots1.39veg
Milk1.89Dairy
Magazine3.50Sundry
Cheese4.39Dairy
Sandwich3.89Deli
Onions.89Veg
Chichen4.89Meat
Newspaper1.00Sundry
Fish3.79Meat
Floorwax4.65Hshld
Melon1.98Fruit
Celery1.79Veg
Napkins1.49Hshld

可以看到,在输出目标时我可以指定输出的顺序。但是输出中各记录的所有字段挤在一起。字段之间没有空格是因为没有使用指令告诉awk字段之间放置空格。

2.4 在awk输出的结果中插入空格

为了让输出结果有更好的可读性,必须要求awk在输出各字段时,将各字段分隔开。

[root@VM_89_124_centos awk]# awk '{print $1,$3,$2}' test.txt 
Carrots 1.39 veg
Milk 1.89 Dairy
Magazine 3.50 Sundry
Cheese 4.39 Dairy
Sandwich 3.89 Deli
Onions .89 Veg
Chichen 4.89 Meat
Newspaper 1.00 Sundry
Fish 3.79 Meat
Floorwax 4.65 Hshld
Melon 1.98 Fruit
Celery 1.79 Veg
Napkins 1.49 Hshld

可以看出就是多加了逗号","用以将字段隔开,用空格。也可以使用"\t"来讲字段隔开,用tab键。

[root@VM_89_124_centos awk]# awk '{print $1"\t"$3"\t"$2}' test.txt 
Carrots 1.39    veg
Milk    1.89    Dairy
Magazine    3.50    Sundry
Cheese  4.39    Dairy
Sandwich    3.89    Deli
Onions  .89 Veg
Chichen 4.89    Meat
Newspaper   1.00    Sundry
Fish    3.79    Meat
Floorwax    4.65    Hshld
Melon   1.98    Fruit
Celery  1.79    Veg
Napkins 1.49    Hshld

2.5 选择所有字段

[root@VM_89_124_centos awk]# awk '{print $0}' test.txt 
Carrots veg 1.39 1 n
Milk Dairy 1.89 2 n
Magazine Sundry 3.50 2 n
Cheese Dairy 4.39 1 n
Sandwich Deli 3.89 2 y
Onions Veg .89 6 n
Chichen Meat 4.89 2 n
Newspaper Sundry 1.00 1 y
Fish Meat 3.79 3 n
Floorwax Hshld 4.65 1 y
Melon Fruit 1.98 3 n
Celery Veg 1.79 1 n
Napkins Hshld 1.49 6 y

预定义变量$0是指记录中的所有字段,即整个行。全字段变量$0用于定义或匹配一条完整记录的属性。输出了所有记录的全部字段。这个和之前的awk '{print}' test.txt是一样的效果。

2.6识别变量和字符串

$1是一个变量。awk把每个变量都看成一个指令,用变量的值替换该变量本身。用户可以创建变量,并使用awk来操作。
(1)输入:
awk -v item='Grocery Item' '{print item,$1}' test.txt

[root@VM_89_124_centos awk]# awk -v item='Grocery Item' '{print item,$1}'  test.txt
Grocery Item Carrots
Grocery Item Milk
Grocery Item Magazine
Grocery Item Cheese
Grocery Item Sandwich
Grocery Item Onions
Grocery Item Chichen
Grocery Item Newspaper
Grocery Item Fish
Grocery Item Floorwax
Grocery Item Melon
Grocery Item Celery
Grocery Item Napkins

-v :传给awk的第一个参数,指示awk在该参数之后,将定义一个变量。

(2)还可以告诉awk,对象可以是一个没有特殊含义的字符串,输入:
awk '{print "item:", $1, "Price:", $3}' test.txt

[root@VM_89_124_centos awk]# awk '{print "item:", $1, "Price:", $3}' test.txt
item: Carrots Price: 1.39
item: Milk Price: 1.89
item: Magazine Price: 3.50
item: Cheese Price: 4.39
item: Sandwich Price: 3.89
item: Onions Price: .89
item: Chichen Price: 4.89
item: Newspaper Price: 1.00
item: Fish Price: 3.79
item: Floorwax Price: 4.65
item: Melon Price: 1.98
item: Celery Price: 1.79
item: Napkins Price: 1.49

双引号里面的字母字符仅仅是一些字符,没有特别的含义。如果是数字的话则无需加上双引号。

[root@VM_89_124_centos awk]# awk '{print 111, $1, 222, $3}' test.txt
111 Carrots 222 1.39
111 Milk 222 1.89
111 Magazine 222 3.50
111 Cheese 222 4.39
111 Sandwich 222 3.89
111 Onions 222 .89
111 Chichen 222 4.89
111 Newspaper 222 1.00
111 Fish 222 3.79
111 Floorwax 222 4.65
111 Melon 222 1.98
111 Celery 222 1.79
111 Napkins 222 1.49

对比一下:

[root@VM_89_124_centos awk]# awk '{print "111:", $1, "222:", $3}' test.txt
111: Carrots 222: 1.39
111: Milk 222: 1.89
111: Magazine 222: 3.50
111: Cheese 222: 4.39
111: Sandwich 222: 3.89
111: Onions 222: .89
111: Chichen 222: 4.89
111: Newspaper 222: 1.00
111: Fish 222: 3.79
111: Floorwax 222: 4.65
111: Melon 222: 1.98
111: Celery 222: 1.79
111: Napkins 222: 1.49

2.7使用选项改变字段定界符。

[root@VM_89_124_centos awk]# awk -F: '{print $1,$4,$7}' /etc/passwd|head -5
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 4 /sbin/nologin
lp 7 /sbin/nologin

[root@VM_89_124_centos awk]# awk -F: '{print $1 $4 $7}' /etc/passwd|head -5
root0/bin/bash
bin1/sbin/nologin
daemon2/sbin/nologin
adm4/sbin/nologin
lp7/sbin/nologin

选项-F通知awk,当它读取输入数据时,应当把冒号(:)作为字段定界符(不写的话,默认是以空格为定界符)。但即使改变了输入字段的定界符,输出中的字段定界符依然是空格。对比上面的两种方式可以看出。
同样,如果输入" -F'*' ",awk会把符号*当成字符定界符。

awk可认为是一门编程语言。基础部分比较简单,尝试写这篇文档感觉抓不住要陈述的点,但是梳理一下也是好的,awk的用法也在于平时多积累多尝试。

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

推荐阅读更多精彩内容

  • awk: grep,sed,awk grep:文本过滤 sed:文本编辑 awk:文本格式化工具; 1 什么是aw...
    木林森阅读 1,769评论 0 16
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,192评论 2 25
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,560评论 0 4
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,453评论 0 9
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,260评论 0 8