目录
3.监控内存,cpu和硬盘的根目录,超过80%提示用户,写成函数库的行,每天早上 的8:50分,执行一次脚本。监控各个负载的功能使用函数库的形式实现
awk简述
查 用grep
增和改 用sed
按行取列 用awk
awk默认的分隔符就是空格,也可以是tab健,如果有多个空格自动压缩成一个
awk的工作原理是根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出
awk的用法
选项
awk -F 指定分隔符,默认就是空格
awk -v 变量赋值
内置变量
awk -F '{print $1}' test.txt
$#:按行需要取出的第几个字段
$0:打印所有,展示所有的文本内容(默认)
NR:需要处理的行号
NF:处理行的字段个数,$NF:当前行的最后一个字段
FS:FS和F是一样的,都是指定分隔符 -FS=“:” 或者-F:
OFS:指定输出内容的分隔符
RS:行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行
命令格式:awk -F '操作符 {动作}' 处理对象
-F 指定分隔符,如果是空格可以不加
动作:默认就是打印
awk 'print' test.txt 打印所有内容 默认所有就是$0
命令格式
awk -F '操作符 {动作 处理对象}'
打印行号
awk '{print NR}' test.txt 告诉我们有几行
awk '{print NR,$0}' test.txt 既打印行号又打印内容
打印指定行
awk 'NR==3{print}' test.txt 打印第三行
awk 'NR==3,NR==5{print}' test.txt 打印第三行到第五行
awk 'NR==3;NR==5{print}' test.txt 打印第三行和第五行
打印奇偶行
awk 'NR%2==0{print}' test.txt 打印偶数行
awk 'NR%2==1{print}' test.txt 打印奇数行
按行取列
awk -F: '{print $3}' test.txt 打印第三列
awk -F: 'NR==1,NR==3{print $3}' /etc/passwd 打印第一行到第三行的第三列
awk怎么使用文本过滤
awk '/root/{pint}' /etc/passwd 打印所有包含root的行
BEGIN打印模式
格式:awk 'BEGIN{...};{....};END{....}' 文件
awk 'BEGIN{预先条件};{处理条件};END{结束条件}'
BEGIN{...} 表示预先的条件,就是执行awk命令前的初始化操作
{....} 处理条件,就是如何对初始值进行操作
END{.....} 处理完之后的操作,一般都是打印
awk 'BEGIN{x=1};{x++};END{print x}' test.txt 结果表示多少行
乘法计算
awk 'BEGIN{print 10*2}'
awk 'BEGIN{print 2**3}' 就是2的3次方或者awk 'BEGIN{print 2^3}'
awk -v 变量赋值
指定分隔符换一个分隔符打印
RS以冒号为分隔符 默认是回车 打印
awk的条件判断
awk -F: '$3>900{print $0}' /etc/passwd 大于900的值打印出来
awk -F: '!($3>900){print $0}' /etc/passwd 取反,小于900的值
awk -F: '$3==999{print $0}' /etc/passwd 等于900的值
面试题awk的三元表达式
就是if else 语句
格式 :awk -F: '{num=($3>4)?$3:$4;{print num,o}}' /etc/passwd
awk -F: '{num=($3>$4)?$3:$4;{print num;$0}}' /etc/passwd
?就是if
:就是else
;就是fi
awk的精确筛选
$n( > < ==)用于比较数值
$n~"字符串" 表示该字段包含某个字符串
$n!~"字符串" 表示该字段不包含某个字符串
$n=="字符串" 表示该字段等于这个字符串(精确需要全部写完整)
$n!=="字符串" 表示该字段不等于这个字符串(精确需要全部写完整)
$NF 表示当前行的最后一个字段
$n(> < ==)用于比较数值
$n~"字符串" :该字段包含这个字符串
$n!~"字符串" :该字段不包含这个字符串
$n=="字符串" :该字段等于这个字符串
$n!="字符串" :该字段不等于这个字符串
$NF :最后一个字段
awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd 打印第七列包含bash这个字段的行,取的是行的第一列和最后一列,以:作为分隔符
打印/etc/passwd
第七列包含bash这个字段的行,取行的第一列和最后一列
awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd
打印/etc/passwd第七列字段为/bin/bash
的行,取行的第一列和最后一列
awk -F: '$7=="/bin/bash" {print $1,$NF}' /etc/passwd
去除/var/log/messages 文件前5行 第5列的内容
head -5 /var/log/messages | awk '{$5=""}1'
逻辑且、或关系
且 awk -F: '($1=="test2")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd
打印/etc/passwd
第一列为root
且第七列(最后一列)为/bin/bash
的行
awk -F: '($1=="root")&&($NF=="/bin/bash") {print $0}' /etc/passwd
# && 两边的条件的()可以不加,但加了更方便阅读
打印/etc/passwd
第一列为dhcp
或第七列为/bin/bash
的行
awk -F: '($1=="dhcp")||($NF=="/bin/bash") {print $0}' /etc/passwd
awk做小数运算
awk
做小数运算,有几位小数就算几位小数,也可以指定输出结果的小数位数
awk 'BEGIN{printf "%.#f" , 小数运算}'
# {}里的%.#f号表示数字,数字是几就表述输出结果有几位小数,四舍五入
awk 'BEGIN{printf "%.F" , 小数运算}'
# %.F 表示输出结果为整数,四舍五入
curl
curl 主要的功能是获取和发送数据
curl www.baidu.com
curl 192.168.233.10
获取网页内容并且输出
curl -0 下载文件到本地
curl -o 将文件下载到指定的路径
curl -x 发送post请求
curl -i 可以或缺web软件的版本(服务端没有影藏版本号)
取小数点几位以及小数运算怎么取整数
num=$(awk 'BEGIN{printf "%.2f", 1.222+3.666}') 保留小数后2位
num=$(awk 'BEGIN{printf "%.F", 6.345+5.789 }') 取整数
练习
1.获取其中的所有子域名
2.使用awk
获取 /etc
目录下所有文件的总大小
ll /etc | awk '/^-/{print sum+=$5} END{print "文件的总大小:"sum/1024"M" }'
3.监控内存,cpu和硬盘的根目录,超过80%提示用户,写成函数库的行,每天早上 的8:50分,执行一次脚本。监控各个负载的功能使用函数库的形式实现
函数库文件:testlib.sh
# 检测CPU负载
cputest () {
local c=$(top -b -n 1 | awk 'NR==3 {printf "%.F", $2+$4}')
if [[ c -ge 80 ]];then
echo "当前CPU负载${c}%,超过80%!请及时处理!"
else
echo "CPU负载正常,当前负载${c}%"
fi
}
# 检测内存负载
memtest () {
local b=$(free -m | awk 'NR==2 {printf "%.F", $3/$2*100 }')
if [[ $b -ge 80 ]];then
echo "当前内存负载${b}%,超过80%!请及时处理!"
else
echo "内存负载正常,当前负载${b}%"
fi
}
# 检测根目录负载
blktest () {
local a=$(df -h | awk '$NF=="/" {print $5}' | tr -d "%")
if [[ $a -ge 80 ]];then
echo "根目录当前使用达到${a}%,超过80%!请及时处理!"
else
echo "根目录使用空间正常,当前已使用${a}%"
fi
}
每天执行的脚本文件jiankong.sh
. /opt/zuoye1/testlib.sh
cputest
memtest
blktest
创建定时任务
crontab -e
50 8 * * * /opt/zuoye1/jiankong.sh
查看定时任务
crontab -l
50 8 * * * /opt/zuoye1/jiankong.sh