shell编程(四)| awk正则表达式

一,awk概述

awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作
在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快

END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

二,awk基本用法

awk [-F|-f] 'BEGIN{}{command1; command2} END{}' file
[-F|-f]   大参数,-F指定分隔符,-f调用脚本
'  '          引用代码块
//           匹配代码块,可以是字符串或正则表达式
{}           命令代码块,包含一条或多条命令
;          多条命令使用分号分隔

1,awk -F ":" '{print $1}' passwd 以冒号为分隔符打印passwd的第一列

[root@100 mnt]# awk -F ":" '{print $1}' passwd
root
gdm
tcpdump
hh
hehe
nihao

2,awk -F ":" 'BEGIN{print "name"}{print $1}' passwd  先打印name,然后以冒号为分隔符打印passwd的第一列

[root@100 mnt]# awk -F ":" 'BEGIN{print "name"}{print $1}' passwd
name
root
gdm
tcpdump
hh
hehe
nihao
3,awk -F ":" 'BEGIN{print "name"}{print $1}END{print "END"}' passwd  先打印name,然后以冒号为分隔符打印passwd的第一列,然后在尾行打印END
[root@100 mnt]# awk -F ":" 'BEGIN{print "name"}{print $1}END{print "END"}' passwd
name
root
gdm
tcpdump
hh
hehe
nihao
END

4,awk -F ":" 'BEGIN{print "NAME"}{print NR}END{print "END"}' passwd  先打印NAME,然后打印passwd每行的行号,然后在尾行打印END

[root@100 mnt]# awk -F ":" 'BEGIN{print "NAME"}{print NR}END{print "END"}' passwd
NAME
1
2
3
4
5
6
END
5,awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd 先打印NAME,然后打印passwd每行的行号,以冒号为分隔符打印passwd的第一列,然后在尾行打印END
[root@100 mnt]# awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd
NAME
1root
2gdm
3tcpdump
4hh
5hehe
6nihao
END

6,awk 'BEGIN{print "NAME"}{print }END{print "END"}' passwd   先打印NAME,然后打印passwd每行,然后在尾行打印END

[root@100 mnt]# awk 'BEGIN{print "NAME"}{print }END{print "END"}' passwd
NAME
root:x:0:0:root:/root:/bin/bash
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
hh:x:1001:1001::/home/hh:/bin/bash
hehe:x:1002:1002::/home/hehe:/bin/bash
nihao:x:1003:1003::/home/nihao:/bin/bash
END
7,awk 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd  先打印NAME,然后打印每行的行号,每行行号下面打印内容,然后在尾行打印END
[root@100 mnt]# awk -F ":" 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd
NAME
1
root:x:0:0:root:/root:/bin/bash
2
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
3
tcpdump:x:72:72::/:/sbin/nologin
4
hh:x:1001:1001::/home/hh:/bin/bash
5
hehe:x:1002:1002::/home/hehe:/bin/bash
6
nihao:x:1003:1003::/home/nihao:/bin/bash
END
8,awk '/bash$/{print }' passwd  打印以bash结尾的行
[root@100 mnt]# awk '/bash$/{print}' passwd 
root:x:0:0:root:/root:/bin/bash
hh:x:1001:1001::/home/hh:/bin/bash
hehe:x:1002:1002::/home/hehe:/bin/bash
nihao:x:1003:1003::/home/nihao:/bin/bash

9,awk -F ":" '/bash$/{print $1}' passwd 找出以bash结尾的行,并且以冒号为分隔符打印第一列

[root@100 mnt]# awk -F ":" '/bash$/{print $1}' passwd 
root
hh
hehe
nihao

10,awk 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd 打印以bash结尾总共有多少行
开始先设变量N=0,每找到一行以bash结尾,N就自加1,然后打印N的值

