目录
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目
前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务
前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
格式:
awk [选项] ‘模式条件{操作}’ 文件1 文件2....
awk -f|-v 脚本文件 文件1 文件2.....
模式:
未指定表示 为空/1/2/代表正则表达式
关系表达式
- [root@localhost ~]#awk ''
- #空没有效果
-
- [root@localhost ~]#awk '{print}'
- ##在打印一遍
- dd
- dd
-
-
- [root@localhost ~]#awk '{print "hello"}'
- #字符串需要添加双引号,单引号已被使用
- 1
- hello
- 1
- hello
- [root@localhost ky15]#awk 'BEGIN {print "hello"}'
- #BEGIN比较特殊值打一行
- hello
-
-
-
- [root@localhost ~]#awk '{print 100}'
- #数字不需要
- 1
- 100
- [root@localhost ~]#awk -F: '{print "root"}' /etc/passwd
- #打印root 多少行=passwd里的行数
- [root@localhost ky15]#echo {a..b} |awk '{print $1}'
- #连续的空白符也可以
- a
- [root@localhost ky15]#df|awk '{print $5}'
- #分区利用率
- 已用%
- 8%
- 0%
- 0%
- 1%
- 0%
- 4%
- 0%
- 1%
- [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1,$3}'
- #指定冒号作为分隔符,打印第一列和第三列
- [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1":"$3}'
- #用冒号分隔开
- [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1"\t"$3}'
- [root@localhost ~]#df|awk -F"( +|%)" '{print $5}'
- [root@localhost ky15]#df |awk -F"[[:space:]]+|%" '{print $5}'
- [root@localhost ky15]#df |awk -F"[ %]+" '{print $5}'
-
- 取 ip地址
-
- [root@localhost ky15]#ifconfig ens33|sed -n '2p' |awk '{print $2}'
-
- [root@localhost ky15]#hostname -I|awk {print $1}
- [root@localhost ~]#wc -l /etc/passwd
- 45 /etc/passwd
- [root@localhost ~]#awk -F: '{print $0}' /etc/passwd
- #$0代表全部元素
- [root@localhost ~]#awk -F: '{print $1}' /etc/passwd
- #代表第一列
- [root@localhost ~]#awk -F: '{print $1,$3}' /etc/passwd
- #代表第一第三列
- [root@localhost ky15]#awk '/^root/{print}' passwd
- #已root为开头的行
- [root@localhost ky15]#grep -c "/bin/bash$" passwd
- #统计当前已/bin/bash结尾的行
- 2
- ##### BEGIN{}模式表示,在处理指定的文本前,需要先执行BEGIN模式中的指定动作; awk再处理指定的文本,之后再执行END模式中的指定动作,END{}语句中,一般会放入打印结果等语句。
-
-
-
-
- [root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' passwd
- ## 先定义变量
- [root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/ {x++;print x,$0};END{print x}' passwd
- ###
FS
- [root@localhost ky15]#awk -v FS=: '{print $1FS$3}' /etc/passwd
- #此处FS 相当于于变量
- [root@localhost ky15]#awk -F: '{print $1":"$3}' /etc/passwd
- shell中的变量
- [root@localhost ky15]#fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
- #定义变量传给FS
- OFS
- [root@localhost ky15]#fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd
- #输出分隔符
NF
- [root@localhost ky15]#awk -F: '{print NF}' /etc/passwd
-
- [root@localhost ky15]#awk -F: '{print $NF}' /etc/passwd
- #最后一个字段
-
- [root@localhost ky15]#df|awk -F: '{print $(NF-1)}'
- #倒数第二行
- [root@localhost ky15]#df|awk -F "[ %]+" '{print $(NF-1)}'
NR
- [root@localhost ky15]#awk '{print $1,NR}' /etc/passwd
- ##行号
- [root@localhost ky15]#awk 'NR==2{print $1}' /etc/passwd
- #只取第二行的第一个字段
- [root@localhost ky15]#awk 'NR==1,NR==3{print}' passwd
- #打印出1到3 行
- [root@localhost ky15]#awk 'NR==1||NR==3{print}' passwd
- #打印出1和3行
- [root@localhost ky15]#awk '(NR%2)==0{print NR}' passwd
- #打印出函数取余数为0行
- [root@localhost ky15]#awk '(NR%2)==1{print NR}' passwd
- #打印出函数取余数为1的行
- [root@localhost ky15]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
-
- [root@localhost ky15]#seq 10|awk 'NR>5 && NR<10'
- #取 行间
- 6
- 7
- 8
- 9
- [root@localhost ky15]#awk '$3>1000{print}' /etc/passwd
计算:
- [root@localhost ky15]#awk 'BEGIN{i=0;print i++,i}'
- 0 1
- [root@localhost ky15]#awk 'BEGIN{i=0;print ++i,i}'
- 1 1
- 提取下面的字段中的 IP 地址和时间
-
- 58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?
- doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
- 128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
- 64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"
- ""sendfileo
-
- [root@localhost ky15]#cat awk.txt | awk -F'[[ ]' '{print $1,$5}'|sed '2d'
-
-
- 提取host.txt主机名后再放回host.txt文件
- 1 www.kgc.com
- 2 mail.kgc.com
- 3 ftp.kgc.com
- 4 linux.kgc.com
- 5 blog.kgc.com
- [root@localhost ky15]#cat www.txt |awk -F "[ .]" '{print $2}'
1.统计/etc/fstab文件中每个文件系统类型出现的次数
2.统计/etc/fstab文件中每个单词出现的次数
3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
4.提取主机名并放入原文件
- [root@localhost ky15]#cat /etc/fstab |awk '/^[^#]/{print $3}'|sort|uniq -c
-
-
- [root@localhost ky15]#grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort |uniq -c
-
- [root@localhost ky15]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" |grep -o "[0-9]"
-
-
- [root@localhost ky15]#cat host.txt |awk -F[/.] '{print $3}'|sort -nr|uniq -c