版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/Young_Linux/article/details/79575859
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.txtawk -F ':' '$1 ~/oo/' test.txtawk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txtawk -F ':' '$3=="0"' /etc/passwdawk -F ':' '$3>="500"' /etc/passwdawk -F ':' '$3>=500' /etc/passwdawk -F ':' '$7!="/sbin/nologin"' /etc/passwd
匹配字符或者字符串
匹配root的行
[root
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash
operator:
x:
11
:
0
:operator
:/root
:/sbin/nologin
2 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行
[root
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash
awk匹配字符可以使用正则
[root
@localhost ~]
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
@localhost ~]
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
@localhost ~]
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
@localhost ~]
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@localhost ~]# head
-5
1.txt |awk -F
':'
'{print $1}'
root
bin
daemon
adm
lp
打印全部内容;$0表示全部内容
[root
@localhost ~]
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@localhost ~]# 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@localhost ~]
# 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@localhost ~]# 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
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash
operator:
x:
11
:
0
:operator
:/root
:/sbin/nologin
wuzhou:
x:
1000
:
1000
:
:/home/wuzhou
:/bin/bash
user7:
x:
1009
:
1009
:
:/home/user7
:/bin/bash
||也是并且的意思,但是用法还是有一点区别,
[root
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash
operator:
x:
11
:
0
:operator
:/root
:/sbin/nologin
wuzhou:
x:
1000
:
1000
:
:/home/wuzhou
:/bin/bash
user7:
x:
1009
:
1009
:
:/home/user7
:/bin/bash
条件操作符
== 等于,精确匹配
大于
= 大于等于
< 小于<= 小于等于!= 不等于
打印出第3段等于0的行
[
root@localhost ~]# awk -F
':' '$3=='0'' 1.txt
打印出第3段大于等于500的行
[root
@localhost ~]
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
wuzhou:
x:
1000
:
1000
:
:/home/wuzhou
:/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
@localhost ~]
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
@localhost ~]
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
wuzhou:
x:
1000
:
1000
:
:/home/wuzhou
:/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
@localhost ~]
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
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash
wuzhou:
x:
1000
:
1000
:
:/home/wuzhou
:/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
两个字段进行运算
[root
@localhost ~]
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/wuzhou
:/sbin/nologin
awk内置变量
awk常用的变量有OFS,NR和NFOFS 用来指定分隔符号NR 表示行数NF 表示段数
指定#为分隔符
[root@localhost ~]
# 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
@localhost ~]
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
@localhost ~]
21
:chrony
:x
:
997
:
995
:
:/var/lib/chrony
:/sbin/nologin
22
:wuzhou
:x
:
1000
:
1000
:
:/home/wuzhou
:/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/wuzhou
:/sbin/nologin
27
:user7
:x
:
1009
:
1009
:
:/home/user7
:/bin/bash
awk中可以使用if判断
[root
@localhost ~]
user3
user4
user5
user6
user7
awk中的数学运算
awk可以更改段值
将第一段全部更改为root
[
root@localhost ~]# 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@localhost ~]# awk -F
':'
'{(oto=oto+$3)}; END {print oto}'
1.txt
9694
打印出第一段是root的行
[root
@localhost ~]
root:
x:
0
:
0
:root
:/root
:/bin/bash