awk简易教程

导读

相对于 sed 常常作用于一整行的处理,awk 则比较倾向于将一行分成数个“字段”来处理。
本文翻译自 simple awk tutorial
习惯了英文者,可自行前往阅读。

接下来的例子中会使用到 employee.txt 文件。
$ cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy Manager Sales $6,000

awk是做什么的?

最简单的 awk 用法是基于列的数据处理,比如说表格,使用标准输入将数据导入。变量 $1, $2...表示当前输入行的第一列,第二列...。打印出一个文件的第二列,你可能会使用下面的 awk 脚本:

awk < file '{ print $2 }'

这意味着“每一行,打印出第二个字段”

例如:
$awk < employee.txt '{ print $2 }' Thomas Jason Raj Nisha Randy

为了打印出第二列和第三列,可以

awk < file '{ print $2, $3 }'

分隔符

awk 将行分隔为字段,默认会使用空白符(whitespace)来分隔,也就是空格符(spaces)或制表符(tabs)。 你可以使用 -F 选项来指定其它字符为分隔符。例如,为了打印出当前系统中所有用户的主目录,你可以

$awk < /etc/passwd -F: '{ print $6 }'

passwd 的文件内容以冒号来分隔,主目录在第六个字段。

运算

awk是一种弱类型语言;变量既可以是字符串,也可以是数字,这取决于你怎样引用它们。所有的数字都是浮点型的。所以,为了实现华氏温度与摄氏温度之间的转换,你可以

awk '{ print ($1-32)*(5/9) }'

标准输入的华氏温度会被转换为摄氏温度,直到遇到 EOF,该 awk 程序停止。

可选的操作符与C基本一样。紧接着的两个字符串表达式(以空格分隔或没有空格),会连接。‘+’ 总是加法。

echo 5 4 | awk '{ print $1 + $2 } 会输出 “9”,然而
echo 5 4 | awk '{ print $1 $2 }' 会输出 “54”,注意
echo 5 4 | awk '{ print $1, $2 }' 会输出 “5 4”。

变量

awk 有一些内置的、自动置值的变量,比如上文提到的$1。其它的内置变量中,适合初学者的,也就是 $0 和 NF 了,前者表示当前输入行,后者表示当前输入行($0)的字段总数。$NF表示当前输入行的最后一个字段。

你可以定义自己的变量,除了 awk 保留的关键词,你可以用任何名字来引用它。变量没有明确赋值的,字符串为“”,数字为0。

例如,下面的代码会打印出每行数字的平均值:

awk '{ tot=0; for (i=1; i <= NF; i++) tot += $i; print tot/NF; }'

使用 $i 去取第 i 个变量的值, for 循环与C语言类似。 tot 在代码的开头作初始化的原因,是这个代码运行于每一个输入行,如若不,当开始运行第二行的时候, tot 将具有第一行结束时的值。

块Block

可能,你仅有一些特殊字段的数字需要单独相加。为了这样做,你需要在结束时打印结果。采用的方法为

awk '{ tot += $1; n += 1; } END { print tot/n }'

注意两个语句块的使用。第二个之前有个 END;意味着一旦所有的输入处理结果,就运行这个语句块。一般,你可以在语句块之前添加各种条件,仅当条件满足时语句块才被执行。也就是,你可以

awk '$1 == 0 { print $2 }'

仅在第一个字段为0时才打印第二个字段。你还可以使用正则表达式来匹配行数据:

awk '/^test/' { print $2 }

如果你没有添加条件,每行数据输入时都会运行块语句。

语句块的特殊条件 BEGIN 和 END,分别运行于输入数据的处理之前和处理之后。

printf

awk 包含了 printf 语句,本质上类似于C语言的 printf。当你想要格式化输出,或者将多种元素整合到一行,可以使用它。(print 暗含增加一个'\n';printf不会)。

比如,移除每一行第一字段

awk '{ for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n"; }'

注意,使用NF迭代所有的字段,显示地使用 printf 输出 '\n'。

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

推荐阅读更多精彩内容

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