六周第三次课 9.6/9.7 awk

9.6/9.7 awk

  • awk也是流式编辑器,针对文档中的行和段进行操作 awk可以分为几个部分:
  • 匹配字符或者字符串
  • 截取文档中的某一段
  • 条件操作符
  • 数学运算
  • 内置变量
实例1:
  • head -n2 test.txt|awk -F ':' '{print $1}'
  • head -n2 test.txt|awk -F ':' '{print $0}'
  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  • awk '/oo/' test.txt
  • awk -F ':' '$1 ~/oo/' test.txt
  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  • awk -F ':' '$3=="0"' /etc/passwd
  • awk -F ':' '$3>="500"' /etc/passwd
  • awk -F ':' '$3>=500' /etc/passwd
  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
匹配字符或者字符串

匹配root的行

[root@linux-151 ~]# awk '/root/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行

[root@linux-151 ~]# awk -F ':' '$1 ~ /root/' 1.txt
root:x:0:0:root:/root:/bin/bash

awk匹配字符可以使用正则

[root@linux-151 ~]# awk '/ooo?/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

awk自带脱意功能,grep脱意需要-E或者egrep,sed脱意需要-r选项

[root@linux-151 ~]# awk -F ':' '/oo+/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

grep -E

[root@linux-151 ~]# grep -E 'oo+' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sed –r

[root@linux-151 ~]# sed -n -r '/oo+/'p 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
截取文档中的某一段
  • awk –F '分隔符' 如果不指定分隔符,默认会以空格或者空白字符分隔。

打印第一段

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $1}'
root
bin
daemon
adm
lp

打印全部内容;$0表示全部内容

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打印第1段~第4段

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $1,$2,$3,$4}'
root x 0 0
bin x 1 1
daemon x 2 2
adm x 3 4
lp x 4 7 
  • 注意:这里打印出来了第1到第4段,但是内容没有分隔符,这里我们加个分隔符,分隔符要以双引号引起来;后面我们会介绍一个变量OFS来进行分隔。
[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
root#x#0#0
bin#x#1#1
daemon#x#2#2
adm#x#3#4
lp#x#4#7

  • awk可以支持多个匹配

匹配到root打印第1和第3段,匹配到user打印第1,第3,第4段。

[root@linux-151 ~]# awk -F ':' '/root/{print $1,$3} /user/ {print $1,$3,$4}' 1.txt
root 0
operator 11
tss 59 59
user3 1004 1003
user4 1005 1003
user5 1007 1006
user6 1008 1003
user7 1009 1009
  • |在正则里面表示或者

打印出匹配到root或者user的行

[root@linux-151 ~]# awk '/root|bash/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash

||也是并且的意思,但是用法还是有一点区别。

[root@linux-151 ~]# awk '/root/||/bash/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash

条件操作符

  • == 等于,精确匹配
  • >大于

  • >= 大于等于

  • < 小于
  • <= 小于等于
  • != 不等于

打印出第3段等于0的行

[root@linux-151 ~]# awk -F ':' '$3=='0'' 1.txt

打印出第3段大于等于500的行

[root@linux-151 ~]# awk -F ':' '$3>='500'' 1.txt
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/wuzhou:/sbin/nologin
user7:x:1009:1009::/home/user7:/bin/bash

注意'500'和"500"区别:双引号引起来的500会把它当成字符,会按照阿斯玛排序,单用号引起来的500是数字。

[root@linux-151 ~]# awk -F ':' '$3>="500"' 1.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

打印出第7段不/sbin/nologin的行

[root@linux-151 ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user7:x:1009:1009::/home/user7:/bin/bash

并且&&和或者||

[root@linux-151 ~]# awk -F ':' '$3>'1000' && $3<'1009'' 1.txt
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/wuzhou:/sbin/nologin

或者||

[root@linux-151 ~]# awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txt
root:x:0:0:root:/root:/bin/bash
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/lem:/sbin/nologin
user7:x:1009:1009::/home/user7:/bin/bash

两个字段进行运算

[root@linux-151 ~]# awk -F ':' '$3>$4' 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/lem:/sbin/nologin

awk内置变量
  • awk常用的变量有OFS,NR和NF
  • OFS 用来指定分隔符号
  • NR 表示行数
  • NF 表示段数

指定#为分隔符

[root@linux-151 ~]# awk -F ':' '{OFS="#"} $3>"5" {print $1,$2,$3,$4}' 1.txt
shutdown#x#6#0
halt#x#7#0
mail#x#8#12
nobody#x#99#99
systemd-bus-proxy#x#999#997
dbus#x#81#81
polkitd#x#998#996
tss#x#59#59
postfix#x#89#89
sshd#x#74#74
chrony#x#997#995

用awk打印前5行,并显示行号

[root@linux-151 ~]# head -5 1.txt|awk -F ':' '{print NR":"$0}'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

用awk打印20行以后的行,并显示行号

[root@linux-151 ~]# awk -F ':' 'NR>20 {print NR":"$0}' 1.txt
21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
22:lem:x:1000:1000::/home/lem:/bin/bash
23:user3:x:1004:1003::/home/user3:/sbin/nolongin
24:user4:x:1005:1003::/home/user4:/sbin/nolongin
25:user5:x:1007:1006::/home/user5:/bin/login
26:user6:x:1008:1003::/home/lem:/sbin/nologin
27:user7:x:1009:1009::/home/user7:/bin/bash

awk中可以使用if判断

[root@linux-151 ~]# awk -F ':' '{OFS="#"} {if($3>'1000'){print $1,$2,$3}}' 1.txt
user3#x#1004
user4#x#1005
user5#x#1007
user6#x#1008
user7#x#1009

awk中的数学运算

  • awk可以更改段值

将第一段全部更改为root

[root@linux-151 ~]# head -5 1.txt|awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
root x 3 4 adm /var/adm /sbin/nologin
root x 4 7 lp /var/spool/lpd /sbin/nologin
  • awk可以计算某个段的值

求第3段和

[root@linux-151 ~]# awk -F ':' '{(oto=oto+$3)}; END {print oto}' 1.txt
9694

打印出第一段是root的行

[root@linux-151 ~]# awk -F ':' '{if ($1=="root") {print $0}}' 1.txt
root:x:0:0:root:/root:/bin/bash

转载于:https://my.oschina.net/u/3804357/blog/1802512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值