awk

awk

grep 查

sed 增删改查

awk 按行取列

awk默认分割符:

空格;tab键。多个空格压缩成一个空格

[root@test2 opt]# cat awk.txt 
1 2   3
[root@test2 opt]# awk '{print $3}' awk.txt 
3

awk的工作原理:

根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出。

awk选项:

-F 指定分隔符,默认就是空格键

-v 变量赋值

内置变量

$#:按行需要取出的第几个字段。

$0:打印所有,展示所有的文本内容(默认)

NR:需要处理的行号

NF:处理行的字段个数,$NF:当前行的最后一个字段

FS:FS和F是一样的,都是指定分隔符,-F:FS='.'

OFS:指定输出内容的分隔符

RS:行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认\n,回车,换行

awk命令格式

awk -F '操作符 {动作}' 处理对象

-F 指定分隔符,如果是空格可以不加

动作:默认就是打印。

打印行号和内容    NR是行号   $0所有内容
[root@test2 opt]# awk '{print NR,$0}' awk.txt 
1 one two  three
2 four five six
3 seven  eight  nine
打印指定行
[root@test2 opt]# awk 'NR==3{print}' awk.txt 
seven  eight  nine

指定打印几行到几行 逗号隔开

[root@test2 opt]# awk 'NR==1,NR==3{print}' awk.txt 
one two  three
four five six
seven  eight  nine

指定打印几行和几行 分号隔开

[root@test2 opt]# awk 'NR==1;NR==3{print}' awk.txt 
one two  three
seven  eight  nine
打印奇偶行

偶数行

[root@test2 opt]# awk 'NR%2==0{print}' awk.txt 
four five six

奇数行

[root@test2 opt]# awk 'NR%2==1{print}' awk.txt 
one two  three
seven  eight  nine
如何使用指定分隔符

打印几行到几行 的第几列

[root@test2 opt]# awk -F: 'NR==1{print $3};NR==3{print $3}' /etc/passwd
0
1
2
使用awk文本过滤
[root@test2 opt]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

以什么结尾过滤文本

[root@test2 opt]# awk '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
wbl:x:1000:1000:wbl:/home/wbl:/bin/bash
wbl1:x:1001:1001::/home/wbl1:/bin/bash
wbl2:x:1002:1002::/home/wbl2:/bin/bash
aaa:x:1003:1003::/home/aaa:/bin/bash
bbb:x:1004:1004::/home/bbb:/bin/bash
ccc:x:1005:1005::/home/ccc:/bin/bash

BEGIN打印模式

格式

awk ‘BEGIN{...};{...};END{...}’ 文件

BEGIN{...}预先的条件,指定awk命令前的初始化操作

{...}处理条件,如何多初始值进行操作

END{...}处理完之后操作,一般都是打印。

区幂运算
[root@test2 opt]# awk 'BEGIN{print 10*2}' 
20
[root@test2 opt]# awk 'BEGIN{print 2**2}' 
4
[root@test2 opt]# awk 'BEGIN{print 2^3}' 
8
变量赋值 -v
[root@test2 opt]# sh test1.txt 
7
[root@test2 opt]# vim test1.txt
​
a=3
b=4
sum=$(awk -v a="$a" -v b="$b" 'BEGIN{print a+b}')
echo $sum

区幂运算

[root@test2 opt]# sh test1.txt 
输入一个数3
输入一个数4
81
[root@test2 opt]# vim test1.txt
read -p "输入一个数" a
read -p "输入一个数" b
sum=$(awk -v a="$a" -v b="$b" 'BEGIN{print a^b}')
echo $sum

指定分隔符

[root@test2 opt]# awk -v FS=":" -v OFS="==" '{print $1,$3}' /etc/passwd
​

RS以什么分隔符作为换行的标记

[root@test2 opt]# echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
​
[root@test2 opt]# echo $PATH | awk -v RS=":" '{print $1}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

使用awk进行条件判断打印

[root@test2 opt]# awk -F: '$3>999{print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wbl:x:1000:1000:wbl:/home/wbl:/bin/bash

取反

[root@test2 opt]# awk -F: '!($3>5){print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

等于=是赋值 ==是查找

[root@test2 opt]# awk -F: '$3==999{print $0}' /etc/passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
awk的精确筛选

$n(>< ==)用于比较数值

$n-"字符串":该字段包含某个字符串

$n!~"字符串":该字段不包含某个字符串

$n=="字符串":该字段等于某个字符串

$n!=="字符串":该字段不等于某个字符串

$n-"字符串":

