shell脚本 awk工具
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工具的更多相关文章
- linux运维自动化shell脚本小工具
linux运维shell 脚本小工具,如要分享此文章,请注明文章出处,以下脚本仅供参考,若放置在服务器上出错,后果请自负 1.检测cpu剩余百分比 #!/bin/bash #Inspect CPU # ...
- 远程shell脚本执行工具类
/** * 远程shell脚本执行工具类 */public class RemoteShellExecutorUtils { private static final Logger logger = ...
- Linux之Shell 脚本加密工具-shc
Much effort, much prosperity. 为什么要加密Shell脚本呢?当然是为了安全! 可能脚本里面涉及到密码之类的就需要进行加密了 一.下载安装shc工具 要保护自己编写的she ...
- shell脚本 awk实现实时监控网卡流量
一.简介 通过第3方工具获得网卡流量,这个大家一定很清楚.其实通过脚本一样可以实现效果.下面是我个人工作中整理的数据.以下是shell脚本统计网卡流量. 现原理: cat /proc/net/dev ...
- shell脚本 sed工具
sed工具概述(流式编辑器)非交互,基于模式匹配过滤及修改文本逐行处理,并将结果输出到屏幕可实现对文本的输出,增,删,改,查等各种操作 sed流控制:!:取反操作,根据定址条件取反n:读下一行,产生隔 ...
- shell脚本——awk
目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...
- 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 ...
- shell脚本 awk实现查看ip连接数
一.简介 处理文本,是awk的强项了. 无论性能已经速度都是让人惊叹! 二.使用 适用:centos6+ 语言:英文 注意:无 awk 'BEGIN{ while("netstat -an& ...
- Shell 编程 编辑工具 awk
本篇主要写一些shell脚本编辑工具awk的使用. 概述 awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. awk倾向于将一 ...
随机推荐
- zabbix3.2_yum官方文档centos 7版
Installation from packages 1 Repository installation 2 Server installation with MySQL database 3 Ser ...
- 【转】 要做linux运维工程师的朋友,必须要掌握以下几个工具才行
本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入 ...
- 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等
1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...
- bzoj2257: [Jsoi2009]瓶子和燃料
2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec Memory Limit: 128 MB Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了 ...
- DDMS和程序打包过程
1. Android版本对应api级别 2.3~~~~~10 3.0~~~~~11 4.0~~~~~14 4.1.2~~~16 2.3和4.1.2是最稳定的 2.Android手机常见分辨率 320* ...
- 一步一步从原理跟我学邮件收取及发送 10.四句代码说清base64
经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了.是的,马上要到程序登录的代码,base64 是必须要实现的. base64 很早以前我就接触了,在项目中也很喜欢用.但每换一 ...
- git修改目录名称
同步代码 $ git pull origin master 修改某个目录名称 $ git mv doc docs 把doc目录修改为docs 提交至远程仓库 $ git push origin mas ...
- c# 类属性和方法
属性 public 类字段 就相当于c#里面暴露给外面的属性 类似nodejs的 module.exports 但是属性又不同于普通的字段,属性只是外部包装字段 没有自己的任何含量 类似退换后的方法. ...
- Java文件上传细讲
什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...
- 从一道Python面试题说起(大神勿入)
作为一个自学Python的小白,在了解了点皮毛之后,便按捺不住自己内心的骚动,在某招聘网站上投了些简历,居然也收到了面试邀请.第二天到公司,HR废话不多讲,上来就抛出几张A4纸,"先做题吧, ...