栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Shell中的awk整理心得与案例

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shell中的awk整理心得与案例

一、awk命令解析 1、awk工具概述
awk编程语言/数据处理引擎
        - 创造者:Aho、Weiberger、Kernighan
        - 基于模式匹配检查输入文本,逐行处理并输出
        - 通常用在shell脚本中,获取指定的数据
        - 单独用时,可对文本数据做统计

2、命令格式解析
主要用法:
        - 格式1:前置命令  |  awk  [选项]  '[条件] {指令}'
        - 格式2:awk  [选项]  '[条件] {指令}'  文件.. ..(多条语句可以分号分隔)
-F:指定分隔符,可省略(默认空格或Tab位)
awk -F: '{print $1,$3}' /etc/passwd           #打印以TAB为分隔符的第1,3列
awk -F: '$1~/root/{print $1,$NF}' /etc/passwd #打印第一列和最后一列
awk '/Failed/{print $11}' /var/log/secure     #检查登录失败的IP地址有哪些
free -h | awk '/Mem/{print $4}'               #检查内存的剩余容量
ifconfig ens33 | awk -F'(' '/RX p/{print $2}'|sed 's/)//' #过滤网络流量
ifconfig ens33 | sed -ne '/RX p/ s/.*(//;/^[0-9]/ s/)//p' #等同过滤网络流量操作
ifconfig ens33 | awk '/RX p/{gsub(/(|)/,"");print $6,$7}'  #等同过滤网络流量操作
ifconfig eth0 | awk -F[()] 'NR==5{print $2}'  #等同过滤网络流量操作
3、awk内置变量
内置变量释义
FS保存或设置字段分隔符,例如FS=":",与-F功能一样
$n指定分隔的第n个字段,如$1、$3分半表示第1、第3列
$0当前读入的整行文本内容
NF记录当前处理行的字段个数(列数)
NR记录当前已读入行的数量(行数)

4、awk过滤机制
1.在所有行前处理,BEGIN{ }
        - 读入第一行文本之前执行,一般用于初始化操作
2.逐行处理,{ }
        - 逐行读入文本执行相应的处理,最常见的编辑指令块
3.在所有行后处理,END{ }
        - 处理完最后一行文本之后执行,一般用来处理结果

awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd  #统计使用bash的用户个数
二、awk处理条件 1、处理条件概述

格式:

        - awk  [选项]  '[条件] {编辑指令}'   文件 .. ..
条件表现形式:
        - 正则表达式 
        - 数值/字符串比较
        - 逻辑比较
        - 运算符

2、条件设置示例

1.正则表达式:

        - /正则表达式/

        - ~匹配、    !~不匹配

awk -F:  '/^ro/{print}' /etc/passwd   #匹配ro开头的行并打印
awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd  #匹配第7个字段不以bash结尾的用户名,登录shell
df -hT | awk '//$/{print $4}'        #打印根分区剩余容量
awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd #输出root或adm账户的用户名和UID信息

2.数值比较

== 等于、  != 不等于

>   大于、>=大于或等于

<   小于、<=小于或等于

awk 'NR==2{print}' file.txt   #输出第二行文本
awk '$2!=456{print}' test.txt #输出第二列不包含456的行
awk 'NF>=4{print}' test.txt   #输出包含4个及以上字段的行
3、多个条件的组合

逻辑比较测试:

        -   && 逻辑与:期望多个条件都成立

        -   ||    逻辑或:只要有一个条件成立即满足要求

awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd  #列出UID小于2的用户信息
awk -F: '$3==0||$3==7{print $1,$3}' /etc/passwd #列出UID为0或7的用户信息
seq 20 | awk '$1%7==0||$1~/7/'                  #列出20以内整数中7的倍数或是含7的数
awk -F":" '//bin/bash/||//bin/csh/{print $1 $7}' /etc/passwd #表示匹配到"/bin/bash","/bin/csh"才处理
awk -F":" '//bin/bash|/bin/csh/{print $1 $7}' /etc/passwd    #同上,区别是||和|
4、变量的运算

运算符:

        -     +、-、*、/、%

        -     ++、--、+=、-=、*=、/= 

awk 'NR%2==1{print}' test.txt                    #输出奇数行文本
awk 'BEGIN{i=0}{i+=NF}END{print i}' test.txt     #统计文本的总字段个数
seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print i}' #计算能同时被3和13整除的个数
awk -F: '{print $1,"的解释器:"$7}' /etc/passwd   #print不止打印变量,还可打印常量
 三、awk数组 1、数组的定义及使用
定义数组:
        - 格式: 数组名[下标]=元素值

调用数组:

        - 格式:数组名[下标]
遍历数组:

        - 用法:for (变量 in 数组名) {print  数组名[变量]}

                awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'    #i是下标,a[i]是数组元素

                0 0

                1 11

                2 22

awk 'BEGIN{a["hehe"]=11;print a["hehe"]}'  #awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
awk 'BEGIN{name[0]="tom";name[1]="bob";print name[0],name[1]}' #为数组name赋值并打印
lastb | awk '$2~/ssh:notty/{ip[$3]++} END{for(i in ip){print ip[i],i}}'|sort -n  #统计失败登录的IP,左侧打印次数
2、printf使用
参数示意说明(不加-就是右对齐)
%d十进制有符号整数%4d表示输出一个小于4位的数值时, 将在前面补0使其总宽度为4位
%u十进制无符号整数
%f浮点数%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐
%s字符串

%6.9s 表示显示一个长度不小于6且不大于9的字符串

%-9s 表示输出10个字符左对齐

%c单个字符
%p指针的值
%e指数形式的浮点数
%x,%X无符号以十六进制表示的整数
%0无符号以八进制表示的整数
%g自动选择合适的表示法
n换行
f清屏并换页
r回车
tTab制表符
xhh表示一个ASCII码用16进表示,其中hh是1到2个16进制数

%ld

%lf

长整型

double浮点数

awk -F: 'BEGIN{printf ("%-15-s%15-s%-30sn","User","Uid","Home")}$7~/bash$/{printf ("%-15s%-15s%-30sn",$1,$3,$6);i++}END{print "Total",i,"lines."}' /etc/passwd      
#过滤结尾为bash的行,格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、
#UID、家目录信息,最后一行提示一共已处理文本的总行数
3、awk内置字符串函数
函数释义
gsub(r、s)在整个$0中用s替代r
gsub(r、s、t)在整个t中用s替代r
index(s,t)返回s中字符串t的第一位置
length(s)返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
gensub(x,y,z[,A])全局替换,匹配正则x, 用y替换,z为指定替换目标是第几次匹配,A为指定替换目标是哪个域如$1,$2,若无A指$0,返回值为target替换后内容(未替换还是返回 target原内容),与sub、gsub不同的是,target内容替换后不改变
gensub(/123/,"x",1,$1)替换$1中 第一次匹配到的123为字符x,返回值为$1替换后的内容,且$1的内容并没有改变
gensub(/a(.*)b/,"\1",1)返回值为匹配正则第1对()内的内容
gensub(/a(.*)b(.*)c/,"\2",1)返回值为匹配正则第2对()内的内容

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号