第1章 awk扩展命令
awk 是一门语言 单行脚本 一般用来统计计算
语法是 awk 参数 ‘模式 条件 {动作}’
条件:
比大小 < > == != 等符号
正则 某一列的什么字符 n!~/匹配内容/
范围条件 2~/匹配内容/ 第二列的xx到xx的信息
动作: print 显示 打印
gsub 修改内容
模式:
BEGIN : 在awk之前执行什么操作
常用于计算
END : 在awk执行之后执行什么操作 常用于显示最后的内容
内置变量:OFS=xx OFS定义等于什么 显示内容列之间分隔符就是什么
awk 执行原理
awk 读取文件之前
命令行参数 -F/-v
BEGIN{}模块
awk 读取文件
读取1行 进行判断
满足:执行对应的动作
不足满足:继续下一行
awk 读取文件之后
执行END{}显示结果
练习题:
将第一行当道最后一行显示 最后一行到第一行
awk -F: '{ n=$1; $1=$NF; $NF=n; }1' /etc/passwd
思路 将$1的值放到一个临时变量(容器)中 再将最后一行放到空的$1中 再把变量中的值给空的$NF就完成了调换 输出即可
awk判断
格式:
if (条件) 命令 # 单分枝
if (条件)else 命令 # 多分枝
例子
free -m |awk 'NR==2{if($NF<=5000) print "you server is down"}
you server is down # 判断剩余内存小于5000 报警
awk for循环
格式
for (i=0;i<=10;i++) 命令;
例子
[root@m01 /server/files]# awk 'BEGIN{for(i=1;i<=100;i++) sum+=i; print sum}’
计算1-100的和值
第2章 awk数组
2.1 赋值数组格式
awk ‘BEGIN { ip[0]=“10.0.0.1“ ; ip[1]=”abc” ; print ip[0]; print ip[1]}’
awk数组在直接赋值时需要加上双引号 特别是英文
因为在awk中 英文字母会被当作是一个变量 所以我们用双引引起来代表字符串
2.2 循环显示数组值
awk 'BEGIN{ ip[0]="10.0.0.1"; ip[1]="10.0.0.2"; for (i in ip) print ip[i],i}'
10.0.0.1 0
10.0.0.2 1
2.3 awk 自动数组赋值
利用两个公式
i[$列]++
sum[$列]=sum+$列
i[ ]++
去重计数
sum[ ]+=sum
去重求和
去重计数
例 统计nginx的access.log日志中 每个ip访问次数
awk ‘{ip[$1]++}END{for (i in ip) print ip[i],i }’ access.log
显示的好看一点
awk '{ip[$1]++}END{for (i in ip) print ip[i],i }' access.log | sort -n | column -t sort
#排序 n排序 r倒序显示 k2 按二列来排序
记号公式套用即可
去重求和
例 :显示每个ip访问时以供使用的流量
awk '{ip[$1]+=$9}END{for (i in ip)print ip[i],i}' access.log
好看一点
awk '{ip[$1]+=$9}END{for (i in ip)print ip[i],i}' access.log | sort -n | column -t
利用公式 ip[$1]+=$9 等同于 ip=ip+n
第3章 windows传输文件到linux注意事项
这里需要注意一点 日志或脚本在windows下打开编辑过后 需要利用用命令dos2unix 进行转义
因为在windows中换行符是 ^M 而在linux中换行为 \n 和 $
相互换行符不一致 容易造成脚本执行出现诡异错误 日志无法分析
linux换行符 :使用命令 dos2unix转换
[root@m01 ~]#**dos2unix** /server/scripts/123.txt
dos2unix: converting file 123.txt to Unix format ...