文本编辑工具awk
一. awk原理
- 系统自带的,功能强大的编辑工具,按行取列。
- awk按行取列的默认分隔符:空格或者tab键,连续多个空格,自动压缩成一个
- 可以在无交互的情况下,对文件内容进行操作。
awk 选项 ‘模式或者条件{操作}’ 文件名1 文件名2
1.1 选项
-F 指定分隔符
-v 变量赋值
1.2 内置变量
$n 按行指定分隔符后,取第几列
$0 打印所有
NR 处理的行号
NF 当前处理的字段个数
FS 列分隔符,-F
01{}是一个内置的条件,默认就是1,打印结果。0就是不打印
二. awk用法
2.1 行和列
#打印指定列
awk -F : '{print $1}' /etc/passwd
#打印行号加内容
awk '{print NR,$0}' /etc/passwd
#指定行号打印
awk 'NR==3{print}' 文件名
awk 'NR==4,NR==6{print}' 文件名 #4到6行
awk 'NR==4;NR==6{print}' 文件名 #4和6行
#大于第3行和小于第5
root@u3:/opt# awk 'NR>=3 && NR<=5{print}' test1.txt
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
#第1行或第4行
awk'(NR==1) || (NR==4){print}' testl.txt
#按行取列
head -n 2 /etc/passwd
head -n2 /etc/passwd | awk -F: '{print $l}‘
#直接打印最后一列
head -n2 /etc/passwd | awk -F: '{print $NF}‘
或
head -n2 /etc/passwd | awk 'BEGIN{FS=":"};{print $NF}'
2.2 运算
#奇数和偶数
awk 'NR%2==0{print}' testl.txt #偶数
awk 'NR%2==1{print}' testl.txt #奇数
#求幂运算
awk 'BEGIN{print 2^3}'
awk 'BEGIN{print 2**3}'
#列的累加求和
root@u3:/opt# vim test2.txt
1
2
3
4
5
6
7
8
9
10
root@u3:/opt# awk 'BEGIN{sum=0}{sum=sum+$1};END{print sum}' test2.txt
55
2.3 awk结合正则表达式对文件内容进行过滤
awk ‘/^root/{print}’ /etc/passwd
awk ‘/bash$/{fprint}’ /etc/passwd
2.4 BEGIN ;END
特殊的模式:用来声明初始值和处理的方式,以及对结果的输出
awk 'BEGIN{..};{...};END{print}'文件名
awk 'BEGIN{x=1};{x++};END{print x}' test1.txt #输出结果为文本行数+1
-v
a=4
b=5
num=$(awk -v a=$a -v b=$b 'BEGIN{print a + b}')
echo $num
2.5 条件判断打印
awk -F: ‘$3>=1000{print}’/etc/passwd
awk -F: ‘{if ($3>=1000){print}}’ /etc/passwd
2.6 awk的三元表达式(类java的写法)
awk ‘(条件表达式)?(A表达式):(B表达式)’
awk -F: ‘{num=($3>=$4)?$3:$4;{print}}’ /etc/passwd #第三列大于第四例,就打印第四列
2.7 awk如何实现精确筛查
- $n ><=比对数值
- $n~“字符串” 这一行中包含某个字段
- $n!~“字符串” 不包含某个字段
- $n==“字符串” 第n个字段等于这个字段
- $n!=“字符串” 不等于某个字符串
例
root@u3:/opt# awk -F: '$7~"bash"{print $1}' /etc/passwd #第7个字段包含bash就打印第一列
root
du
三. 练习
第六个字段包含/hom/dn 且第7个字段是/bin/bash 打印出第一列和最后一列
awk -F: '($6~"/home/dn") && ($7=="/bin/bash"){print $1,$NF}' /etc/passwd
取小数点位数
awk 'BEGIN{printf "%.2f",2.331*2.5665}'
统计访问服务器ip量
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c
统计/etc日录下,所有文件额总大小,要把单位换算M
root@u3:/etc# ll /etc | awk 'BEGIN{sum=0}{sum=sum+$5};END{print sum/1024"M"}'
914.714M
etc下普通文件的大小,转换成MB输出
root@u3:/etc# ll /etc | awk '/^-/{sum=sum+$5} END{print sum/1024"M"}'
362.552M