Shell脚本:三剑客(AWK)

目录

1、 工作原理:

 2、基础用法

 3、awk常见的内置变量

4、题目


awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目

前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务

1、 工作原理:

前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

格式:

awk [选项] ‘模式条件{操作}’ 文件1 文件2....
awk -f|-v 脚本文件 文件1 文件2.....

模式:
未指定表示 为空

/1/2/代表正则表达式

关系表达式

 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
###

 

 

 

 

 3、awk常见的内置变量

  • FS :指定每行文本的字段分隔符,缺省为空格或制表位。与 “-F”作用相同 -v "FS=:"
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

 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

 

4、题目

提取下面的字段中的 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

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值