简单认识shell脚本awk编辑器


简介

awk是linux的一个强大的命令,具备强大的文本格式化能力,比如对一堆看起来没有什么规律的日志文件,文本文件等,通过awk命令格式化输出为专业的可以做为应用级数据分析的样式。

二、awk工作原理

    逐行读取文本,默认以空格或制表符为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

    sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”,然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。

    在使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"||"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方

三、awk命令格式

awk [选项] '模式或条件 {操作表达式}' 文件名...
awk常用选项
-F后面跟符号,指定列分隔符
-v	后面跟变量,允许使用变量
awk常见内建变量
FS	列分隔符,指定每行文本的字段分隔符(默认为空格和制表符)。与-F 选项作用相同
OFS 输出内容的列分隔符
NF	当前处理行的字段个数
$NF可以表示最后一行
NR	指定当前处理的行的行号
$0	当前处理的行的整行内容
$n	当前处理行的第n个字段
RS	行分隔符,指定航分隔符(默认是换行符"\n"

四、awk命令的使用示例

1.print操作按行输出文本

//1.输出所有内容
[root@localhost1 ~]#awk '{print}' numfile
one
two
three
four
five
six
seven
eight
nine
ten
[root@localhost1 ~]#awk '{print $0}' numfile    #$0代表匹配到的整行
one
two
three
four
five
six
seven
eight
nine
ten
 
//2.指定行,输出1~3行内容
[root@localhost1 ~]#awk 'NR==1,NR==3 {print}' numfile
one
two
three
[root@localhost1 ~]#awk '(NR>=1)&&(NR<=3) {print}' numfile
one
two
three
 
//3.指定的几行,输出第1、3行
[root@localhost1 ~]#awk 'NR==1||NR==3 {print}' numfile
one
three
 
 
//4.输出奇偶行
[root@localhost1 ~]#awk '(NR%2)==0 {print}' numfile
two
four
six
eight
ten
[root@localhost1 ~]#awk '(NR%2)==1 {print}' numfile
one
three
five
seven
nine
 
//5.输出行号
[root@localhost1 ~]#awk '{print NR,$0}' file1
1 one two three
2 four five six
3 seven eight nine
4 ten eleven twelve
 
//6.指定第1行包含o的行。输出行号和内容
[root@localhost1 ~]#awk '$1~"o" {print NR,$0}' file1
1 one two three
2 four five six
 
//7.指定输出包含指定字符串的行
[root@localhost1 ~]#awk '/root/ {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
 
//8.指定输出包含指定正则表达式的行
[root@localhost1 ~]#awk '/^root.*bash$/ {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

2.print操作按字段截取输出文本

//1.指定字段分隔符":",输出每行1,3字段
[root@localhost1 ~]#awk -F ':' '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
...
avahi 70
postfix 89
tcpdump 72
hx 1000
apache 48
zhangsan 1001
lisi 1002
zhaoliu 1003
wangwu 1004
qianqi 1005
zhuba 1006
 
//2.在第1条基础上,限定行范围,第3个字段值小于1000的行,输出每行1,3字段
[root@localhost1 ~]#awk -F ':' '$3>1000 {print $1,$3}' /etc/passwd
nfsnobody 65534
zhangsan 1001
lisi 1002
zhaoliu 1003
wangwu 1004
qianqi 1005
zhuba 1006
 
//3.指定最后一个字段包含sbin的行,输出第1和最后一个字段
[root@localhost1 ~]#awk -F ':' '$NF~"sbin" {print $1,$NF}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
...
rpcuser /sbin/nologin
nfsnobody /sbin/nologin
gnome-initial-setup /sbin/nologin
sshd /sbin/nologin
avahi /sbin/nologin
postfix /sbin/nologin
tcpdump /sbin/nologin
apache /sbin/nologin
named /sbin/nologin
dhcpd /sbin/nologin
 
//4.输出最后一个字段既不是/sbin/nologin也不是/bin/bash的行
[root@localhost1 ~]#awk -F ':' '($NF!="/sbin/nologin")&&($NF!="/bin/bash") {print $1,$NF}' /etc/passwd
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt

5.使用操作getline

//1.利用getline输出奇偶行
[root@localhost1 ~]#seq 10 |awk '{getline;print $0}'
2
4
6
8
10
[root@localhost1 ~]#seq 10 |awk '{print $0;getline}'
1
3
5
7
9
 
//2.利用getline输出主机名
[root@localhost1 ~]#awk 'BEGIN {"hostname" |getline ;{print $0} }'
localhost1
 
//3.利用getline读取w命令显示的行数,统计出在线用户数(减去前2个无关行)
[root@localhost1 ~]#w
 14:56:47 up  6:24,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.116.1    14:17    7.00s  0.14s  0.02s w
[root@localhost1 ~]#w |awk 'NR>2 {print $0 | "wc -l"}'
1
 

6.使用操作OFS

//1.利用OFS输出第1和3个字段,并用:作为输出的分隔符
[root@localhost1 ~]#echo "A B C D" |awk '{OFS=":";print $1,$3}'
A:C
 
//2.利用OFS指定分割符输出整行内容时,需要使用$1=$1刷新整行内容
[root@localhost1 ~]#echo "A B C D" |awk '{OFS=":";$1=$1;print $0}'
A:B:C:D

7.配合数组使用

//1.输出指定数组值
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;print a[1]}'
20
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;print a[0]}'
10
 
//2.使用字符串作为数组索引,输出指定数组值
[root@localhost1 ~]#awk 'BEGIN {a["abc"]=10;a["xyz"]=20;print a["abc"]}'
10
//数组值也可以为字符串
[root@localhost1 ~]#awk 'BEGIN {a["abc"]="aa";a["xyz"]="xx";print a["abc"]}'
aa
 
//3.遍历数组
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;a[2]=30; for(i in a) {print i,a[i]}}'            0 10
1 20
2 30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值