文本编辑工具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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值