awk的用法

目录

awk简述

awk的用法

选项

内置变量

命令格式

打印行号

打印指定行

打印奇偶行

按行取列

BEGIN打印模式

乘法计算

awk -v 变量赋值

awk的条件判断

面试题awk的三元表达式

awk的精确筛选

逻辑且、或关系

awk做小数运算

curl

练习

1.获取其中的所有子域名

2.使用awk获取 /etc目录下所有文件的总大小

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

  • 45
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值