AWK 使用总结

原文地址

awk 是处理文本的工具,Mac 自带这个程序。

适合文本比较复杂的格式化数据。

基本语法

awk [可选参数] [模式-动作] 文件名

awk 会一行一行的处理文件里面的内容。

可选参数说明:
  • -F 指定分隔符, 默认是以空格作为分隔符;
  • -f 从脚本文件中读取 awk 命令;

可选参数可以省略。

模式-动作 说明:

其中模式可以有 0 个或者多个,每一行的内容会依次测试每个模式,所有的模式都匹配之后,会执行相应的动作。

每个模式或者动作里面可以使用 awk 中的 运算符内置变量内置函数等。

假设有一个 emp.data 文件, 里面内容是部分 NBA 球员的姓名,身高, 年龄的数据:

Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27
  1. 没有模式

输出每一行的内容, 使用如下命令:

awk '{print $0}' emp.data 

结果如下:

Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27

输出第一列的内容, 使用如下命令:

awk '{print $1}' emp.data

结果如下:

Stephen
Kevin
LeBron
Russell
Kyrie

发现第一列的姓名没有显示完全, 因为 awk 默认是以空格作为分隔符的,如果需要显示完全需要我们显示的指定分隔符。

输出每个人的名字, 使用如下命令:

awk -F "," '{print $1}' emp.data

结果如下:

Stephen Curry
Kevin Durant
LeBron James
Russell Westbrook
Kyrie Lrving

输出每个球员名字的小写字母, 使用如下命令:

awk -F "," ' {print tolower($1)}' emp.data

结果如下:

stephen curry
kevin durant
lebron james
russell westbrook
kyrie lrving
  1. 单个模式

输出年龄大于30岁的球员的姓名和身高, 使用如下命令:

awk -F "," '$3 > 30 {print $1, $2}' emp.data

结果如下:

Stephen Curry  1.91
LeBron James  2.03

输出姓名大于12个字符(含空格)的球员信息, 使用如下命令:

awk -F "," 'length($1) > 12 {print $0}' emp.data

结果如下:

Stephen Curry, 1.91, 31
Russell Westbrook, 1.92, 30
  1. 多个模式

输出年龄大于30岁,并且身高大于2米的球员的信息,使用如下命令:

awk -F "," '$3 > 30 &&  $2 > 2.00 {print $0}' emp.data

结果如下:

LeBron James, 2.03, 34

awk 脚本

语法结构如下:

BEGIN {放置的是执行前的语句}
{处理每一行时要执行的语句}
END {处理完所有的行后要执行的语句}

其中 BEGINEND 都是可选的。

统计所有球员的总身高,使用如下命令:

awk -F "," '{sum+=$2} END {print sum}' emp.data

其中 sum 为自定义的变量, $2 为内置变量,表示第二列的值。

结果如下:

9.82

运算符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

变量

$ + 数字 表示某个字段: $1 表示第一个字段, $2 表示第二个字段, $3 表示第三个字段, … , $0 表示一整行。

变量 NF 表示当前行有多少个字段。

变量 NR 表示当前是第几行。

其他常用变量:

  • FILENAME:当前文件名
  • FS:字段分隔符,默认是空格和制表符。
  • RS:行分隔符,用于分割每一行,默认是换行符。
  • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  • OFMT:数字输出的格式,默认为%.6g

函数

常用的函数如下:

  • tolower():字符转为小写。
  • toupper(): 字符串转为大写。
  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

awk 内置函数的完整列表,可以查看手册

参考

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

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,214评论 2 25
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,564评论 0 4
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 2,120评论 1 6
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,456评论 0 9