linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母。
作用:处理文本文件。
awk的特色是可以对行和列进行操作,输入man awk可以查看awk手册,下面将主要以例子来学习awk语言。
语法:
mawk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...]
mawk [-W option] [-F value] [-v var=value] [-f program-file] [--] [file ...]
参数-实例:
1、初识awk
截取top命令部分内容,拷贝到test.txt里:
amosli@amosli-pc:~/learn/awk$ cat test.txt
root 200m 49m 11m S 1.3 :43.91 Xorg
amosli 534m 21m 12m S 0.5 :14.75 gnome-terminal
mongodb 623m 15m S 0.4 :41.17 mongod
amosli 1005m 125m 17m S 3.2 :48.61 chrome
root S 0.0 :00.98 kworker/:
amosli R 0.0 :00.11 top
amosli 686m S 0.2 :10.11 hud-service
amosli 419m 10m S 0.3 :00.11 telepathy-indic
root S 0.0 :03.30 kworker/:
root S 0.1 :00.70 init
root S 0.0 :00.00 kthreadd
root S 0.0 :00.92 ksoftirqd/
root RT S 0.0 :01.13 migration/
root RT S 0.0 :00.14 watchdog/
root RT S 0.0 :02.16 migration/
下面打印第2列的内容,注意pattern里是单引号.
amosli@amosli-pc:~/learn/awk$ awk '{print $2}' test.txt
root
amosli
mongodb
amosli
root
amosli
amosli
amosli
root
root
root
root
root
root
root
$0表示打印出来全部,$n,n>0时表示打印第n列。
2、拆解awk语句块
先看例子:
amosli@amosli-pc:~/learn/awk$ awk 'BEGIN { i=0 } {i++} END { print i } ' test.txt
ok,是不是用点不太懂?看不太懂没关系,下面拆解开来,一个awk脚本通常分为3部分:BEGIN 语句块、END语句块和能够使用模式匹配的通用语句块。这三个部分是可选的,它们中的任何一个部分都可以不出现在脚本中。脚本通常包含在单引号或者双引号里。其通用模式结构如下所示:
awk ' BEGIN { print "start" } pattern { commands } END { print "end" }' file
下面是实际常用的语法格式:
awk 'BEGIN { statements } { statements } END { end statements }' filename
awk的工作原理:
(1)、执行BEGIN { commands }语句块中的语句。
(2)、从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。
(3)、当读至输入流(input stream)末尾时,执行END { commands } 语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块。
END语句块在awk从输入流中读取完所有的行之后即被执行。这个同样是可选的。
最重要的部分就是pattern语句块中的通用命令。这个同样是可选的。如果不提供该语句块,则默认执行的是{ print },即打印每一个读取到的行。awk对于读取到的每一行,都会执行这个语句块.例:
amosli@amosli-pc:~/learn/awk$ echo -e "line1\nline2" | awk 'BEGIN { print "now start" } { print } END { print "this is end" } '
now start
line1
line2
this is end
这里首先执行的是BEGIN { print "now start" },然后开始执行默认打印line1\nline2 ,最后读完所有的行之后开始执行END语句块{ print "this is end "}
同样可以将BEGIN和END都去掉,只使用默认的打印方式:
amosli@amosli-pc:~/learn/awk$ echo -e "line1\nline2" | awk '{ print }'
line1
line2
这种方式和例1的方式则是相同的。学完这两个例子,基本上就明白了awk到底咋用的了,其格式应该是什么样,即已经入门了。
3、关于print
这里的print和C语言中的基本上差别不大,但C语言我早已经忘的差不多了。还是来看看awk里的print是怎么使用的吧?
有两点需要注意:
1、当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符。
2、在awk 的print语句中,双引号是被当做拼接操作符的(concatenation operator) ,所以模式匹配最外层尽量使用单引号.
关于1,举例说明:
amosli@amosli-pc:~/learn/awk$ echo | awk ' { var1="v1";var2="v2"; print var1,var2 } '
v1 v2
这里print var1,var2用的是逗号进行分隔的,所以打印时是以空格作为定界符的。那如果不以逗号进行分隔呢?
amosli@amosli-pc:~/learn/awk$ echo | awk ' { var1="v1";var2="v2"; print var1 var2 } '
v1v2
打印的时候v1v2贴到一块去了。如果再用其它符号进行分隔,打印会出错(我试了| : \ /)。
关于2,举例说明:
amosli@amosli-pc:~/learn/awk$ echo | awk ' { var1="v1";var2="v2"; print var1"+" var2 } '
v1+v2
这里使用了"+",双引号果然起到了连接的作用。
4、特殊变量
NR:表示记录数量(number of records),表示当前行号,和cat命令中-n 意思一样。
NF:表示字段数量(number of fields),表示当前行的字段数量
$0,$1,$2,$n.... 前面已经说过,$0表示输出所有文本内容,$n表示第n行数据。
举例说明NR和NF:
下面是NF
amosli@amosli-pc:~/learn/awk$ cat test.txt | awk '{ print NF }'
每一行都有12个字段,"1067 root 20 0 200m 49m 11m S 2 1.3 4:43.91 Xorg",这里字段的定义不是字母数量,而是由空格隔开产生的一列为一个字段,
也可以理解为列数;
下面是NR:
amosli@amosli-pc:~/learn/awk$ cat test.txt | awk '{ print NR }'
一共有15行。
5、将外部变量值传递给awk,-v参数
amosli@amosli-pc:~/learn/awk$ var=;
amosli@amosli-pc:~/learn/awk$ echo | awk -v vr=$var '{ print vr }'
首先,定义一个var变量,赋值99;然后,将var变量的值在外部再赋给vr;最后打印出vr。
其实就是借值传值。但是当要传递很多参数时就蛋疼了,太麻烦了。下面介绍一个相对简便的方法进行外部传值。
amosli@amosli-pc:~/learn/awk$ echo | awk '{ print y1,y2 }' y1=$v1 y2=$v2
这里没有使用-v参数,只是将y1=$v1传值放到后面去了,其实就是将y1=$v1 y2=$v2 当成file了 类似 awk '{print }' file。
6、使用awk进行过滤
1)只显示前四行,行数小于5,和head test.txt -n 4 效果一样。
amosli@amosli-pc:~/learn/awk$ awk 'NR<5' test.txt
root 200m 49m 11m S 1.3 :43.91 Xorg
amosli 534m 21m 12m S 0.5 :14.75 gnome-terminal
mongodb 623m 15m S 0.4 :41.17 mongod
amosli 1005m 125m 17m S 3.2 :48.61 chrome
2)只显示3-5行内容.
amosli@amosli-pc:~/learn/awk$ awk 'NR==3,NR==5' test.txt
mongodb 623m 15m S 0.4 :41.17 mongod
amosli 1005m 125m 17m S 3.2 :48.61 chrome
root S 0.0 :00.98 kworker/:
3)只显示包含amos的行
amosli@amosli-pc:~/learn/awk$ awk '/amos/' test.txt
amosli 534m 21m 12m S 0.5 :14.75 gnome-terminal
amosli 1005m 125m 17m S 3.2 :48.61 chrome
amosli R 0.0 :00.11 top
amosli 686m S 0.2 :10.11 hud-service
amosli 419m 10m S 0.3 :00.11 telepathy-indic
7、awk的内建函数
toupper(string),将字符串转为大写
amosli@amosli-pc:~/learn/awk$ awk ' { print toupper("yes") }' YES
length,长度
amosli@amosli-pc:~/learn/awk$ awk ' { print length }' test.txt
sqrt()取平方根
amosli@amosli-pc:~/learn/awk$ awk '{ print sqrt(4)}'
awk的功能非常强大,知识点也非常多,网上资料也非常多,这里主要学习的是linux shell脚本攻略第1版内容,awk的内容还需要更进一步的学习!
总结下: 这将是近半个月来linux学习的最后一篇文章了,shell脚本入门容易,但是,学过就忘,抽空一定要将这20篇内容再回顾一遍。shell功能非常强大,主要在于命令太多,灵活性较高,每个命令都有很多地方去深究。想要真正掌握所学命令那就是反复的用,不用,学了也没意义了。我的编程最大的心得就是实践,动手实践,人都是眼高手低,一定要多动手!
awk进一步学习参考资料:
1、awk学习笔记
2、awk英文文档
3、awk简明教程
linux shell 脚本攻略学习20--awk命令入门详解的更多相关文章
- linux shell 脚本攻略学习17--正则表达式入门
正则表达式(也称为“regex”或“regexp”)是一种用来描述文本模式的特殊语法.在 Linux 系统上,正则表达式通常被用来查找文本的模式,以及对文本流执行“搜索-替换”操作以及其它功能. 正则 ...
- Linux Shell脚本攻略学习总结:一
终端打印 终端打印的常用命令有两个:echo和print 首先,我先介绍echo 1.echo echo这个命令接受三种形式的参数,实例如下: echo "Hello World" ...
- linux shell 脚本攻略学习12--文件权限详解,chmod命令详解,chown命令详解,chattr命令详解
文件权限详解 一.chmod命令详解 文件权限和所有权是Unix/Linux文件系统最显著的特征之一.linux中的每一个文件都与多种权限类型相关联,在这些权限中主要分类为3种: 用户(User)是文 ...
- linux shell 脚本攻略学习16--wc命令详解,tree命令详解
在文本处理的工作中,统计文件的行数,单词数和字符数非常有用.而对于开发人员本身来说,统计LOC(line of code ,代码行数)是一件重要的工作.linux中有什么命令可以帮助我们做统计呢?没错 ...
- linux shell 脚本攻略学习14--head命令详解,tail命令详解
当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相反,我们可能只需要看文件的一小部分地内容(例如文件的前十行和后十行),我们也有可能需要打印出来前n行或后n行,也有可能打印除 ...
- linux shell 脚本攻略学习13--file命令详解,diff命令详解
一.file命令详解 find命令可以通过查看文件内容来找出特定类型的文件,在UNIX/ Linux系统中,文件类型并不是由文件扩展名来决定的(windows中却正是这么做的),file命令的目的是从 ...
- linux shell 脚本攻略学习11--mkdir和touch命令详解
一.创建目录(mkdir命令详解) amosli@amosli-pc:~/learn$ mkdir dir amosli@amosli-pc:~/learn/dir$ mkdir folder amo ...
- linux shell 脚本攻略学习9--rename命令详解
rename命令详解: 对文件重命名是常用的操作之一,一般对单个文件的重命名用mv命令,如: amosli@amosli-pc:~/learn/example$ ls abc.txt amosli@a ...
- linux shell 脚本攻略学习8---md5校验,sort排序,uniq命令详解
一.校验与核实 目前最为出名的校验技术是md5sum和sha1sum,它们对文件内容使用相应的算法来生成校验和. 举例: amosli@amosli-pc:~/learn$ md5sum text.t ...
随机推荐
- 使用 AutoMapper 映射 IDataReader、DataSet、DataTable 到实体类
AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...
- Centos安装FTP服务器和配置
安装 yum install vsftpd 启动/重启/关闭 /sbin/service vsftpd start /sbin/service vsftpd restart /sbin/service ...
- jdbc操作数据库并自动获取字段类型
//获取改功能编码的关联功能 public void getLinkdb(String gnbianma){ PreparedStatement pstmt = null; ResultSet rs ...
- 离线LCA学习
题目1 : 近期公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 上上回说到,小Hi和小Ho用很拙劣--或者说粗糙的手段山寨出了一个奇妙的站点,这个站点能 ...
- 关于 URL 编码及 JavaScript 编码函数【转载+整理】
原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 本文内容 引入 环境 测试 JavaScript 编码函数 引入 URL ...
- 【转】java并发编程系列之ReadWriteLock读写锁的使用
前面我们讲解了Lock的使用,下面我们来讲解一下ReadWriteLock锁的使用,顾明思义,读写锁在读的时候,上读锁,在写的时候,上写锁,这样就很巧妙的解决synchronized的一个性能问题:读 ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
- Live555实战之交叉编译live555共享库
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 能够通过这个链接获得最新的live555源代码:Live555源代码下载 Live555 是一个为 ...
- nodejs直接调用grunt(非调用批处理)
在windows下,我们做js构建工作,都习惯安装grunt-cli,只需要命令行grunt...一切构建工作都自动完成了.这已经是很完美的情况了,不过最近要做一个服务器版的自动化构建系统,在node ...
- Kettle实现数据库迁移
Kettle实现数据库迁移 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为实现数据库的迁移,即 ...