Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用 | 您所在的位置:网站首页 › linux命令awk提取符号之间的 › Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用 |
一、使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法 2> 提取本机的IP地址、根分区使用率 3> 格式化输出/etc/passwd文件中的用户名、UID、宿主目录信息 格式化输出passwd文件内容时,要求第一行为列表标题,最后一行提示一共已处理文本的总行数,如下图所示。 步骤: 步骤一:awk文本过滤的基本用法 1)基本操作方法 格式:awk [选项] '[条件]{编辑指令}' 文件 其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。 处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。 直接过滤文件内容: [root@svr5 ~]# awk '{print $1,$2}' /etc/rc.local //输出文件的第1、2列 #!/bin/sh # # This # You # want touch /var/lock/subsys/local 结合管道过滤命令输出: [root@svr5 ~]# uname -a //正常的完整输出 Linux svr5.tarena.com 2.6.18-348.el5 #1 SMP Wed Nov 28 21:22:00 EST 2012 x86_64 x86_64 x86_64 GNU/Linux [root@svr5 ~]# uname -a | awk '{print $1,$3,$12}' //输出第1、3、12字段 Linux 2.6.18-348.el5 x86_64 2)选项 -F 可指定分隔符 截取/etc/passwd文件的前7行,用来创建一个测试文件,操作如下: [root@svr5 ~]# head -7 /etc/passwd > passwd.txt [root@svr5 ~]# cat passwd.txt root:x:0:0:root:/root:/bin/bash 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 输出passwd.txt文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下: [root@svr5 ~]# awk -F: '{print $1","$7}' passwd.txt root,/bin/bash bin,/sbin/nologin daemon,/sbin/nologin adm,/sbin/nologin lp,/sbin/nologin sync,/bin/sync shutdown,/sbin/shutdown 或者: [root@svr5 ~]# awk -F ":" '{print $1","$7}' passwd.txt root,/bin/bash bin,/sbin/nologin daemon,/sbin/nologin adm,/sbin/nologin lp,/sbin/nologin sync,/bin/sync shutdown,/sbin/shutdown awk还识别多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段: [root@svr5 ~]# awk -F [:/] '{print $1,$10}' passwd.txt root bash bin nologin daemon nologin adm sbin lp sync sync shutdown shutdown 输出每次处理的行号,以及当前行以“:”分隔的字段个数: [root@svr5 ~]# awk -F: '{print NR,NF}' passwd.txt 1 7 2 7 3 7 4 7 5 7 6 7 7 7 3)awk处理的时机 awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。在命令格式上分别体现如下: 行前处理,BEGIN{ } 逐行处理,{ } 行后处理,END{ } 上述编辑指令段可以包含在一对单引号内,比如: awk [选项] ' BEGIN{编辑指令 } {编辑指令} END{编辑指令}' 文件 只做预处理的时候,可以没有操作文件,比如: [root@svr5 ~]# awk 'BEGIN{A=1024;print A*2.56}' 2621.44 举个包括三个处理时机的例子——“统计系统中使用bash作为登录Shell的用户总个数:预处理时赋值变量x=0,然后逐行读入/etc/passwd 文件检查,如果发现登录Shell是/bin/bash则x增加1,全部处理完毕后,输出x的值即可。相关操作及结果如下: [root@svr5 ~]# awk 'BEGIN{x=0}/\=5{print}' passwd.txt 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 输出用户名为“sync”的行: [root@svr5 ~]# awk -F: '$1=="sync"{print}' passwd.txt sync:x:5:0:sync:/sbin:/bin/sync 输出当前用户的用户名、宿主目录、登录Shell信息: [root@svr5 ~]# awk -F: '$1==ENVIRON["USER"]{print $1,$6,$7}' passwd.txt root /root /bin/bash 3)逻辑测试条件 输出第3~5行文本: [root@svr5 ~]# awk -F: 'NR>=3&&NR=3)&&(NR=501&&$3500){i++}}END{print i}' /etc/passwd 28 统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数: [root@svr5 ~]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}'\ /etc/passwd 29 统计/etc/passwd文件中登录Shell不是“/bin/bash”的用户个数: [root@svr5 ~]# awk -F: 'BEGIN{i=0}{if($7!~/bash$/){i++}}END{print i}'\ /etc/passwd 38 2)双分支 分别统计/etc/passwd文件中UID小于或等于500、UID大于500的用户个数: [root@svr5 ~]# awk -F: 'BEGIN{i=0;j=0}{if($3=6{print}' /etc/passwd #输出列数大于或等于6的行# awk '$2!="XX"{print}' /etc/passwd #输出第2行文本不是XX的行# awk '/^(127|192)/' /etc/hosts #输出开头是127或192开头的行 3、逻辑判断&& ||# awk -F: '$3>10 && $3=1000){x++} else{y++}} END{print x,y}' /etc/passwd 正则: /正则/ 对整行匹配 $n~/正则/ 对某一列匹配 $1~/root/ 对第一列匹配是否包含root
|
CopyRight 2018-2019 实验室设备网 版权所有 |