初识awk

1.awk简介

awk本身是一种编程语言,支持条件判断、数组和循环等,很高大上,但是我们最常用的是它的文本分析功能,通过查看/usr/bin/awk可以看到它链接到gawk,所以我们使用的实际上gawk

2.awk的基本格式

awk  [-F field-separator]  'BEGIN { } {command1;command2} END{ } ' filename(s)

1)-F:指定域的分隔符,默认为空格,分隔符可以为逗号、冒号、制表符等

2)' '单引号,引用命令行

3)BEGIN:初始化代码块,在处理每一行数据前先执行该处,主要是进行全局变量的引用和FS分隔符的设定

4)commands:命令代码块,可以为多个命令,之间用分号分开

5)END:结尾代码块,每一行数据处理完之后执行该处,主要是对数据进行统计计算或者打印一些消息

3.awk的处理方式

awk是逐行处理,也就是先处理文本文件的第一行数据,按照指定分隔符和预设命令进行处理,如果没有指定分隔符,默认为空格分割,处理完第一行之后依次处理下一行,直到所有的数据处理完成,awk以识别"换行符\n"为一行的结束标志

4.awk的入门

[rhino@promote ~]$ cat 11.log 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
1)rhino@promote ~]$ awk -F ':' '{print $1}' 11.log 
root
bin

2)[rhino@promote ~]$ awk -F ':' 'BEGIN {print "cc","dd"}{print $1} END {print "good"}' 11.log 
cc dd
root
bin
good

awk命令先处理初始化BEGIN部分的命令,然后处理文件操作命令,待所有行命令处理完成后再执行END命令,$1代表第一个经过分隔符分割

5.awk的内置变量

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

1)

[rhino@promote ~]$ awk -F ':' '{print "filename:" FILENAME,"linenumber:"NR,"columns:"NF,"linecontent:"$0}' /etc/passwd|head -2
filename:/etc/passwd linenumber:1 columns:7 linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd linenumber:2 columns:7 linecontent:bin:x:1:1:bin:/bin:/sbin/nologin

2)

[rhino@promote ~]$ awk -F ':' '{print $NF}' /etc/passwd |head -2
/bin/bash
/sbin/nologin

【说明:】

1)字符串需要用双引号,内置变量不用$号引用,$0代表整条完整记录,FILENAME代表流览的文件名,NF代表每一行分割后的域的个数或者说列数,NR代表浏览的行数或者记录数,$1代表第一个域,$2代表第二个域,依次类推

2)从上面的例子中可以看出NF和$NF是完全不同的,前者代表被分隔符分割后的域的个数或者列数;而后者代表被分割后的最后一个域值

6.格式化输出

1)输出值之间以冒号(:)进行分割

[rhino@promote ~]$ awk -F ':' '{print $1":"$NF}' /etc/passwd |head -2
root:/bin/bash
bin:/sbin/nologin

2)输出值之间以TAB键进行分割

[rhino@promote ~]$ awk -F ':' '{print $1"\t"$NF}' /etc/passwd |head -2
root /bin/bash
bin /sbin/nologin

3)进行字符串拼接

[rhino@promote ~]$ awk -F ':' '{print "filename:" FILENAME,"linenumber:"NR,"columns:"NF,"linecontent:"$0}' /etc/passwd|head -2
filename:/etc/passwd linenumber:1 columns:7 linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd linenumber:2 columns:7 linecontent:bin:x:1:1:bin:/bin:/sbin/nologin

内置变量FILENAME不需要用$符号引用,添加的字符串需要用双引号(""),像$0这种的外面不能出现引号,否则会被视为字符串而打印出$0而不是引用的值了,如

[rhino@promote ~]$ awk -F ':' '{print "$0"}' /etc/passwd |head -2
$0
$0

4)多个域进行输出时,如无特殊要求需要使用逗号(,)隔开,否则输出结果各个域值都会连在一起,如

[rhino@promote ~]$ awk -F ':' '{print $1,$2}' /etc/passwd |head -2
root x
bin x
[rhino@promote ~]$ awk -F ':' '{print $1$2}' /etc/passwd |head -2
rootx
binx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值