一、awk简介

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。可以在命令行中使用,但更多是作为脚本来使用。

awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。

 awk是行处理器: 优势在于处理庞大文件时不会出现内存溢出或是处理缓慢的问题。awk处理过程: 依次对每一行进行处理,然后输出,默认分隔符是空格或者tab键 

二、awk的形式语法格式

awk [options] 'commands' filenames

options:

-F 对于每次处理的内容,可以指定一个自定义的分隔符,默认的分隔符是空白字符(空格或 tab 键 )

三、awk工作原理

awk -F":" '{print $1,$3}' /etc/passwd

 (1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束 (2)然后,行被空格分解成字段,每个字段存储在已编号的变量中,从$1开始 (3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab (4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$2间有一个,逗号。逗号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格 (5)awk打印字段时,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。

command:

 BEGIN{}                   {}               END{}         filename​行处理前的动作          行内容处理的动作     行处理之后的动作    文件名​BEGIN{}和END{} 是可选项。函数-BEGIN{}:读入文本之前要操作的命令。(也可以设置变量.取值可以不加$){}:主输入循环:用的最多。读入文件之后擦操作的命令。如果不读入文件都可以不用写。END{}:文本全部读入完成之后执行的命令。

示例

 [root@awk ~]# awk 'BEGIN{ print 1/2} {print "ok"} END{print "----"}' /etc/hosts或者:[root@awk ~]# cat /etc/hosts | awk 'BEGIN{print 1/2} {print "ok"} END{print "----"}'0.5okok----​

四、记录与字段相关内部变量:

 1.记录和字段awk 按记录处理:一行是一条记录,因为awk默认以换行符分开的字符串是一条记录。(默认\n换行符:记录分隔符)字段:以字段分割符分割的字符串   默认是单个或多个“ ” tab键。​2.awk中的变量$0:表示整行;NF : 统计字段的个数$NF:是number finally,表示最后一列的信息RS:输入记录分隔符;ORS:输出记录分隔符。NR:打印记录号,(行号)FNR:可以分开,按不同的文件打印行号。FS : 输入字段分隔符,默认为一个空格。  OFS 输出的字段分隔符,默认为一个空格。 FILENAME 文件名  被处理的文件名称$1  第一个字段,$2第二个字段,依次类推...

实战

 FS(输入字段分隔符)---一般简写为-F(属于行处理前)[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1,$2}'root xbin xdaemon xadm xlp xsync xshutdown xhalt xmail x[root@awk ~]# cat /etc/passwd | awk -F":" '{print $1,$2}'root xbin xdaemon xadm xlp xsync xshutdown xhalt xmail x​#注:如果-F不加默认为空格区分!===============================================================OFS(输出字段分隔符)[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}'root..xbin..xdaemon..xadm..xlp..xsync..xshutdown..xhalt..xmail..x======================================================================1.创建两个文件[root@awk ~]# vim a.txtlovelove.loovelooooove​​[root@awk ~]# vim file1.txtisuoIPADDR=192.168.246.211hjahj123GATEWAY=192.168.246.1NETMASK=255.255.255.0DNS=114.114.114.114​NR   表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号[root@awk ~]# awk '{print NR,$0}' a.txt file1.txt1 love2 love.3 loove4 looooove5  6 isuo7 IPADDR=192.168.246.2118 hjahj1239 GATEWAY=192.168.246.110 NETMASK=255.255.255.011 DNS=114.114.114.114​FNR:表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号(#会将不同文件分开)[root@awk ~]# awk '{print FNR,$0}' a.txt file1.txt1 love2 love.3 loove4 looooove5  1 isuo2 IPADDR=192.168.246.2113 hjahj1234 GATEWAY=192.168.246.15 NETMASK=255.255.255.06 DNS=114.114.114.114===========================================================RS(输入记录分隔符)1.创建一个文件[root@awk ~]# vim passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin[root@awk ~]# cat passwd | awk 'BEGIN{RS="bash"} {print $0}' root:x:0:0:root:/root:/bin/bin:x:1:1:bin:/bin:/sbin/nologin​ORS(输出记录分隔符)2.对刚才的文件进行修改[root@awk ~]# vim passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin[root@awk ~]# cat passwd | awk 'BEGIN{ORS=" "} {print $0}'root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin===========================================================NF:统计列的个数[root@awk ~]# cat /etc/passwd | awk -F":" '{print NF}'7777$NF:打印最后一列[root@awk ~]# cat /etc/passwd | awk -F":" '{print $NF}'/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin练习1:将文件合并为一行[root@awk ~]# cat /etc/passwd | awk 'BEGIN{ORS="" } {print $0}'练习2:把一行内容分成多行1.首先创建一个文件[root@awk ~]# vim d.txtroot:x:0:0:root:/root:/bin/bash[root@awk ~]# cat d.txt | awk 'BEGIN{RS=":"} {print $0}'rootx00root/root

关系运算符号

实现 字符串的完全相等需要使用 ==

字符串需要使用双引号 != 表示不等于

 [root@awk ~]# awk -F":" '$NF == "/bin/bash"' /etc/passwd[root@awk ~]# awk -F":" '$1 != "root"' /etc/passwd
  • 比较表达式:

比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。 比较表达式使用关系运算符,用于比较数字与字符串。
关系运算符有 < 小于 例如 x<y > 大于 x>y <= 小于或等于 x<=y == 等于 x==y !=不等于 x!=y >= 大于等于 x>=y

示例

 [root@awk ~]# awk -F":" '$3 == 0' /etc/passwd[root@awk ~]# awk -F":" '$3 < 10' /etc/passwd
  • 算术运算:+-*/%(模: 取余)^(幂:2^3)

可以在模式中执行计算,awk都将按浮点数方式执行算术运算

 awk -F: '$3 * 10 > 500' /etc/passwd
  • 逻辑操作符和复合模式

&& 逻辑与, 相当于 并且 ||逻辑或,相当于 或者 ! 逻辑非 , 取反

 awk -F":" '$1~/root/ && $3<=15' /etc/passwdawk -F":" '$1~/root/ || $3<=15' /etc/passwd

常见使用

1.打印一个文件中的第2列和第5列

 # cat /etc/passwd | awk -F : '{print $2,$5}'

2.打印指定行指定列的某个字符

 # free -m | awk 'NR==2 {print $2}'

3.统计一个文件的行数

 # cat /etc/passwd | awk '{print NR}'

获取根分区的使用量

4.在awk中使用if条件判断

 ++i:从1开始加,赋值在运算i++: 从0开始加,运算在赋值if语句:{if(表达式){语句;语句;...}}​实战案例:显示管理员用户姓名[root@qfedu ~]# cat /etc/passwd | awk -F":" '{if($3==0) {print $1 " is administrator"}}'​统计系统用户数量[root@qfedu ~]# cat /etc/passwd | awk -F":" '{if($3>=0 && $3<=1000){i++}} END{print i}'

5.在awk中使用for循环

 每行打印两遍[root@qfedu ~]# awk '{for(i=1;i<=2;i++) {print $0}}' /etc/passwdroot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

数组遍历--用来统计网站日志,tcp连接状态等。

 ++i:从1开始加,运算在赋值i++: 从0开始加,赋值在运算#按索引遍历:1.先创建一个test文件# vim test.txt  #将文件内容的第一个字段作为数组的值,通过索引获取到值root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin# cat test.txt | awk -F":" '{username[x++]=$1} END{for(i in username) {print i,username[i]}}'0 root1 bin#注意:变量i是索引

真实案例

 #把要统计的对象作为索引,最后对他们的值进行累加,累加出来的这个值就是你的统计数量​1. 统计/etc/passwd中各种类型shell的数量# cat /etc/passwd | awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }'​2.统计nginx日志出现的状态码# cat access.log | awk '{stat[$9]++} END{for(i in stat){print i,stat[i]}}'​3.统计当前nginx日志中每个ip访问的数量# cat access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'​4.统计某一天的nginx日志中的不同ip的访问量# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' ​5.统计nginx日志中某一天访问最多的前10个ip# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' |sort -k2 -rn | head -n 2sort:排序,默认升序-k:指定列数-r:降序-n:以数值来排序​6.统计tcp连接的状态---下去自己查各个状态,包括什么原因造成的!# netstat -n | awk '/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}'LAST_ACK 5 (正在等待处理的请求数)SYN_RECV 30ESTABLISHED 1597 (正常数据传输状态)FIN_WAIT1 51FIN_WAIT2 504TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)

经典案例

 UV与PV统计PV:即访问量,也就是访问您商铺的次数;例如:今天显示有300 PV,则证明今天你的商铺被访问了300次。================================================================UV:即访问人数,也就是有多少人来过您的商铺;  #需要去重例如:今天显示有50 UV,则证明今天有50个人来过你的商铺。=================================================================1.根据访问IP统计UV# cat access.log | awk '{print $1}' |sort |uniq -c | wc -luniq:去重-c:统计每行连续出现的次数2.更具访问ip统计PV# cat access.log | awk '{print $1}' |wc -l或者是url# cat access.log | awk '{print $7}' |wc -l3.查询访问最频繁的URL# cat access.log | awk '{print $7}'|sort | uniq -c |sort -n -k 1 -r | more4.查询访问最频繁的IP# cat access.log | awk '{print $1}'|sort | uniq -c |sort -n -k 1 -r | more

shell编程之awk相关推荐

  1. 详解Shell编程之if语句实战(小结)

    本篇文章主要介绍了详解Shell编程之if语句实战(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 对于if语句,其实很多人都肯定的听说过,那么if语句到底是什么, ...

  2. shell编程之case语句及函数

    shell编程之case语句 文章目录 shell编程之case语句 一.case语句 1. 语法结构 2. 应用案例 二.函数 1. 什么是函数? 2. 如何定义函数? 3. 函数如何调用? ㈠ 当 ...

  3. linux下简单的shellfor循环程序,对Linux下shell编程之for循环的实例讲解

    对Linux下shell编程之for循环的实例讲解 linux 下 for 循环中可以使用 break 和 continue 关键字来跳出循环, 和java 用法一致 一.常用for循环结构 #语法一 ...

  4. shell编程之 if 判断语句

    shell编程之 if 判断语句 判断语句介绍 - if 单if 语句(一个条件一个判断结果) if..else 语句(一个条件两个判断结果) if..elif..else 语句(多条件多个判断结果) ...

  5. 【shell编程之expr的使用】

    shell编程之expr的使用 语法格式 获取expr运算的结果 expr进行算数运算 expr进行字符串的处理 练习 expr是一个shell命令,可以使用man expr查看命令的帮助手册 语法格 ...

  6. Shell 编程之 sed 与 awk

    一.正则表达式 1.正则表达式概述 使用单个字符串来描述.匹配一系列符合某个句法规则的字符串,由普通字符与特殊字 符组成,一般在使用脚本编程.文件编辑器中,如 php.python.shell 等,简 ...

  7. shell脚本编程之awk入门

    awk是一个基于列的文本处理工具,另外还有一个基于行模式的sed,本文简要介绍awk的基本使用 示例 awk按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值.分割方式默认是 ...

  8. Shell编程之if语法练习(LNMP)全过程

    大家好,我是延凯,本人原来在CSDN写作已经快一年了 都是相关Linux运维这方面的技术知识,现在搬到博客园也是我一直想的,本博客主要写Python,docker,shell等偏向开发云计算等知识点, ...

  9. SHELL编程之CASE语句+函数+正则

    case语句 一.case语句 案例1 案例2 课堂练习1 二.函数 2.1 函数定义 2.2 函数的调用 2.3 应用案例 三.综合案例 四.正则表达式 1. 什么是正则表达式 2. 第一类正则 3 ...

最新文章

  1. 触发器before和after的区别
  2. 使用条件注释完成浏览器兼容
  3. HTML5数据库建模,HTML5的五种客户端离线存储方案
  4. 洛谷 - P1725 琪露诺(动态规划+单调队列优化)
  5. android中设置菜单栏,android – 菜单项没有显示在操作栏
  6. 西浦与杭电计算机选哪个,四邮四电究竟谁强谁弱?哪三所大学报考更有性价比?...
  7. 如何查看linux服务器的白名单,linux服务器iptables防火墙白名单添加方式
  8. Mac局域网本地库server, CornerStone使用
  9. 设计-前端设计尺寸与规范
  10. JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
  11. wireshark抓包新手使用教程
  12. 如何查看Windows 桌面壁纸的位置
  13. H5: 关于底部导航使用“fixed”会遮住网页最下面内容的解决办法!
  14. 推荐算法_CIKM-2019-AnalytiCup 冠军源码解读_2
  15. NOIP2017D2T3-列队
  16. Symmetrix GK盘介绍
  17. 网神综合能力过硬 服务水利系统信息化
  18. Eyeshot Fem 2022.436 Crack
  19. ARMv8架构下修改Linux内核并打开kvm硬件虚拟化支持(平台Firefly-rk3568)
  20. 从零开始,轻松打造你的聊天机器人

热门文章

  1. 惊现“鬼影”!iPhone 11系列夜景拍照频频翻车
  2. 同比暴增3700%!百度取代谷歌成世界第二
  3. 竟然不是马云!第一个使用支付宝的人找到了 :受赠终身钻石会员
  4. 可穿戴的手机!努比亚nubia-α国行版将于4月8日正式发布
  5. 易到追债贾跃亭 乐视回应:对方无耻甩锅
  6. 十大笔记本品牌型号命名规则【惠普】
  7. uboot的readme导读(转)
  8. Java常用数据类型
  9. Java 编程下的并发线程之间的同步代码块死锁
  10. spark的java源码,Spark源码包的编译