Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用 您所在的位置:网站首页 linux命令awk提取符号之间的 Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

2024-04-24 11:41| 来源: 网络整理| 查看: 265

一、使用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 实验室设备网 版权所有