文本三剑客——awk

文本三剑客——awk

1、概念

grep:过滤、sed:增删改查主要是增和改、awk :按行取列

awk默认分隔符,是空格tab键,多个空格会自动压缩成一个空格

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

2、awk的选项

选项作用
-F指定分割符,默认就是空格
-v变量赋值

3、awk内置变量

变量作用
$#按行需要取出的第几个字段
$0打印所有,展示所有的文本内容(默认)
NR需要处理的行号
NF处理行的字段个数,$NF表示当前行的最后一个字段
FS和F是一个意思,都是指定分割符,用F后面直接指定分割符,FS=“分隔符”
OFS指定输出内容的分割符
RS行分割符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分割符,默认是\n,回车,换行

4、命令格式

awk -F '操作符/内置变量 {动作}' 处理对象
-F 指定分割符,如果是空格可以不加
动作:默认就是打印。

5、BEGIN打印模式

awk 'BEGIN{...};{...};END{...}' 文件
BEGIN{...}预先的条件,执行awk命令前的初始化操作
{...}处理条件,如何对初始值进行操作
END{...}处理完之后的操作,一般都是打印

5.1

awk 'BEGIN{x=1};{x++};END{print x}' 文本
awk 'BEGIN{x=0};{x++};END{print x}' 文本

# BEGIN{x=1}表示1初始,{x++}每次增加1,打印结果为文本/路径里面的行数

5.2 区幂运算

awk 'BEGIN{print 10*2}'   #打印为20,*表示乘
awk 'BEGIN{print 2**3}'   #打印为8,**表示幂
awk 'BEGIN{print 2^3}'    #打印为8,^表示幂

6、awk的三元表达式

if
else语句
num=($3>$4)?$3:$4;
?表示if
:表示else
;表示fi
if($3>$4)
echo $3
else
echo $4
fi

6.1 如果第三列比第四列大,打印第三列,比第四列小,打印第四列

awk -F: '{num=($3>$4)?$3:$4;{print num,$0}}' /etc/passwd

7、awk的精确筛选

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

$n~"字符串":表示该字段包含某个字符串

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

$n=="字符串":表示该字段等于这个字符串

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

8、awk逻辑关系

且:&&

或:||

9、crul命令

curl:用来获取和发送数据

curl格式:

curl 域名                (如:www.baidu.com)
curl ip地址              (如:192.168.100.11)

获取网页内容并输出

-O :下载文件到本地

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

-x :发送post请求

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

重要:(awk按行取列、awk的精确筛选、awk的运算符)

10、awk命令练习

1.1 打印指定第三行到第五行并打印行号

awk 'NR==3,NR==5{print NR,$0}' 文本/路径

1.2 偶数打印

awk 'NR%2==0{print}' 文本/路径

1.3 奇数打印

awk 'NR%2==1{print}' 文本/路径

1.4 awk文本过滤(很少用,一般用grep)

过滤/etc/passwd里面含root的行

awk '/root/{print}' /etc/passwd

1.5 变量赋值传参

vim test.sh
a=3
b=4
num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a +b}')
echo $num
sh test1.sh
7

1.6 -v 进行赋值

打印/etc/passwd下的第一列和第三列,分隔符由:改为@

awk -v FS=":" -v OFS="@" '{print $1,$3}' /etc/passwd

1.7 指定行分隔符,根据指定分割符把文件内容进行切割

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo $PATH | awk -v RS=":" '{print $1}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

1.8 awk的条件判断打印(三元表达式

打印/etc/passwd下第三列大于900的所有

awk -F: '$3>900{print $0}' /etc/passwd

取反:打印/etc/passwd下的除了第三列大于900的所有

awk -F: '!($3>900){print $0}' /etc/passwd

打印/etc/passwd下第三列等于999

awk -F: '$3==999{print $0}' /etc/passwd

打印/etc/passwd下第三列大于999 —— 完整格式

awk -F: '{if ($3>999){print $0}}' /etc/passwd

1.9 awk的精确筛选

筛选/etc/passwd下第七列包含bash的行,打印第一列和最后一列,以:作为分隔符

awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd

筛选/etc/passwd下第七列包含bash的行,打印第一、二、三列,以:作为分隔符(打印两列以上需指定)

awk -F: '$7~"bash" {print $1,$2,$3}' /etc/passwd

打印/etc/passwd下第一列为dy且第七列为/bin/bash

awk -F: '($1="dy") && ($NF=="/bin/bash") {print $1,$NF}' /etc/passwd

打印/etc/passwd下第一列为ntp或者第七列为/bin/bash

awk -F: '($1="ntp") || ($NF=="/bin/bash") {print $1,$NF}' /etc/passwd

1.10 查看5行日志打印任意列

head -n 5 /var/log/messages | awk '{print $指定行}'

1.11 取小数点几位以及小数运算怎么取整数

num=$(awk 'BEGIN{printf "%.2f",1.2222*2.2222 }')
echo $num
2.72

num=$(awk 'BEGIN{printf "%.F",1.2222*2.2222 }')
echo $num
3

1.12 vim host.txt 把主机名取出来

1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com

取出wwwmailftplinuxblog

cat host.txt | awk '{print $2}'|awk -F. '{print $1}'
cat host.txt | awk -F'[ .]+' '{print $2}'

1.13 统计/etc下文件的总大小

ll /etc/ | awk '/^-/{print sum+=$5} END{print "文件的总大小:"sum/1024"M"}'

拓展学习:

监控内存,cpu和硬盘的根目录,超过80%提示用户,写成函数库的形式,每天早上的8:50分,执行一次脚本

函数库 vim jiankong.sh

neicun () {
 num1=$(free -m | awk 'NR==2{printf "%.F", $3/$2 * 100}')
 if [ "$num1" -le 80 ]
then
 echo "内存未超过80%"
else
 echo "内存超过80%"
fi
echo $num1
}

ccpu () {
 num2=$(top -b -n 1 | awk 'NR==3{printf "%.F", $2+$4}')
 if [ "$num2" -le 80 ]
then
 echo "cpu未超过80%"
else
 echo "cpu超过80%"
fi
 echo $num2
}

yingpan () {
 num3=$(df -h | awk 'NR==2 {print $5}' | tr -d '%')
 if [ $num3 -le 80 ]
then
 echo "根目录下的硬盘未超过80%"
else
 echo "根目录下的硬盘超过80%"
fi
echo $num3
}

调用脚本 vim diaoyong.sh

. /opt/jiankong.sh
neicun=`neicun $neicun`
ccpu=`ccpu $ccpu`
yingpan=`yingpan $yingpan`

echo $neicun
echo $ccpu
echo $yingpan

定时任务 crontab -e

50 8 * * * sh /opt/diaoyong.sh

查看定时任务 crontab -l

 crontab -l 
 50 8 * * *  /opt/diaoyong.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值