Linux学习系列 --awk命令学习
关于awk命令一直想学一篇文章,无意中发现awk命令学习这篇文章总结的很好,于是转载至此。
awk简介
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。
使用方法
1 |
|
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
awk 的原理
通过一个简短的命令,我们来了解其工作原理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
你将会见到/etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。
所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同。
现在,解释{ print }代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
再次说明, awk 对输入文件中的每一行都执行这个脚本。
1 2 3 4 |
|
-F参数:指定分隔符,可指定一个或多个
print 后面做字符串的拼接
下面通过几实例来了解下awk的工作原理:
实例一:只查看test.txt文件(100行)内第20到第30行的内容(企业面试)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
实例二:已知test.txt文件内容为:
1 2 |
|
请从该文件中过滤出'Poe'字符串与33794712,最后输出的结果为:Poe 33794712
1 2 |
|
BEGIN 和 END 模块
通常,对于每个输入行, awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。
因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
实例一:统计/etc/passwd的账户人数
1 2 3 4 |
|
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
1 2 3 4 5 |
|
实例二:统计某个文件夹下的文件占用的字节数
1 2 |
|
如果以M为单位显示:
1 2 |
|
awk运算符
awk 赋值运算符:a+5;等价于: a=a+5;其他同类
1 2 |
|
awk逻辑运算符:
1 2 |
|
判断表达式 a>2&&b>1为真还是为假,后面的表达式同理
awk正则运算符:
1 2 |
|
1 2 |
|
关系运算符:
如: > < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字 才转为数值比较。字符串比较:按照ascii码顺序比较。
1 2 3 4 5 |
|
awk 算术运算符:
说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。
1 2 3 4 |
|
这里的a++ , ++a与javascript语言一样:a++是先赋值加++;++a是先++再赋值
三目运算符 ?:
1 2 3 4 |
|
常用 awk 内置变量
注:内置变量很多,参阅相关资料
字段分隔符 FS
FS="\t" 一个或多个 Tab 分隔
1 2 3 4 |
|
FS="[[:space:]+]" 一个或多个空白空格,默认的
1 2 3 4 5 6 |
|
FS="[" ":]+" 以一个或多个空格或:分隔
1 2 3 4 |
|
字段数量 NF
1 2 3 4 5 |
|
记录数量 NR
1 2 |
|
RS 记录分隔符变量
将 FS 设置成"\n"告诉 awk 每个字段都占据一行。通过将 RS 设置成"",还会告诉 awk每个地址记录都由空白行分隔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
OFS 输出字段分隔符
1 2 3 4 5 6 7 8 9 |
|
ORS 输出记录分隔符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
awk 正则
正则应用
规则表达式
awk '/REG/{action} ' file,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action 进行处理
1 2 3 4 5 6 7 8 9 |
|
布尔表达式
awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块。
1 2 3 4 |
|
awk 的 if、循环和数组
条件语句
awk 提供了非常好的类似于 C 语言的 if 语句。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
使用 if 语句还可以将代码:
1 |
|
转换成:
1 2 3 4 5 |
|
循环结构
我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。 awk 还有"do...while"循环,它在代码块结尾处对条件求值,而不像标准 while 循环那样在开始处求值。
它类似于其它语言中的"repeat...until"循环。以下是一个示例:
do...while 示例
1 2 3 4 5 |
|
与一般的 while 循环不同,由于在代码块之后对条件求值, "do...while"循环永远都至少执行一次。换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。
for 循环
awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:
1 2 3 |
|
以下是一个简短示例:
1 2 3 |
|
此段代码将打印:
1 2 3 4 |
|
break 和 continue
此外,如同 C 语言一样, awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断:
1 2 3 4 5 |
|
以下是一个只执行十次的循环:
1 2 3 4 5 6 7 8 9 |
|
这里, break 语句用于“逃出”最深层的循环。 "break"使循环立即终止,并继续执行循环代码块后面的语句。
continue 语句补充了 break,其作用如下:
1 2 3 4 5 6 7 8 9 10 11 |
|
这段代码打印"iteration1"到"iteration21", "iteration4"除外。如果迭代等于 4,则增加 x并调用 continue 语句,该语句立即使 awk 开始执行下一个循环迭代,而不执行代码块的其余部分。如同 break 一样,
continue 语句适合各种 awk 迭代循环。在 for 循环主体中使用时, continue 将使循环控制变量自动增加。以下是一个等价循环:
1 2 3 4 5 6 |
|
在while 循环中时,在调用 continue 之前没有必要增加 x,因为 for 循环会自动增加 x。
数组
AWK 中的数组都是关联数组,数字索引也会转变为字符串索引
1 2 3 4 5 6 7 8 9 10 11 |
|
for…in 输出,因为数组是关联数组,默认是无序的。所以通过 for…in 得到是无序的数组。如果需要得到有序数组,需要通过下标获得。
数组的典型应用
用 awk 中查看服务器连接状态并汇总
1 2 3 |
|
统计 web 日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总
1 2 3 4 5 6 7 8 9 |
|
常用字符串函数
字符串函数的应用
替换
1 2 3 |
|
查找
1 2 |
|
匹配查找
1 2 |
|
截取
1 2 |
|
分割
1 2 3 4 |
|
Linux学习系列 --awk命令学习相关推荐
- linux之awk命令学习笔记
Linux之awk命令学习笔记 前言 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, ...
- linux shell sed awk 命令(2)-awk
linux shell sed awk 命令(2)-awk awk语法格式: awk [选项] -f program-file [ -- ] file ... 选项: -F fs, --field-s ...
- 深度学习系列:深度学习在腾讯的平台化和应用实践
深度学习系列:深度学习在腾讯的平台化和应用实践(一) 莫扎特 2015-01-04 6:05:13 大数据技术 评论(0) 深度学习是近年机器学习领域的重大突破,有着广泛的应用前景.随着Google公 ...
- [jQuery学习系列四 ]4-Jquery学习四-事件操作
[jQuery学习系列四 ]4-Jquery学习四-事件操作 前言: 今天看知乎偶然看到中国有哪些类似于TED的节目, 回答中的一些推荐我给记录下来了, 顺便也在这里贴一下: 一席 云集 听道 推酷 ...
- linux下awk命令详解,Linux文件处理awk命令-linux awk命令详解-嗨客网
Linux文件处理awk命令详解教程 Linux awk命令说明 awk 是一个强大的文本分析工具,相对于 awk 有 3 个不同版本: awk.nawk 和 gawk,未作特别说明,一般指 gawk ...
- linux三剑客之awk命令详解
linux三剑客之awk命令详解 awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件.数据排序.计算以及生成报表等等.awk工具主要用于格式化输出,可以用类似于处理表格的方式处理文 ...
- [Linux]-基础知识及命令学习
前言 菜鸟教程之Linux命令大全 平时我们说的 Linux 其实指的是 Linux内核,而不同厂商在这个内核的基础上二次开发,完善了软件,程序等,出现了不同的发行版,也就是我们使用的 Linux 操 ...
- 【深度学习系列】迁移学习Transfer Learning
在前面的文章中,我们通常是拿到一个任务,譬如图像分类.识别等,搜集好数据后就开始直接用模型进行训练,但是现实情况中,由于设备的局限性.时间的紧迫性等导致我们无法从头开始训练,迭代一两百万次来收敛模型, ...
- 【深度学习系列】——深度学习简介
这是深度学习系列的第一篇文章,欢迎关注原创公众号 [计算机视觉联盟],第一时间阅读我的原创!回复 [西瓜书手推笔记] 还可获取我的机器学习纯手推笔记! 直达笔记地址:机器学习手推笔记(GitHub地址 ...
- ASP.NET MVC 3.0学习系列文章(开始学习MVC)
Visual Studio 11安装ASP.NET MVC4体验 Nic Pei 2011-09-27 23:15 阅读:2891 评论:11 微软build大会.net平台大事汇总 Nic Pe ...
最新文章
- 如何以编程方式退出WPF应用程序?
- 在CRM定制中常用的Javascript
- 虚拟机中安装GHO文件配置说明
- linux挂载新硬盘,开机自动挂载
- 网状结构的解藕-中介者模式
- varnish缓存服务器构建疑问
- leetcode-231-Power of Two
- centos7安装postman
- 【渝粤教育】国家开放大学2018年秋季 2720T实用管理基础 参考试题
- VScode中文注释乱码问题解决
- mysql的简单用法_mysql简单用法,以及增删改查语句
- Linux中history命令增加时间显示
- 毕业找前端开发工作被拒没经验怎么办?
- ImageWatch无法显示图像
- C和C++编程和学习文档
- The service cannot be activated because it does not support ASP.NET compatibility
- ARGB与RGB、RGBA的区别
- 【牛客 错题集】Linux系统方面错题合集
- 游戏服务器中pvp、pve、rppvp、ffa-pvp的含义
- 【WEB安全自学】第一节 WEB基础环境搭建