awk工具概述
awk编程语言/数据处理引擎
基于模式匹配检查输入文本,逐行处理并输出
通常在shell脚本中,或取指定的数据
单独用时,可对文本数据做统计

命令格式
格式一:awk [选项] '[条件]{编辑指令}' 文件
格式二:前置命令 | awk [选项] '[选项]{编辑指令}'

常用命令选项:
-F:指定分隔符,可省略(默认空格或tab位)
-f:调用awk脚本进行处理
-v:调用外部shell变量

实例:
[root@ceshiji ~]# awk '{print $1}' /etc/passwd
[root@ceshiji ~]# awk -F: '{print $1}' /etc/passwd

awk内置变量
变量 用途
FS 保存或设置字段分隔符,例如 FS=":"
$n 指定分隔得第n个字段,如$1,$3分别表示第1,第3列
$0 一整行
NF 记录当前处理行的字段列数
NR 当前行号
FNR 当前行在源文件中的行号
FILENAME 当前处理的文件名
ENVIRON 调用shell环境变量,格式:ENVIRON["变量名"]
awk自定义变量:awk 'BEGIN{name="hydra";x=101;print name,x}'
调用shell变量:
-v:调用shell自定义变量,调用shell系统环境义变量

实例:
[root@ceshiji ~]# awk '/Failed/{print $11}' /var/log/secure |uniq -c(统计本机被攻击次数)

awk过滤的时机:
(可单独使用,也可以同时一起使用)

awk执行过程:
行前处理:把数据的初始化操作,写在行前处理
BEGINE{ }

逐行处理:对每一行都处理
{ }

行后处理:做总结性输出
END{ }

awk语法格式:
awk 选项 ""文件列表
awk 选项 '条件{ }' 文件列表
awk 'BEGINE{ }{ }END{ }' 文件

实例:
[root@ceshiji ~]# awk 'BEGIN{a=34;print a+12}'(预处理不需要数据文件)
[root@ceshiji ~]# awk 'BEGIN{x=0}/\<bash>$/{x++}\END{print x}' /etc/passwd(统计bash用户个数)

条件的表现形式:
正则表达式
数值/字符串比较
逻辑比较
运算符

正则表达式
数据 符号 /正则表达式/(正则符号:. * $ ^ [] { }() ^[] [^ ] ? + \> \b)
匹配:~
不匹配:!~
[root@ceshiji ~]# awk -F: '/^ro/{print}' /etc/passwd(匹配以ro开头的用户记录)
[root@ceshiji ~]# awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd(匹配第7个字段不以bash结尾的用户名登陆shell)

字符/数值比较
==:等于
!=:不等
>:大于
>=:大于等于
<:小于
<=:小于等于
数据 符号 "字符串"

[root@ceshiji ~]# awk 'NR==2{print}'a.txt(输出第二行文本)
[root@ceshiji ~]# awk '$2="xx"{print}'a.txt(输出第二列不是xx的行)
[root@ceshiji ~]# awk 'NF>=2{print}'a.txt(输出包含2个及以上字段的行)
[root@ceshiji ~]# awk 'NR >=5 && NR<=10{print FNR,$0}' /etc/passwd(输出文件中的5-10行)

逻辑比较测试
&&:期望多个条件都成立
||:只要有一个条件成立即满足要求
[root@ceshiji ~]# awk -F: '$3>=0&&$3<2{print$1,$3}'/etc/passwd(列出uid小于2的用户信息)

运算符
+ - * / %
++ -- += -= *= /=
[root@ceshiji ~]# awk 'NR%2==0{print NR,$0;i++}'END{print i}' /etc/paswd(输出偶数行的内容,并统计个数)
[root@ceshiji ~]# seq 31 69 | awk '$0%7==0||$0~/7/{print $0;i++}END{print i}'(输出31-69之间包含7或者7的倍数的数,并统计)

综合实例:
根据/etc/passwd提取密码串
找到使用bash作登陆shell的本地用户
列出这些用户的shadow密码记录
按每行 用户名——》密码记录 保存结果
#!/bin/bash
user=`awk -F '/bash$/s/:.*//p' /etc/passwd`
for i in $user
do
awk -F: -v x=$i '$1==x{print $2}' /etc/shadow
echo "$ipass$pass"
done

——————————————————————————————————————————————————
awk和shell的区别:
shell:if[];then
命令
else
fi

awk:if(END){命令}
else {命令}

awk流程控制
分支结构:
单分支
if(条件){执行命令}
双分支
if(条件){执行命令1}else{执行命令2}
多分支
if(条件){执行命令1}else if(条件){执行命令2}else{执行命令N}

