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. java URL和URLConnection

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. 前端-高潮 jQuery

    jQuery:就是让页面动起来 参考手册:http://jquery.cuishifeng.cn/ DOM/BOM/javaScript 继承的类库 <--->模块 一.查找元素 二.操作 ...

  3. 隐藏index.php

    以 Apache 为例,需要在入口文件的同级添加 .htaccess 文件(官方默认自带了该文件),内容如下:<IfModule mod_rewrite.c>Options +Follow ...

  4. ant基础[转]

    原文链接:http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html 1,什么是antant是构建工具2,什么是构建概念到处可查到 ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

  6. Spring MVC的配置和使用

    Spring MVC的配置和使用 笔记仓库:https://github.com/nnngu/LearningNotes Spring MVC需要的jar包 文章中 Spring MVC 使用的版本是 ...

  7. 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟

    因为本人目前为止学习编程不过七个月,所以后面的感悟对于一些大神来说可能嗤之以鼻,但对于一些刚刚入门的萌新来说在理解面向对象的思想上,以及抽象类和接口应该怎么设计等方面应该还是会有所帮助的 首先我们定义 ...

  8. python matplotlib 播放图片变化过程

    最近想将原图片和处理后的图片放在一起观察图片的变化过程.但是网上并么有找到有用的示例代码,所以粘出来和大家分享一下. import numpy as np import matplotlib.pypl ...

  9. 看完轻松年薪30w+

    弱鸡学git中,百度git追踪方面的博文,突然发现各种git的博文中突然插入了一个这个,不解,本以为又是某个大佬在分享他的心路历程,点进去打算喝鸡汤,666 怪不得标题党标题党这么的叫,可怕可怕,文章 ...

  10. Vue的土著指令和自定义指令

    1.土著指令 当我开始学习Vue的时候,看官网的时候看到了"指令"两个字.我愣住了,what?指令是啥啊?后来继续往下看,像这种什么"v-for""v ...