一.基本操作方法
#########################################
grep 按行进行查找
vim  编辑文档,交互式
##########################################
1.1概述
是一门编程语言/数据处理引擎,Aho,Weinberger,Kernighhan.
1.2 命令格式解析
格式:awk [选项] '[条件]{指令}' 文件
其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
Awk过滤数据时支持仅打印某一列,如第2列、第5列等。
处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。
1.3 内值变量
1.3.1 基本操作方法
# awk '{print}'           2.txt  ---> 查看,原样输出
# awk '{print $1,$3}'     2.txt  ---> 查看第1、3列(默认空格分割)
# df -h | awk '{print $4}'       ---> 打印磁盘的剩余空间
# awk -Fo '{print $0}'    2.txt  ---> $0始终打印全部
1.3.2 选项 -F可指定分隔符(指定的分隔符后面一定要有一个空格)
# awk -Fe '{print $1,$2}' 2.txt  ---> 以e分割(会删除),第1个e前是$1,第1个e与第2个e之间是$2(包含空格),最后一个e之后的所有东西是最后一个$,后续没有则以空格代替。
1.3.3 awk常用内置变量:
# $0   文本当前行的全部内容
# $1 文本的第1列
# $2 文件的第2列
# $3 文件的第3列,依此类推
# NR 文件当前行的行号
# NF 文件当前行的列数(有几列)
# awk -Ft '{print NR,NF}'       2.txt ---> 打印出类似于" x(行) x(列)"
1.3.4 打印常量
# awk -Fe '{print $1,"哈哈",$2}' 2.txt ---> 等于在原来分离出来的项的基础上,插入一个常量项,前面有空格
1.4 案例 
1.4.1 筛选出: 7.1G
文件系统        容量  已用  可用 已用% 挂载点
/dev/vda1        10G  3.0G  7.1G   30% /
devtmpfs        906M     0  906M    0% /dev
tmpfs           921M   80K  921M    1% /dev/shm
# df -h | awk '/\/$/{print $4}'  或者
# df -h | awk '/^\//{print $4}'  (遇到 / 要采用反斜杠转义 \/)
1.4.2 提取本机的网络流量
[root@svr5 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.4.21  netmask 255.255.255.0  broadcast 192.168.4.255
        inet6 fe80::fa64:c143:ad6a:5159  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:b3:11:11  txqueuelen 1000  (Ethernet)
        RX packets 313982  bytes 319665556 (304.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51809  bytes 40788621 (38.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# ifconfig eth0 | awk '/RX p/{print $5}'    //过滤接收数据的流量
# ifconfig eth0 | awk '/TX p/{print $5}'    //过滤发送数据的流量
1.4.3 查看/var/secure日志,查看谁登陆成功,谁登陆失败
Dec 11 14:18:39 room9pc01 sshd[10995]: Accepted password for root from 176.233.6.123 port 59384 ssh2
Dec 14 11:34:50 room9pc01 sshd[6772]: Failed password for root from 176.233.6.40 port 45378 ssh2
# awk '/Failed/{print $11}' secure      ---> 查看谁登陆失败
# awk '/Acc/{print $0}'     secure      ---> 查看谁登陆成功
1.5 awk处理的时机
awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。在命令格式上分别体现如下:
awk  [选项]  '[条件]{指令}'  文件
awk  [选项]  ' BEGIN{指令} {指令} END{指令}'  文件
BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
{ } 逐行处理,读取文件过程中执行,指令执行n次
END{ } 行后处理,读取文件结束后执行,指令执行1次
案例:
# awk 'BEGIN{A=24;print A*2}'           ---> 48
# awk 'BEGIN{print x+1}'                ---> 1  (x可以不定义,直接用,默认值位0)
# awk 'BEGIN{print 1.5+2.5}'            ---> 4
实例1:举个例子(统计系统中使用bash作为登录Shell的用户总个数):
a.预处理时赋值变量x=0
b.然后逐行读入/etc/passwd文件,如果发现登录Shell是/bin/bash则x加1
c.全部处理完毕后,输出x的值即可。
# awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd (END前面可以是空行,也可以没有)
实例2:统计文件行数
# awk 'BEGIN{print NR}END{print NR}' 2.txt    0 #预处理时,行数为0
                                                            2 # 文件总行
二.awk处理条件
# ~ 匹配   !~ 不匹配
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 
案例1:列出/etc/passwd中以ro开头的用户记录(整行)
# awk    '/^ro/{print}'                                    /etc/passwd
案例2:找出不以bash结尾的记录的用户名
# awk -F: '$7!~/{bash$}/{print "用户有",$1,"是否登陆标示",$7}' /etc/passwd
案例3:找出不以nologin结尾的记录的用户名
# awk -F: '$7!~/nologin$/{print $1,$7}'                    /etc/passwd
案例4:找出root和adm开头的用户记录
# awk -F: '/^(root|adm)/{print}'                           /etc/passwd
2.2 使用数值/字符串比较设置条件
比较符号:==(等于)         !=(不等于)   >(大于)
           >=(大于等于)  <(小于)      <=(小于等于)
案例:
# awk 'NR==2{print}'           2.txt  ---> 输出第二行
# awk '$2!="XX"{print}'        2.txt  ---> 输出第二列不是XX的所有行
# awk 'NF>=2{print}'           2.txt  ---> 输出列数大于等于2的行
lisi:x:1002:1002::/home/lisi:/bin/bash
# awk -F: '$3>=1000{print $1,$3}' /etc/passwd  ---> 列出UID大于1000的用户
# awk -F: '$1=="root"'            /etc/passwd  ---> 输出用户名时root的行
逻辑测试条件
# awk -F: '$3>10 && $3<20'        /etc/passwd  ---> 输出UID大于10小于20的行
# awk -F: '$3>1000 || $3<10'      /etc/passwd  ---> UID大于1000或小于10
数学运算 + - * / % ++  ——  +=  -=  *=  /=
# awk 'NR%2==1{print}'         1.txt  ---> 输出奇数行
# awk 'BEGIN{x++;print x}'            ---> 初始值为0,自加1,输出
# awk 'BEGIN{x=8;x+=2;print x}'       ---> 10
# awk 'BEGIN{print 23%8}'             ---> 7
# seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($o%13==0){i++} END{print i}' -->能被3和13整除
# awk '/^(192|127)/' /etc/hosts       ---> 输出127或者192开头的记录
# seq 100 | awk '$i%7==0||$i~/7/'     ---> 7的倍数或包含7的数
# awk -F: '{print tolower($1)}' /etc/passwd  --->大写转小写(toupper 大写)
# awk -F: '{print length($1)}'  /etc/passwd  --->求每行长度
三.综合脚本应用
要求:找到使用bash作登录Shell的本地用户,列出这些用户的shadow密码记录,按每行“用户名 -- 密码记录”保存结果
#!/bin/bash
A=$(awk -F: '/bash$/{print $1}' /etc/passwd)
for i in $A
do
  grep $i /etc/shadow | awk -F: '{print $1,"--->",$2}'
done
 
四.流程控制:if分支结构(单分支、双分支、多分支)
              练习awk数组的使用
4.1 单分支
统计/etc/passwd文件中UID小于或等于1000的用户个数:
# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数:
awk -F: '{if($7~/bash$/){i++}}END{print i}'  /etc/passwd
4.2 双分支
分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数:
# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd
分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:
# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
4.3 数组
4.3.1 数组的语法格式
数组是一个可以存储多个值的变量,具体使用的格式如下:
定义数组的格式:数组名[下标]=元素值
调用数组的格式:数组名[下标]
遍历数组的用法:for(变量 in 数组名){print 数组名[变量]}。
# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'   ---> 赋值数组并输出
# awk 'BEGIN{a[0]++;print a[0]}'                 ---> 首项默认0,自加为1
# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' 
          0 0          rem:for (in i in a) 指的是下标 
          1 11         rem:i时下标号
          2 22         rem:a 默认时下标
# awk 'BEGIN{a["hehe"]=11;print a["hehe"]}'      ---> 下标是字符串
 
五.awk扩展应用:分析Web日志的访问量排名,要求获得客户机的地址、访问次数,并且按照访问次数排名
分析:awk统计Web访问排名
在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。
针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序。
# awk '{ip[$1]++} END{for(i in ip) {print ip[i],i }}' /var/log/httpd/access_log  --->提取
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -n/r  --->排名
5.1 sort用法
# sort -n ---> 按数字升序排列
# sort -k ---> 针对指定的列进行排序
# sort -r ---> 反向排序
*:awk 的指令需要'  '(单引号)
# 扩展:输出颜色文字: echo -e "\033[31(-37)m文字\033[0m"
# awk '{print NR}' ---> 逐行打印行数,从上往下以此叠加
# awk '{print $NR}'---> 打印第n行第n列(1 1)(2 2)(... ...)
# awk '{print NF}' ---> 打印每一行的列数,从上往下打印
# awk '{print $NF}'---> 打印每一行最后一列
# head -1 /etc/passwd | xargs (-p) (-n 1) -d "xx" ---> -d:以xx分割;-n 每次n个组合在一起,每次传一串;  -p :一次传一个,并且人机交互

Shell 06 awk的更多相关文章

  1. AWK增强的文本处理shell特征--AWK完全手册

    AWK这是一个很好的文字处理工具. 它不仅 Linux 中也是不论什么环境中现有的功能最强大的数据处理引擎之中的一个. 本文主要摘录池中龙写的Unixawk使用手冊(第二版),对当中内容略微修改.感谢 ...

  2. CU社区shell板块awk十三问整理

    CU社区shell板块awk十三问整理 一.RS="" 当 RS="" 时,会将\n强制加入到FS变量中,因为RS为空时,是将连续多空行作为分隔符,近似于\n\ ...

  3. Shell 学习—AWK介绍

    Shell 学习—AWK = = = 安装awk root@kiki-desktop:~/shell# apt-get install gawk gawk-doc = = = awk 是一种程序语言. ...

  4. Shell之awk

    Shell之awk 目录 Shell之awk 一.awk概述 1. awk的工作原理 2. 命令格式 3. awk常见的内建变量(可直接用) 二.操作实例 1. 按行输出文本 2. 按字段输出文本 3 ...

  5. shell中awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  6. shell 统计 awk

    time awk '{a[$1]++}END{for(i in a){printf("%d\t%s\n",a[i],i)}}' access.log | sort -nr | he ...

  7. shell 之awk 关联数组高级应用

    最近由于数据迁移过,有些用户信息需要再次确认下,也许数据量比较大,但是需要最终确认的比如说是用户ID和其对应的用户积分数,这样就会导致出现文本a(老的数据),文本b(新的数据).比如 这是文本a.tx ...

  8. shell脚本 awk工具

    awk工具概述awk编程语言/数据处理引擎基于模式匹配检查输入文本,逐行处理并输出通常在shell脚本中,或取指定的数据单独用时,可对文本数据做统计 命令格式格式一:awk [选项] '[条件]{编辑 ...

  9. 【shell】awk按域去除重复行

    首先解释一下什么叫“按域去除重复行”: 有的时候我们需要去除的重复行并不是整行都重复,两行的其中一列的元素相同我们有的时候就需要认定这两行重复,因此有了今天的内容. 去除重复行shell有一个原生命令 ...

随机推荐

  1. 无服务架构在IOT的应用场景——使用函数工作流处理DIS数据

    在物联网领域,复杂性往往并非在于传感器,真正的复杂性在于各种传感器产生的大量数据,以及对这些数据的处理,所以开发者不得不花费大量的时间去构建和维护后端服务器来处理这样一个庞大的数据流.而在今天这个敏捷 ...

  2. [eclipse]UML之AmaterasUML 插件

    软件体系结构分析软件设计模式要求给出相应设计模式源码对应的UML类图,在此之前我安装过一种UML插件,可以自动生成一个源码包对应的UML类图,但是重装过系统,所以软件包括eclipse都重新下载了新的 ...

  3. 普通表分区改造_rename方式

    一.需求 配合开发人员,对业务临时表进行分区改造(业务认为的临时表,只需要保留近一月数据,并非oracle临时表类型) 二.如下记录完整过程 开发需求 TS_PM 以time_key分区 .沟通明确方 ...

  4. PL/SQL Developer的错误提示弹框的文本显示乱码问题

    问题:Windows中文环境下,PL/SQL Developer的错误提示弹框文本为乱码,如下: 解决过程:1.使用SELECT * FROM v$nls_parameters;查询得知服务器的字符集 ...

  5. TCP协议和UDP协议的对比【转】

    原文:https://blog.csdn.net/lzj2504476514/article/details/81454754 一.TCP协议的主要特点(1)TCP是面向连接的运输层协议:(2)每一条 ...

  6. HashSet和CopyOnWriteArraySet(转载)

    前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...

  7. python matplotlib以日期为x轴作图

    from datetime import datetime, date, timedelta import matplotlib.pyplot as plt import tushare as ts ...

  8. Go 缓冲信道

    缓冲信道 语法结构:cap为容量 ch := make(chan type, cap) 缓冲信道支持len()和cap(). 只能向缓冲信道发送容量以内的数据. 只能接收缓冲信道长度以内的数据. 缓冲 ...

  9. 单选框 RadioButton

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  10. CentOS7安装CDH 第一章:CentOS7系统安装

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...