实例:
统计uid大于或等于500的用户个数:
[root@ceshiji ~]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}}else{j++}}END{print i,j}' /etc/passwd
统计内建个数和外键用户个数:
[root@ceshiji ~]# awk 'BEGIN{FS=":";i=0;j=0;z=0}{z++}{if($3<500){i++}else{j++}}END{print "inside user is "i;print "outside user is"j;print "sum user is"z}' /etc/passwd
闲长可以写为脚本下次直接调用
#!/bin/awk -f
BEGIN{FS=":";i=0;j=0;z=0}
{z++}
{
if($3<500){
i++}
else{
j++}}
END{
print "inside user is "i
print "outside user is"j
print "sum user is"z
}

循环结构
while循环:
while(条件){执行命令}

do while循环:
do{执行命令}while(条件)

示例:
统计/etc/passwd文件内root出现次数,利用-F[:/]表示分隔符为:或者/
[root@ceshiji ~]# awk -F"[:/]" '{i=1;while(i<=NF){if($i="root"){j++}i++}}' /etc/passwd
输出1-10的数:
awk 'BEFIN{i=1;while(i<=10){print i;i++}}'(while循环)
awk 'BEFIN{i=1;do{print i;i++}while(i<=10)}' (do while循环)

for循环
for(初值;条件;步长){执行命令}
[root@ceshiji ~]# awk 'BEGIN{for(i=1;i<=5;i++){print i}}'
[root@ceshiji ~]# awk 'BEGIN{ for (i=1;i<=10;i++){ print i}}'(输出1-10的数)

流程控制函数(控制循环结构的执行)
关键字 含义
break 结束当前的循环体
continue 结束本次循环,转入下一次循环
next 跳过当前行,让awk处理下一行
exit 结束awk对数据的处理,如果有END{}的话执行其内的命令,如果没有则退出awk处理

示例:
awk 'BEGIN{for(i=1;i<=10;i++){if(i==3){break};print " "i}}'(i=3时结束循环)
awk 'BEGIN{for(i=1;i<=5;i++){if(i==1||i==3){continue};print " "i}}'(不输出1和3)
awk 'FNR==9{next}{print FNR,$1}' a.txt(到了第9行跳过,处理下一行)
awk 'BEGIN{print NR}{print NR,FNR,$0}END{print NR}'a.txt
awk 'FNR==6{exit}{print FNR,$0}END{print NR}' a.txt(处理到行号为6的时候,再处理END里面的内容)

——————————————————————————————————————————————————————
awk数组

数组的定义及使用
定义数组
格式:数组名[下标]=值(下标和值可以用数字和字符,下标和值是字符时要用""号)
使用数组
格式:数组名[下标]
输出数组元素:
格式: print 数组名[下标]

示例:为数组name赋值两个元素,值分别为jim,tom
[root@ceshiji ~]# awk 'BEGIN{name[0]="jim";name[1]="tom";print name[0],name[1]}'

示例:把网段192.168.1.0/24ip地址保存到数组ipgrp里,然后把前十个ip输出
[root@ceshiji ~]# awk 'BEGIN{for(i=1;i<=254;i++){ipgrp[i]="192.168.1."i};j=1;while(j<=10){print ipgrp[j];j++}}'

示例:用awk写出访问过我的ip地址及次数:
[root@redhat ~]# awk '{ipgrp[$1]++}END{ for (ip in ipgrp){print ip,ipgrp }}' /etc/httpd/logs/access_log

遍历数组的专属循环结构
用法:for(变量 in 数组名){print 数组名[变量]}
[root@ceshiji ~]# awk 'BEGIN{FOR(I=1;I<=5;I++){IPGRP[I]="1.1.1."i};for(x in ipgrp){print x,ipgrp[x]}}'
[root@ceshiji ~]# head /etc/passwd |awk -F ":" '{usergrp[$1]=$3}END{for(j in usergrp){print j,usergrp[j]}}'
[root@ceshiji ~]# awk '{agrp[$0]++}END{for(x in agrp){pirint x,agrp[x]}}' a.txx

awk数组的经典应用
去除文本的重复行
用法:awk '!a[$0]++' fileame
逐行分析,遇到重复行跳过
实例:列出/etc/passwd中的登陆shell种类
[root@ceshiji ~]# awk -F: '!a[$7]++{print $7}' /etc/passwd

sort工具
-n:按数字升序排列
-k:针对指定的字段进行排序
-r:反向排序

————————————————————————————————————————————————————————

