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"}'
1212

被折叠的 条评论
为什么被折叠?



