11 shell命令之awk
awk,作为一个惊天地泣鬼神的命令.分分钟就可以帮助我们解决看似很复杂困难的问题.
awk, 顾名思义(我好屌).就是处理文本行的一个工具.开个玩笑,这个命令完全无法顾名思义.据说是三个开发者的名字的首字母.老外简直丧心病狂,这种名字都敢叫.
awk [option] ‘pattern{action}‘ filename
这里注意一个细节,option是可选的.另外就是,可能我们学习sed的时候,双引号单引号都可以,但是在awk,只能使用单引号.
option可选的有 :
-f 指定pattern文件.也就是说可以把一些pattern写到一个文件里面,然后用-f指定,这应该就是所谓的awk编程.
-F 指定分隔符.可以一次指定多个.如果没有指定,默认以空白字符做为分隔符.
-v 初始化awk变量.这应该是使用外部变量的一种方式,类似于c语言的形参,虽然引入了变量,但是没有办法传出.
pattern{action}
这里有两个特殊的pattern, BEGIN和END.我们知道awk是处理文本行的命令,所以普通的pattern{action}的执行次数就是当前指定文件的行数.而BEGIN和END,只执行一次,BEGIN在处理所有的行之前执行.END在处理完成以后执行.
pattern : 即定义一个规则,只要在一行的文字中,符合这个规则,就执行{action}, 如果pattern是空,那么默认执行.
1. NR < 5 条件满足NR小于5的行都将被处理
2. NR == 1, NR==4 将处理第一行到第四行
3. /awk/ 处理包含awk的行
4. !/awk/ 处理不包含awk的行
action: 即对文本行执行什么样的操作.
功能十分强大,支持if,while, for流程控制语句.
好紧张,这么屌的一个命令,感觉会被我写的一塌糊涂.容我去借鉴以下...
在单引号里面,awk分别定义了自己的内置变量和内置函数.
内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0变量是指整条记录。
$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
内置函数(部分):
length(string) 取string的长度.
substr(string, start-position, end-position) 取字符串start-position,end-position中间的子串,并返回这个子串
print 打印记录
index(string, search-string) 返回search-string出现在string中的位置
split(string, array, delimeter) 以delimeter分割string,将得到的内容存放在array中.
sub(regex, replacement, string) 将regex正则表达式对应在string中的子串替换成replacement
gsub(regex, replacement-str, string) 熟悉的g, global的意思,也就是所有匹配的都替换.
match(regex, string) 如果不匹配返回0, 若匹配则返回非0.
下面还是结合使用来了解awk吧.我尽量把上面讲到的场景使用一下:
1. 指定多个分隔符场景,匹配第三列是linux的文本行并打印一二行:
2. 使用split分割文本:
3. 有个命令叫tac,看着很别扭对吧.别扭就对了.完全不能用单词对应.倒过来是cat,没错,这个命令就是把文本行反过来打印.用awk试试.
4. 处理1,2行的数据,并打印
ok,虽然介绍的还是不全面,但是相信可以帮助到一部分同学了.这个命令实在是太复杂了.能够写出一篇博文我感觉很欣慰.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。