shell脚本 awk工具的更多相关文章

  1. linux运维自动化shell脚本小工具

    linux运维shell 脚本小工具,如要分享此文章,请注明文章出处,以下脚本仅供参考,若放置在服务器上出错,后果请自负 1.检测cpu剩余百分比 #!/bin/bash #Inspect CPU # ...

  2. 远程shell脚本执行工具类

    /** * 远程shell脚本执行工具类 */public class RemoteShellExecutorUtils { private static final Logger logger = ...

  3. Linux之Shell 脚本加密工具-shc

    Much effort, much prosperity. 为什么要加密Shell脚本呢?当然是为了安全! 可能脚本里面涉及到密码之类的就需要进行加密了 一.下载安装shc工具 要保护自己编写的she ...

  4. shell脚本 awk实现实时监控网卡流量

    一.简介 通过第3方工具获得网卡流量,这个大家一定很清楚.其实通过脚本一样可以实现效果.下面是我个人工作中整理的数据.以下是shell脚本统计网卡流量. 现原理: cat /proc/net/dev ...

  5. shell脚本 sed工具

    sed工具概述(流式编辑器)非交互,基于模式匹配过滤及修改文本逐行处理,并将结果输出到屏幕可实现对文本的输出,增,删,改,查等各种操作 sed流控制:!:取反操作,根据定址条件取反n:读下一行,产生隔 ...

  6. shell脚本——awk

    目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...

  7. shell脚本awk的基本用法

    AWK 1 AWK 2 3 linux取IP地址 4 5 ifconfig | grep -w inet | sed -n '1p' | awk '{print $2}' 6 7 eg: 8 9 aw ...

  8. shell脚本 awk实现查看ip连接数

    一.简介 处理文本,是awk的强项了. 无论性能已经速度都是让人惊叹! 二.使用 适用:centos6+ 语言:英文 注意:无 awk 'BEGIN{ while("netstat -an& ...

  9. Shell 编程 编辑工具 awk

    本篇主要写一些shell脚本编辑工具awk的使用. 概述 awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. awk倾向于将一 ...

随机推荐

  1. 浅谈TreeMap以及在java中的使用

    treemap结构是红黑树 1.先介绍一下平衡二叉树 其特点是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.也就是说该二叉树的任何一个子节点,其左右子树的高度 ...

  2. MySQL --当AUTO_INCREMENT自增遇到0

    熟悉SQL Server的DBA都知道,在SQL Server中如果想要显示制定自增值,除了在INSERT语句中显示写明自增列外,还需要使用SET IDENTITY_INSERT TB_NAME ON ...

  3. iometer测试工具

    简介 Iometer 为计算机I/O子系统所作的工作就如同测力计为引擎所作的工作一样:它测定在可控制的负荷下系统的性能.Iometer 以前被称为"伽利略". Iometer 既是 ...

  4. 刚买个炼狱蝰蛇1800dpi的下完驱动提示没有发现鼠标

    2017-02-19补充:可以下载下面的程序 ,也可以访问 http://cn.razerzone.com/synapse/  下载雷云 也可解决问题 ------------------------ ...

  5. 有关mysql的for update以及 死锁问题

    一.先说锁的概念 锁级别: 1.行级锁: InnoDB引擎(也支持表级锁,默认是行级锁),开销大,加锁慢:会出现死锁.锁定粒度最小,发生锁冲突的概率最低,并发度最高. 2.表级锁:MylSAM引擎和M ...

  6. 【原创】前端开发人员如何制作微信小程序模板

    (我的博客网站中的原文:http://www.xiaoxianworld.com/archives/305,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 最近接触了一下微信小程 ...

  7. 安装golang的mongodb驱动mgo速记

    这里介绍的方法只适用于Centos平台,测试版本为centos 6.5 下载源码安装实在麻烦,这里采用比较简单的方法给GO安装mongodb驱动 安装mgo之前,需要先安装bzr yum -y ins ...

  8. 解决AspNet Zero Core 5.0.1无法运行的问题

    最近在研究AspNet Zero Core 5.0.1时发现VS点击调试后就自动退出了,从ABP QQ群里得知作者加入了licensecode校验.经过一个周左右断断续续的折腾,算是破解了吧.原本想把 ...

  9. xBIM IFC 层次结构

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  10. Java基础之Throwable,文件加载

    Java中的异常与错误都继承自Throwable,Exception又分为运行时异常(RuntimeException)和编译时异常. 运行时异常是程序的逻辑不够严谨或者特定条件下程序出现了错误,例如 ...