awk学习心得--超详细--案例分析

awk:报告生成器
格式化后显示信息

语法:
awk [options] ‘script‘ file1 file2, ...
awk [options] ‘PARTTERN { action }‘ file1 file2, ...
最常见的action:print,printf

awk的基本特征:
a.每一次取一行
b.根据指定的分隔符(不指定是位空白字符)将该行切割位列,使用$0(整行),$1,$2,$3...(第一列,第二列,...)
c.可以指定行号,列号,切割符,操作后分隔符
案例:
 chkconfig --list |grep 3:启用 |awk ‘{print $1}‘
 tail -1 /etc/passwd |awk -F ‘:‘ ‘BEGIN{OFS="---"}{print $1,$6,$7}‘   ##OFS指定输出分隔符
 ifconfig eth1 |awk -F ‘[ :]+‘ ‘NR==2 {print $4}‘
 ifconfig eth1 |awk -F ‘[ :]+‘ ‘NR==2 {print "eth1_ip="$4}‘  ##可以加入显示内容
awk ‘BEGIN {print "line one \nline two\nline three"}‘

4.高级awk的使用:
1)awk变量:
FS:列分隔符,默认位空白
RS:行分隔符,默认位换行符
OFS:输出列分隔符
ORS :输出行分隔符

2)awk内置变量
NR:处理中行数
FNR:单个文件的行数
NF:列的个数
案例:
ifconfig eth1 |awk ‘{print NR}‘
ifconfig eth1 |awk ‘{print NF}‘

3)自定义变量:
awk ‘BEGIN{test="www.linuxfan.cn";print test}‘
awk -v test="linuxfan.cn" ‘BEGIN{print test}‘

4)printf
使用的格式:
printf format, item1,item2, ...
特征:
a.必须指定format,用于指定后面item的输出格式
b.printf语句不会自动打印换行符:\n
c.format格式以%+一个字符,如下:
%c:显示字符的ASCII码
%d,%i:十进制整数
%e:科学计数法显示数值
%f:显示浮点数(小数)
%s:显示字符串
%u:无符号整数
%%:显示%
d.修饰符:N:显示宽度,-:左对齐,+:显示数值符号,如%-c(左对齐)
案例:
chkconfig --list |grep 3:启用 |awk ‘{printf "%-10s",$1}‘  ##在统一行显示
awk -F : ‘{printf "%-15s %-10d %-10s\n",$1,$3,$7}‘ /etc/passwd

5)awk的操作符
a.算数操作符
-x
+x
x^y
x**y
x*y
x/y
x+y
x-y
x%y
b.赋值操作符
=
+=
-=
*=
/=
%=
++
--
c.布尔值
awk中,任何非0值或者非空字符串都为真,反之为假
d.比较操作符:>,<,>=,<=,==,!=,~,!~(x ~ y,字符串能被表达式y匹配)

d.逻辑操作符:&&,||,!
e.条件表达式:条件?if-true-exp:if-false-exp
f.调用函数:function_name (pa1, pa2)

6)awk常见的模式类型:
a.正则表达式(regexp),格式为:/regular expression/
awk -F : ‘/^u/{print $1}‘ /etc/passwd

b.表达式(expression),值位非0或位非空是满足条件,如$1 ~ /foo/或 $1 == "root"
awk -F : ‘$3>=500{print $1,$3,$7}‘ /etc/passwd
awk -F : ‘$3+1<=100&&$3+1>=10{print $1,$3,$7}‘ /etc/passwd
awk -F : ‘$2=="!!"{print $1,$2}‘ /etc/shadow  ##检查未初始化密码的用户
passwd  -d  u01
awk -F : ‘$2==""{print $1}‘ /etc/shadow  ##打印密码为空的用户
awk -F : ‘$7~"bash$"{print $1,$3,$7}‘ /etc/passwd  ##匹配$7为bash结束行
awk -F : ‘$7!~"bash$"{print $1,$3,$7}‘ /etc/passwd

