笔记 | awk 的知识点

awk

awk是一种处理文本文件的语言,用于Linux下对文本和数据进行处理。数据可以是标准输入、一个或多个文件、其他命令的输出。方式为逐行扫描,从第一行到最后一行,寻找到匹配特定模式的行进行操作。

命令格式和常用选项

命令格式

awk [options] ‘/pattern/{action}’ input-file
awk [options] -f myscript.awk input-file

常用选项
  • -F 指定输入文件分隔符
  • -f 从脚本文件中读取awk命令
  • -v 赋值一个用户定义变量

模式

awk脚本是由模式和操作组成,模式可以是以下的几种:

  • 正则表达式
  • 关系表达式
  • 模式匹配表达式
  • BEGIN
  • END
awk 'BEGIN {Fs = ":"; print "----header----"}/mail/{print $1} END{print “----footer----”}' /etc/passwd
  #搜索包含关键字mail的行,并打印第一个字段

打印命令
awk '{print}' e
mployee.txt 传递变量 “ $字段序号 ” 作为print的参数

awk -F ',' '{print $2}' employee.txt
指定 , 为分隔符

模式匹配
awk -F ',' '/Manager/{print $2,$3}' employee.txt

awk 内置变量

FS - 输入字段分隔符 在BEGIN区域使用
OFS 输出字符分隔符
两种方式:
awk -F ',' '{print $2,":",$3}' employee.txt
awk -F ',' 'BEGIN{OFS=":"}{print $2,":",$3}' employee.txt
RS 记录分隔符
ORS 输出记录分隔符
NR 记录序号 条数
​ 开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数 Number of Record
NF 字段总数 Number of Field

FILENAME 当前处理的文件名
FNR 文件中的NR

变量操作符

变量
一元操作符 + 取正(返回数字本身) - 取反 ++ 自增 --自减
算术操作符
awk 'NR % 2 == 0' filename 取偶数
字符串操作符 “ ”
赋值操作符
比较操作符 && 且 ||或
正则表达式操作符 ~ 匹配 !~ 不匹配

分支和循环

  • if 结构
    ​ if (conditional-expression)
    ​ action
    多条 ;分割
    awk '{if (NR % 2 ==0) ORS='\n';else ORS = ',';print}' filename
  • while 循环
    ​ while (condition)
    ​ Actions

  • do - while 循环
    进入控制判断的循环结构

  • for循环
    for (initialization;condition;increment/decrement)
    for循环一开始就执行 init 然后检查 con 如果为True,执行 action 然后 incre or decre

其他

printf
printf(format, value1, value2, ..., valuen)
可以灵活简单以你期望的格式输出结果
\n 换行 \t制表符 \v垂直制表符 \b退格 \r回车符 \f换页

格式化字符
s 字符串
c 单个字符串
d 数值
e 指数
f 浮点数
g 根据值决定使用e或f中较短的输出
o 八进制
x 十六进制
% 百分号

打印指定宽度(左对齐)
awk 'BEGIN {printf "%6s\n", "Good Boy!"}'

内置函数

内置函数
int(n) 整数
log(n) 返回给定参数的自然对数
sqrt() 正平方根
三角函数 sin() cos() atan2(m,n)

常用字符串函数

  • index 函数
  • length 函数 s 的长度
  • split 函数
  • substr 函数 substr (input-string,location,length) 子串 开始位置 总长度
    对指定的正则表达式进行替换
  • tolower(s) 转成小写
  • toupper(s) 转成大写
  • sub(f,r,s) 根据正则f 从r中提取数据到s

使用awk进行计算

关联数组

实现类似操作
cat filename cut -f '2' | sort | uniq -c | sort
这样的操作
awk '$1 ~ /Chr1/{feature[$3] += 1};END {for (k in feature) print k "\t" featrue[k]}' filename

练习

输入file.txt内容:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300

题目为:

  1. 显示所有电话号码
  2. 显示Dan的电话号码
  3. 显示Susan的名字和电话号码
  4. 显示所有以D开头的姓
  5. 显示所有以一个C或E开头的名
  6. 显示所有只有四个字符的名
  7. 显示所有区号为916的人名
  8. 显示Mike的捐款.显示每个值时都有以开头.如250100175
  9. 显示姓,其后跟一个逗号和名,如Jody,Savage
  10. 显示第三列小于200的姓名
# 输入file.txt文件 
# 这个文件是以 : 分割
# Vim编辑器,进入后按i,粘贴内容,按esc,输入 :wq 保存文件
$ vim file.txt

$ awk -F : '{print $2}' file.txt 

# 精确匹配
$ awk -F : '$1~/Dan/{print $2}' file.txt
# 输出定义分隔符
$ awk -F: '$1~/Susan/{print$1":"$2}' file.txt 
# ^行的开头  $行的结尾
$ awk '$1~/^D/{print $1}' file.txt

# 模糊匹配   或 || 且&&
$ awk -F: '$1~/^[C||E]/{print $1}' file.txt |awk '{print $2}'
# 变量
$ awk 'length($1)=="4"{print $1}' file.txt 

# 替换 这里用sed也可以
$ awk -F"[ :]" '$3~/916/{print $1" "$2}' file.txt 

# 定义输出形式 
# 还有printf(format, value1, value2, ..., valuen)
$ awk -F:  '$1~/Mike/{print "$"$3" ""$"$4" ""$"$5}' file.txt 

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

推荐阅读更多精彩内容

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