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,虽然介绍的还是不全面,但是相信可以帮助到一部分同学了.这个命令实在是太复杂了.能够写出一篇博文我感觉很欣慰.技术分享


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。