c.匹配范围(ranges),指定的匹配范围,格式为part1,part2
awk -F : ‘$3==3,$3==10{print $1,$3,$7}‘ /etc/passwd
awk -F : ‘$1=="root",$1=="adm"{print $1,$3,$7}‘ /etc/passwd
awk -F : ‘/^r/,/^a/{print $1,$3,$7}‘ /etc/passwd
d.特殊模式(BEGIN/END)
awk -F : ‘BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}‘ /etc/passwd  ##在awk处理之前打印头部BEGIN{}
awk -F : ‘BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}$7~"bash$"{printf "%-10s%-10s%-20s\n",$1,$3,$7}‘ /etc/passwd  ##多个模式混合使用
awk -F : ‘BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}$7~"bash$"{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "End of report"}‘ /etc/passwd  ##在awk执行完成后打印尾部END{}
awk -v i=1 ‘$5~"yum"{i++}END{print "yum use times:", i}‘ /var/log/messages
/正则表达式/:使用通配符的扩展集合。
关系表达式:如字符串或数字的比较。
模式匹配表达式:模式(指定一个行的范围,不包含BEGIN,END)

7)常见的action:
expressions:表达式
control satatements:控制语句
compound statements:混合语句
input statements:输入语句
output statements:输出语句

8)action中的控制语句:
a.if-else
语法:if (condition) command action1; else command action2
案例:
awk -F : ‘$7~"bash"{if ($1=="root") print $1, "admin";else print $1, "Common User"}‘ /etc/passwd
awk -F : -v sum=0 ‘{if ($3>=500) sum++}END{print sum}‘ /etc/passwd
awk -F : -v sum=0 ‘$7~"bash"{if ($1=="root") print $1, "admin" sum++;else print $1, "Common User" sum++}END{print "can login user num:",sum}‘ /etc/passwd  ##二合一
awk -F : ‘$7~"bash$"{if ($1=="root") printf "%-15s: %s\n",$1,"admin";else printf "%-15s: %s\n",$1,"common user"}‘ /etc/passwd  ##格式化输出

b.while循环:循环字段,awk本身就是行的循环
语法:while (condition){statement1;statement2;...}
案例:
awk -F: ‘{i=1;while (i<=3) {print $i;i++}}‘ /etc/passwd  ##循环打印前3列
awk -F : ‘{i=1;while (i<NF) {if (length($i)<=4) print $i;i++}}‘ /etc/passwd ##循环整行,并打印出长度小于4的字段列

c.do-while
语法:do {statement1;statement2;...} while (condition)
awk -F : ‘{i=1;do {print $i;i++}while(i<=3)}‘ /etc/passwd

d.for
语法:for (variable assignment;condition;iteration process){statement1, statement2,...}
案例:
awk -F : ‘{for(i=1;i<=3;i++) print $i}‘ /etc/passwd

for循环遍历数组元素:
语法:for (i in array) {statement1, statement2,...}
案例:
awk -F : ‘{SH[$NF]++;}END{for (i in SH){print i,SH[i]}}‘ /etc/passwd
netstat -ant |awk ‘/^tcp/{++S[$NF]}END{for(a in S) print a, S[a]}‘
awk ‘{counts[$1]++}END{for (url in counts) print url,"access times:",counts[url]}‘ /var/log/httpd/access_log
awk ‘{S[$5]++}END{for (i in S) print i,S[i]}‘ /var/log/messages
awk ‘{AH[$1]++}END{for (i in AH) printf "%-20s:%s\n", i, AH[i]}‘ /var/log/httpd/access_log
9).awk中的数组
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。要遍历数组中的每一个元素,需要使用如下的特殊结构:
for (var in array) { statement1, ... }
例如:
state[abc]=3
state[efg]=6
for (A in state) {print A,state[A]}  ##A一定是index-expression(下标abc/efg),state[A]是一个具体的值(3/6)
[[email protected] ~]# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address    Foreign Address        State      
tcp        0      0 0.0.0.0:22       0.0.0.0:*           LISTEN      
tcp        0      0 127.0.0.1:25     0.0.0.0:*           LISTEN      
tcp        0      0 192.168.1.106:22 192.168.1.101:36318 ESTABLISHED
以上命令显示的结果中,每一行最后一个字段为状态,若要统计每种状态的个数,只需要将state作为数组下标,由于awk本身就是一个行的循环,所以只需要给数字自加1(++)即可实现统计,具体操作如下:
netstat -ant |awk ‘{S[$6]++}END{for(i in S){print i,S[i]}}‘