打印第七列包含bash这个字段的行,取得是行的第一列和最后一列,以:作为分隔符
[root@test2 opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd 
root /bin/bash
wbl /bin/bash

取列不能范围操作
[root@test2 opt]# awk -F: '$7~"bash" {print ($1,$2,$3)}' /etc/passwd 
root x 0
wbl x 1000

$n== 是精确查找路径要完整

[root@test2 opt]# awk -F: '$7=="/bin/bash" {print ($1,$2,$3)}' /etc/passwd 
root x 0
wbl x 1000

/etc/passwd 第一列=wbl 且第七列=/bin/bsah

[root@test2 opt]# awk -F: '($1=="wbl")&&($NF=="/bin/bash") {print $1,$NF}' /etc/passwd
wbl /bin/bash
​
逻辑关系  &&是且  ||是或
[root@test2 opt]# awk -F: '($1=="ntp")||($NF=="/bin/bash") {print $1,$NF}' /etc/passwd
root /bin/bash
ntp /sbin/nologin
wbl /bin/bash

curl

curl是一个强大的命令

获取和发送数据

curl www.baidu.com

curl 192.168.65.10

获取网页内容并且输出

-o 将文件下载到指定的路径

-O 下载文件到本地

-x 发送post请求

-i 可以获取web软件的版本(服务端没有隐藏版本号)

awk 按行取列

awk 精确筛选

awk 运算符

awk如何取小数点几位及小数运算怎么取整

%.2f 取小数点后两位

[root@test2 opt]# sum=$(awk 'BEGIN{printf "%.2f", 1.222+2.222}')
[root@test2 opt]# echo $sum
3.44

%.F 取整

[root@test2 opt]# sum=$(awk 'BEGIN{printf "%.F", 1.222+2.222}')
[root@test2 opt]# echo $sum
3

面试题

awk的三元素表达

[root@test2 opt]# awk -F: '$3>999{print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wbl:x:1000:1000:wbl:/home/wbl:/bin/bash
[root@test2 opt]# awk -F: '{if ($3>999){print $0}}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wbl:x:1000:1000:wbl:/home/wbl:/bin/bash
[root@test2 opt]# 

if else 语句

[root@test2 opt]# awk -F: '{num=($3>$4)?$3:$4;{print num,$0}}' /etc/passwd
num=($3>$4)?$3:$4;
?就是if
:就是else
;就是fi
if ($3>$4)
then
echo $3
else
echo $4
fi

取出文件里的主机名

[root@test2 opt]# cat test1.sh | awk -F '[ .]+' '{print $2}'
www
mail
linux
ftp
blog
[root@test2 opt]# cat test1.sh | awk '{print $2}' | awk -F. '{print $1}'
www
mail
linux
ftp
blog

统计/etc/下的文件的总大小?awk实现

[root@test2 opt]# ll /etc/ | awk  '/-/{print sum+=$5} END{print "文件总大小:"sum/1024"M"}'
​
文件总大小:1112.56M

作业

监控内存 、cpu、硬盘的根目录,超过80%提示用户,写成函数库的形式,每天上午的8.50执行一次脚本。

[root@test2 opt]# df -h | awk 'NR==2{print sum=$5} END{print "占用:"sum"%"}' | tr -d "%"
26
占用:26
[root@test2 opt]# top -b -n 1 | awk 'NR==3{print sum1=$2+$4} END{print "cpu占用总量:"sum1"%"}'
1.5
​
cpu占用总量:1.5%
[root@test2 opt]# free -m | awk 'NR==2{printf "%.2f", sum2=($3/$2)*100} END{print "内存占用量:"sum2"%
​
5.93内存占用量:5.93362%

调用

[root@test2 opt]# vim diaoyong.sh 
​
. /opt/test1.sh
a=`yingpan $sum1`
echo "$a"
​
b=`cpu $sum2`
echo "$b" 
​
c=`neicun $sum3`
echo "$c"

函数库

[root@test2 opt]# vim test1.sh 
​
yingpan () {
sum1=$(df -h | awk 'NR==2{print $5}' |tr -d "%")
if [[ $sum1 > 80 ]]
then
echo "警告!硬盘用量达到:$sum1"
else
echo "当前硬盘用量:$sum1%"
fi
}
​
cpu () {
sum2=$(top -b -n 1 | awk 'NR==3{print (sum2=$2+$4)}')
if [[ $sum2 > 80 ]]
then
echo "警告!cpu用量达到:$sum2"
else
echo "当前cpu用量:$sum2%"
fi
}
​
neicun () {
sum3=$(free -m | awk 'NR==2{printf "%.F", ($3/$2)*100}')
if [[ $sum3 > 80 ]]
then
echo "警告!内存占用量:$sum3"
else
echo "当前内存用量:$sum3%"
fi
}

执行

[root@test2 opt]# sh diaoyong.sh 
当前硬盘用量:26%
当前cpu用量:0%
当前内存用量:6%

以上是实践

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值