AWK是什么
Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。
逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令
可以在免交互的情况下,实现复杂的文本操作。完成自动化配置。
awk格式
awk '操作符 action' file
操作符:想干啥
action:怎么做
file:处理对象
例如:
awk 'BEGIN{x=1};{x++};END{处理动作}' 文件名
awk '操作符 {处理动作}' 文件名
{}外部表示定义条件
{}内指定操作
BEGIN对条件做初始化操作
for ((i=1;i<=10;i++))
awk常用选项
-F:指定分隔符,如果是空格,tab键,可以不加
-v:变量赋值,awk无法从外部获取变量
awk的内置变量:
NR:需要处理行号
FS:列分隔符 和F作用一致,如果用FS,则 FS=":"
OFS:输出内容的列分隔符
NF:表示最后一个字段
$n:内置变量
显示行号
显示行号和内容
第三行和第五行
第三行到第五行
第三行到第五行
打印偶数行
打印奇数行
awk的运算--求幂运算
[root@hj ~]# awk 'BEGIN{print 2^3}'
8
[root@hj ~]# awk 'BEGIN{print 2**3}'
8
awk按行取列(最重要)
awk -F: '{print $2,$NF}' /etc/passwd
大写的NF为最后一列
$x:第几列
表示打印第二列和最后一列
AWK的精确筛选
$n (> < ==);进行数值对比
$n~"字符串" 代表这个字段包含某个字符串
$n!~"字符串" 代表这个字段不包含某个字符串
$n=="字符串" 代表这个字段要和字符串相同
$n!="字符串" 取反,不为某个字段
$NF:代表最后一个字段
下面举几个例子方便大家理解:
1./etc/passwd 输出最后一个字段中包含bash所在行的第一个字段和最后一个字
awk -F: '$NF~"bash" {print $1,$NF}' /etc/passwd
2./etc/passwd 只有第一列是root的行,才打印他的第六行
awk -F: '$1=="root" {print $6}' /etc/passwd
3.输出最后一个字段,不包含bash,打印第一列和第六列
awk -F: '$NF~"bash" {print $1,$6}' /etc/passwd
需要注意:
~:是包含的意思
==:为“是”的意思
二者有很大区别
4.指定第6个字段为/home/hj 而且最后一个字段为/bin/bash 满足条件的输出第一列和最后一列
awk -F: '($6=="/home/hj")&&($NF=="/bin/bash") {print $1.$NF}' /etc/passwd
条件判断打印
结合if语句使用
if $3>500 打印所有
AWK三元表达式
awk三元表达式继承了java,格式和Java也一样
awk '{条件表达式1 ? A表达式或者值:B表达式或者值}' 文件名
awk -F: '{max=($3>=$4)?$3:$4;{print max $0}}' /etc/passwd
?:
if else
if [ $3>=$4 ]
then
echo $3
else
echo $4
fi
文本内容匹配打印
打印/etc/passwd中以root开头的行
awk '/^root/{print}' /etc/passwd
getline函数:getline和管道符以及重定向符号在一块的时候,才有特殊功效
重定向:<> 把其中一个文件的内容传给另外一个
| :输出指定内容,先到定义的变量,再由getline调用变量当中的内容,最后打印出结果。
getline函数运行之后,会改变awk的内置变量,读取的行数也会发生变化,getline在前,就是第一行跳过,打印第二行
getline在后,从第一行开始,跳过第二行,打印的就是奇数
-v给变量赋值
BEGIN模式
对变量初始化。需要初始化变量的时候才会使用
格式
awk 'BEGIN{x=1};{x++};{print x}' test.txt
awk和数组结合使用
awk中如何定义数组
原理:索引的下标是唯一的
a是遍历了所有数组,把结果赋值给i,i在下面继续
本章结束,
下面有几个实例可供参考:
1.日志分割:
2.
free 内存监控
df -h 磁盘监控
top 动态进程监控
top -b -n 1静态
监控内存的百分比(不超过90%,超过警报),磁盘(不超过80%),进程(75%),写成函数库,以定时任务的方式每天早上十点整执行,