10)awk的内置函数
split(string,array[filedsep[,seps]])
作用:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列;

# netstat -ant | awk ‘/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}‘ | sort -rn | head -50

length([string])

功能:返回string字符串中字符的个数;

substr(string, start [, length])

功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;

system(command)

功能:执行系统command并将结果返回至awk命令

systime()

功能:取系统当前时间

tolower(s)

功能:将s中的所有字母转为小写

toupper(s)

功能:将s中的所有字母转为大写

时间: 2024-10-15 00:54:36

awk学习心得--超详细--案例分析的相关文章

awk详细案例分析

awk:报告生成器格式化后显示信息 语法:awk [options] 'script' file1 file2, ...awk [options] 'PARTTERN { action }' file1 file2, ...最常见的action:print,printf awk的基本特征:a.每一次取一行b.根据指定的分隔符(不指定是位空白字符)将该行切割位列,使用$0(整行),$1,$2,$3...(第一列,第二列,...)c.可以指定行号,列号,切割符,操作后分隔符案例:chkconfig

js 手动实现bind方法,超详细思路分析!

壹 ? 引 在 js 实现call和apply方法 一文中,我们详细分析并模拟实现了call/apply方法,由于篇幅问题,关于bind方法实现只能另起一篇. 在模拟bind之前,我们先了解bind的概念,这里引入MDN解释: bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用. 说的通俗一点,bind与apply/call一样都能改变函数this指向,但bind并不会立即执行函

Spring整合Shiro做权限控制模块详细案例分析

1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId

Android学习笔记之ProgressBar案例分析

(1) <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddi

JAXB常用注解讲解(超详细)

简介: JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数. 一个简单的例子: Person.class : @XmlRo

作业2——英语学习APP的案例分析

英语学习APP的案例分析 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程中,自己组织团队写一个软件,然后分析,的确是学习软件工程的一个好方法:但我们也可以从别人的成功/失败中学到很多. 我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信.QQ,等等都是软件,都很值得分析.你为何成为它们的用户?它们

cocos2dx 3.1从零学习(四)——内存管理(错误案例分析)

本篇内容文字比较较多,但是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的.可能表达的跟正确的机制有出入,还请指正. 如果有不理解的可以联系我,大家可以讨论一下,共同学习. 首先明确一个事实,retain和release是一一对应的,跟new和delete一样. 1.引用计数retain release 这里请参考一下引用计数的书籍,肯定说的比我讲的详细. 简单一点理解就是,对new的指针加一个计数器,每引用一次这块内存,计数就加1.在析构的时候减1,如果等于0的时候就delete这个

英语学习app案例分析

题目: 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程中,自己组织团队写一个软件,然后分析,的确是学习软件工程的一个好方法:但我们也可以从别人的成功/失败中学到很多. 我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信.QQ,等等都是软件,都很值得分析.你为何成为它们的用户?它们的团队做对了什么,

系统架构设计师2009-2018历年综合知识、案例分析、论文真题及答案详细解析

https://blog.csdn.net/xxlllq/article/details/85049295 ??系统架构设计师复习资料当您看了这篇文章有何疑问,可先看最后的评论,有可能您遇到的问题其他人已经提出我已回复. 2018/12/14查询成绩后知道自己通过了系统架构设计师的考试(每科满分75,及格45分),特地记录一下.最终的成绩如下: 我是在9月份决定报名参加系统架构设计师考试,主要是想借此机会督促自己学习些除工作外的知识.准备了2个月,复习时间为周末,复习方式为看教学视频和真题练习.