awk入门指南

1.AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
2.不同于sed以行为单位,awk是基于列的文本处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。
3.awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,这里的“空白字符” 包括、Tab,以及连续的空格和Tab等。每个非空白的部分叫做“域”,从左到右一次是第一个域,第二个域,等等。

$1、$2分别用于表示域,$0则表示全部域。

awk语法:

awk [选项参数] 'script' var=value file(s)
或者
awk [选项参数] -f scriptfile var=value file(s)
参数 作用
-F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
-v var=value or --asign var=value 赋值一个用户定义变量
-f scripfile or --file scriptfile 从脚本文件中读取awk命令
-mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用
-W compact or --compat, -W traditional or --traditional 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略
-W copyleft or --copyleft, -W copyright or --copyright 打印简短的版权信息
-W help or --help, -W usage or --usage 打印全部awk选项和每个选项的简短说明
-W lint or --lint 打印不能向传统unix平台移植的结构的警告
-W lint-old or --lint-old 打印关于不能向传统unix平台移植的结构的警告
-W posix 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替=;fflush无效
-W re-interval or --re-inerval 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]
-W source program-text or --source program-text 使用program-text作为源代码,可与-f命令混用
-W version or --version 打印bug报告信息的版本

awk常用的方法:

创建一个awk.txt文件,以此文件为例

[root@haocheng ~]# cat awk.txt 
john.wang  Male   30 021-11111111
lucy.yang  Female 25 021-22222222
jack.chen  Male   35 021-33333333
lily.gong  Female 20 021-44444444  ShangHai

1、打印指定域

既然awk使用$1、$2代表不同的域,则可以打印指定的域。拿awk.txt的第一行来说,第一个域为join.wang,第二个域为Male,第三个域为30、第四个域为021-11111111

打印$1、$4这两个域:
[root@haocheng ~]# awk '{print $1,$4}' awk.txt 
john.wang 021-11111111
lucy.yang 021-22222222
jack.chen 021-33333333
lily.gong 021-44444444
打印全部内容:
[root@haocheng ~]# awk '{print $0}' awk.txt     
john.wang  Male   30 021-11111111
lucy.yang  Female 25 021-22222222
jack.chen  Male   35 021-33333333
lily.gong  Female 20 021-44444444  ShangHai

2、指定打印分隔符

默认情况下awk是使用空白字符作为分隔符的,但是也可以通过-F参数指定分隔符,来区分不同的域(有点像cut命令)。

指定 “.” 作为分隔符,这样每一行的$1就是 "." 之前的字符,$2就是 "."之后的字符
比如第一行的$1是“join”,$2是“Male    30    021-11111111”
[root@haocheng ~]# awk -F. '{print $1}' awk.txt 
john
lucy
jack
lily
[root@haocheng ~]# awk -F. '{print $2}' awk.txt  
wang  Male        30 021-11111111
yang  Female 25 021-22222222
chen  Male   35 021-33333333
gong  Female 20 021-44444444  ShangHai
[root@haocheng ~]# awk -F. '{print $1,$2}' awk.txt  
john wang  Male   30 021-11111111
lucy yang  Female 25 021-22222222
jack chen  Male   35 021-33333333
lily gong  Female 20 021-44444444  ShangHai

3、内部变量NF

文件awk.txt所包含的内容不多,所以很容易的知道它的前3行中每行都有4个域,最后一行是5个域。但是如果有时候文件很大,每行列数都不一样,考观察就不现实了,必须通过特定的方式来获得文件的列数。通过awk的内部变量NF可以简单地做到这点。当然,如果指定了不同的分隔符,结果可能不一样

使用默认分隔符:
[root@haocheng ~]# awk '{print NF}' awk.txt 
4
4
4
5
[root@haocheng ~]# awk -F. '{print NF}' awk.txt  
2
2
2
2

4、打印固定域

通过内部变量可以简单地得到每行的列数,而如果在NF之前加上$符号,则代表“最后一列”,这样不管每行有多少列,只要使用$NF就能打印出最后一列

打印最后一列:
[root@haocheng ~]# awk '{print $NF}' awk.txt     
021-11111111
021-22222222
021-33333333
ShangHai
打印倒数第二列:
[root@haocheng ~]# awk '{print $(NF-1)}' awk.txt 
30
25
35
021-44444444

5、截取字符串

可以使用substr()函数对指定域截取字符串。substr(指定域,第一个开始字符的位置,第二个结束的位置)其中第二个结束的位置可以为空,这样默认输出到该域的最后一个字符

输出awk.txt文件第一个域的第六个字符到最后一个字符的内容:
[root@haocheng ~]# cat awk.txt |awk '{print substr($1,6)}'
wang
yang
chen
gong

6、确定字符串的长度

使用内部函数length可以确定字符串的长度。

[root@haocheng ~]# cat awk.txt |awk '{print $0}'
john.wang  Male   30 021-11111111
lucy.yang  Female 25 021-22222222
jack.chen  Male   35 021-33333333
lily.gong  Female 20 021-44444444  ShangHai
[root@haocheng ~]# cat awk.txt |awk '{print length}'        
33
33
33
43

7、使用awk求列和

结构化的数据在系统中是随处可见的,比如用ls -l命令得到的输出、各类系统的日志等。在日常工作中,经常有将其中的数据进行相加的需求。

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

推荐阅读更多精彩内容

  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,488评论 0 4
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,022评论 2 34
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,149评论 2 25
  • awk: grep,sed,awk grep:文本过滤 sed:文本编辑 awk:文本格式化工具; 1 什么是aw...
    木林森阅读 1,708评论 0 16
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,016评论 0 0