版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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
@localhost ~]
# awk '/root/' 1.txt
-
root:
x:
0
:
0
:root
:/root
:/bin/bash
-
operator:
x:
11
:
0
:operator
:/root
:/sbin/nologin
2 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行
-
[root
@localhost ~]
# awk -F ':' '$1 ~ /root/' 1.txt
-
root:
x:
0
:
0
:root
:/root
:/bin/bash
- awk匹配字符可以使用正则
-
[root
@localhost ~]
# 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
@localhost ~]
# 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
@localhost ~]
# 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
@localhost ~]
# 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@localhost ~]# head
-5
1.txt |awk -F
':'
'{print $1}'
-
root
-
bin
-
daemon
-
adm
-
lp
- 打印全部内容;$0表示全部内容
-
[root
@localhost ~]
# 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@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 ~]
# awk '/root|bash/' 1.txt
-
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 ~]
# awk '/root/||/bash/' 1.txt
-
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 ~]
# 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
-
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 ~]
# 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
@localhost ~]
# 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
-
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 ~]
# 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
@localhost ~]
# awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txt
-
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 ~]
# 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/wuzhou
:/sbin/nologin
-
awk内置变量
- awk常用的变量有OFS,NR和NF
- OFS 用来指定分隔符号
- 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 ~]
# 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
@localhost ~]
# awk -F ':' 'NR>20 {print NR":"$0}' 1.txt
-
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 ~]
# 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@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 ~]
# awk -F ':' '{if ($1=="root") {print $0}}' 1.txt
-
root:
x:
0
:
0
:root
:/root
:/bin/bash