[root@100 mnt]# awk 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd 
4
11,awk '/^ro/{print }' passwd    打印passwd里面以ro开头的行
[root@100 mnt]# awk '/^ro/{print }' passwd
root:x:0:0:root:/root:/bin/bash
12,awk '/^[a-d]/{print }' /etc/passwd  打印/etc/passwd里面以a或b或c或d开头的行
[root@100 mnt]# awk '/^[a-d]/{print }' /etc/passwd
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
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
13,awk '/^[^a-d]/{print }' /etc/passwd  打印/etc/passwd里面不以a,b,c,d开头的行
[root@100 mnt]# awk '/^[^a-d]/{print }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
14,awk '/^a/||/nologin$/{print }' /etc/passwd  打印以a开头或者以nologin结尾的行
[root@100 mnt]# awk '/^a/||/nologin$/{print }' /etc/passwd
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
15,awk '/^a/&&/nologin$/{print }' /etc/passwd 打印以a开头并且以nologin结尾的行
[root@100 mnt]# awk '/^a/&&/nologin$/{print }' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
16,awk -F ":" '$5~/^a/{print }' /etc/passwd  打印以冒号为分隔符,第5列中以a开头的行
[root@100 mnt]# awk -F ":" '$5~/^a/{print }' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
17,awk -F ":" '$1~/^r/{print }' /etc/passwd  打印以冒号为分隔符,第1列中以r开头的行
[root@100 mnt]# awk -F ":" '$1~/^r/{print }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
18,awk -F ":" '$7!~/bash$/{print }' /etc/passwd 打印以冒号为分隔符,第7列中不以bash结尾的行
[root@100 mnt]# awk -F ":" '$7!~/bash$/{print }' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

19,awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd   打印以冒号为分隔符,第6列中不以/home开头,并且不以bash结尾的行的第1列####\/home中的\表示对/的转义

[root@100 mnt]# awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
root
20,awk -F ":" '{print NR,$1}' passwd  打印行号,以冒号为分隔符,打印第1列
[root@100 mnt]# awk -F ":" '{print NR,$1}' passwd 
1 root
2 gdm
3 tcpdump
4 hh
5 hehe
6 nihao
21,awk -F ":" '{print NR,$0}' passwd  打印行号,打印每一行的所有内容  $0表示打印全文内容
[root@100 mnt]# awk -F ":" '{print NR,$0}' passwd 
1 root:x:0:0:root:/root:/bin/bash
2 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
3 tcpdump:x:72:72::/:/sbin/nologin
4 hh:x:1001:1001::/home/hh:/bin/bash
5 hehe:x:1002:1002::/home/hehe:/bin/bash
6 nihao:x:1003:1003::/home/nihao:/bin/bash
22,awk -F ":" '{print NF,$0}' passwd  以冒号为分隔符,打印每一行的列数,打印全文内容
[root@100 mnt]# awk -F ":" '{print NF,$0}' passwd 
7 root:x:0:0:root:/root:/bin/bash
7 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
7 tcpdump:x:72:72::/:/sbin/nologin
7 hh:x:1001:1001::/home/hh:/bin/bash
6 x:1002:1002::/home/hehe:/bin/bash
7 nihao:x:1003:1003::/home/nihao:/bin/bash
23,awk -F ":" '$6!~/^\/home/&&/bash$/{print NR}' /etc/passwd

打印以冒号为分隔符,第6列中不以/home开头,并且不以bash结尾的行的行号

[root@100 mnt]# awk -F ":" '$6!~/^\/home/&&/bash$/{print NR}' /etc/passwd
1

24,awk -F ":" 'BEGIN{N=0}$6!~/^\/home/&&/bash$/{N++}END{print N}' /etc/passwd
打印以冒号为分隔符,第6列中不以/home开头,并且不以bash结尾的行的行数

[root@100 mnt]# awk -F ":" 'BEGIN{N=0}$6!~/^\/home/&&/bash$/{N++}END{print N}' /etc/passwd
1

显示ip


显示文件的行数



猜你喜欢

转载自blog.csdn.net/ha_weii/article/details/80761559