文本三剑客——awk

awk

awk 系统自带的,功能强大的编辑工具,按行取列。

awk按行取列的默认分隔符:空格或者tab键,连续多个空格,自动压缩成一个

可以在无交互的情况下,对文件内容进行操作。

awk格式

awk 选项 ‘模式或者条件 (操作)’ 文件名1 文件名2

选项

-F:指定分隔符

-v:变量赋值

内置变量:

$n:按行指定分隔符后,取第几
$0:打印所有的意思
NR:处理的行号

NF:当前处理行的字段个数

FS:列分隔符,-F

按行查询

awk '0{print}' /etc/passwd
# 不打印
awk '1{print}' /etc/passwd
# 打印所有
awk '{print}' /etc/passwd
# 打印所有
awk '{print $0}' /etc/passwd
# 打印所有
awk '{print NR,$0}' /etc/passwd
# 打印行号和所有内容
awk 'NR==3{print}' /etc/passwd
# 输出第三行内容
awk 'NR==3,NR==6{print}' /etc/passwd
# 输出第三行到第六行内容
awk 'NR==3;NR==6{print}' /etc/passwd
# 输出第三行和第六行内容
awk 'NR>=3{print}' /etc/passwd
# 输出第三行及以后的内容
awk 'NR>=3 && NR<=6{print}' /etc/passwd
# 输出第三行到第六行的内容
awk 'NR==3 || NR==6{print}' /etc/passwd
# 输出第三行和第六行内容
awk 'NR%2==1{print}' /etc/passwd
# 输出奇数行内容
awk 'NR%2==0{print}' /etc/passwd
# 输出偶数行内容

head -n 2 /etc/passwd | awk -F: '{print $1}'

head -n 2 /etc/passwd | awk -F: '{print $1, $2, $3}'
# 打印第一列第二列和第三列
head -n 2 /etc/passwd | awk -F: '{print $NF}'
# 打印最后一列
#awk结合正则表达式对文件内容进行过滤:
awk '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

awk '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
kc01:x:1000:1000:kc01,,,:/home/kc01:/bin/bash

运算功能 

awk 'BEGIN{print 100+200}'
300
awk 'BEGIN{print 2^3}'
8
# 幂运算
awk 'BEGIN{print 2**3}'
8
# 幂运算
awk 'BEGIN{print 102.099*0.36}'
36.7556
# 浮点数运算
awk 'BEGIN{printf "%.2f",2.331 * 2.5665}'
# 将结果格式化为保留两位小数的浮点数
awk 'BEGIN{printf "%.F", 2.331 * 2.5665}'
# 输出一个浮点数,但不显示小数点后的数字
awk 'BEGIN{x=1};{x++};END{print x}' test1.txt
9
# 计算结果为文件行号+1

awk 'BEGIN{..};{..};END{..}'

awk 'BEGIN{sum=0};{sum=sum+$1};END{print sum}' 2.txt
# 第一列累加求和

变量赋值 

a=4
b=5
num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a + b}')
echo $num

 条件判断

awk -F: '$3>=1000{print}' /etc/passwd
# 打印第三列大于等于1000的行
awk -F: '!($3>=1000){print}' /etc/passwd
# 取反,打印第三列小于1000的行

三元表达式 

awk '(条件表达式)?(A表达式):(B表达式)'

awk '{if ($1 > 10) print "大于10"; else print "小于等于10"}'
# if嵌套

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

 精确筛查

$n > < = 比对数值
$n~"字符串" 这一行中包含某个字段
$n!~"字符串" 不包含某个字段
$n=="字符串" 第n个字段等于这个字段
$n!="字符串" 不等于某个字符串
$NF: 最后一列
awk -F: '$7~"bash"{print$1}' /etc/passwd

awk -F: '$6~"/home/kc" && $7=="/bin/bash"{print $1,$NF}' /etc/passwd

 例题

1.统计磁盘使用量:单位换算成GB
df | awk '$6=="/" {num=$3/1024/1024}END{print num}'

2.统计当前主机的cpu的使用率
top -b -n 1 | awk 'NR==3{print $2+$4"%"}'

3.统计内存的使用量,判断,大于85%,提示内存已使用85%
free | awk 'NR==2{printf "%.2f", $3/$2}' | awk '{print $1*100}' | awk '{num=($1>85)?85:$1; {print num"% of the memory has been used!"}}'

4.统计硬盘的使用量,要求判断,使用到达90%,提示用户,硬盘空间已使用90%
df | awk '$6=="/" {print $5}' | awk -F% '{num=($1>=90)?90:$1; {print num"% of the disk space has been used!"}}'

5.使用ps这个命令,提取出进程号,pid cpu 和内存的使用率,要求列出前10位
ps -aux | awk 'NR>=2 {print $2,$3,$4}' | sort -t ' ' -k 3 -r | awk 'NR==1,NR==10{print}'
# 按内存使用率排前10位
ps aux --sort=-%mem | awk 'NR==2,NR==11{print $2,$3,$4}'

ps -aux | awk 'NR>=2 {print $2,$3,$4}' | sort -t ' ' -k 2 -r | awk 'NR==1,NR==10{print}'
# 按cpu使用率排前10位

6.统计访问您的Nginx服务器的不同IP地址及其访问次数
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c

7.取出网址的第一部分,2.txt内容如下:
	1 www.kgc.com
	2 mail.kgc.com
	3 ftp.kgc.com
	4 linux.kgc.com
	5 blog.kgc.com
awk -F. '{print $1}' 2.txt | awk '{print $2}'
awk -F "[ .]" '{print $2}' 2.txt

8.仅统计/etc下是文件的总大小,换算成M
/etc | awk '/^-/ {sum=sum+$5} END{print sum/1024"m"}'
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值