一,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 nihao3,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 END5,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 END7,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 END8,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 411,awk '/^ro/{print }' passwd 打印passwd里面以ro开头的行
[root@100 mnt]# awk '/^ro/{print }' passwd root:x:0:0:root:/root:/bin/bash12,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/nologin13,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/nologin14,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/nologin15,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/nologin16,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/nologin17,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/nologin18,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 root20,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 nihao21,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/bash22,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/bash23,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
显示文件的行数