fs |
输入字段(列)分隔符 |
-f : |
相当于-vfs : |
nr |
number of record 行号(记录号) |
nf |
number of filed 每行有多少列 |
ofs |
output 输出分隔符 |
rs |
record separator 记录分隔符每一的结束标记 默认是回车 |
ignorecase |
是否忽略大小写 1为忽略 |
[root@zeq files]# cat passwd.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 默认结束标记是回车,现在文件内容为两行
以/作为记录分隔符,显示行号和文件内容
[root@zeq files]# awk -vrs="/" '{print nr,$0}' passwd.txt nr是显示行号 $0是显示一整行的内容 1 root:x:0:0:root: 2 root: 3 bin 4 bash bin:x:1:1:bin: 5 bin: 6 sbin 7 nologin 现在以/为记录分隔符就变成了7行 这里的awk -vrs="/" -v给变量赋值,rs是awk内置变量,设置/为记录分隔符
nr==1 |
第一行 |
$1 |
第一列 |
$nf |
最后一列 |
$nf-1 |
倒数第二列 |
模式-pattern 帮助你找到想要的行
1)正则表达式
2)比较
>
<
==
3)范围
4)begin{} end{}
~ |
某一列中包含xxx |
!~ |
某一列中不包含xxx |
^ |
以....开头的字符(列) |
$ |
以....什么结尾的 |
.* |
所有 |
^$ |
空行 |
\ |
转义字符 backslash 脱掉马甲打回原形 |
[] |
匹配[]的每一个字符 |
+ |
一个字符出现1次或1次以上 |
| |
或者 |
() |
反向引用,一个整体,保护里面的内容 |
* |
一个字符出现0次或者0次以上 |
{} |
0{n,m} 数字0连续出现了至少n次,最多m次 |
? |
一个字符出现0次或1次 |
创建环境
mkdir -p /server/files/ cat >>/server/files/reg.txt<<eof zhang dandan 41117397 :250:100:175 第一列是姓氏 zhang xiaoyu 390320151 :155:90:201 第二列是名字 meng feixue 80042789 :250:60:50 第一第二列合起来就是姓名 wu waiwai 70271111 :250:80:75 第三列是对应的id号码 liu bingbing 41117483 :250:100:175 最后三列是三次捐款数量 wang xiaoai 3515064655 :50:95:135 zi gege 1986787350 :250:168:200 li youjiu 918391635 :175:75:300 lao nanhai 918391635 :250:100:175 eof
[root@zeq files]# awk '$3~/^4/' reg.txt $3 第3列 ~ 包括 ^4 以4开头 zhang dandan 41117397 :250:100:175 liu bingbing 41117483 :250:100:175
[root@zeq files]# awk ' $2~/xiaoyu/{print $1,$3}' reg.txt zhang 390320151
[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt zhang dandan 41117397 liu bingbing 41117483
awk默认动作
[root@zeq files]# awk '$3~/^41/' reg.txt zhang dandan 41117397 :250:100:175 liu bingbing 41117483 :250:100:175
[root@zeq files]# awk '$3~/^41/{print }' reg.txt zhang dandan 41117397 :250:100:175 liu bingbing 41117483 :250:100:175
方法1 [root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt []匹配里面的1和5 $表示以...结尾 zhang xiaoyu wu waiwai wang xiaoai li youjiu lao nanhai
方法2 [root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt |或者 1或者5 zhang xiaoyu wu waiwai wang xiaoai li youjiu lao nanhai
[root@zeq files]# awk -f: -vofs=$ '/xiaoyu/{print "$"$2,$3,$4}' reg.txt $155$90$201 -f指定:为分隔符 -vofs=$输出$为分隔符
gsub awk内置函数
gsub(/要替换的内容/,"替换成什么",替换的部分)
[root@zeq files]# awk '{gsub(/:/,"$"); print}' reg.txt 把所有的冒号替换成$ zhang dandan 41117397 $250$100$175 zhang xiaoyu 390320151 $155$90$201 meng feixue 80042789 $250$60$50 wu waiwai 70271111 $250$80$75 liu bingbing 41117483 $250$100$175 wang xiaoai 3515064655 $50$95$135 zi gege 1986787350 $250$168$200 li youjiu 918391635 $175$75$300 lao nanhai 918391635 $250$100$175
加上条件精确到哪一部分
[root@zeq files]# awk '$2~/xiaoyu/{gsub(/:/,"$"); print $nf}' reg.txt $nf最后一列 $155$90$201
1、从第1行到第5行内容
awk 'nr==1,nr==5'
2、从包含某个内容的行到包含某个内容的行
awk '/内容/,/内容/'
[root@zeq files]# awk 'nr==1,nr==5' reg.txt zhang dandan 41117397 :250:100:175 zhang xiaoyu 390320151 :155:90:201 meng feixue 80042789 :250:60:50 wu waiwai 70271111 :250:80:75 liu bingbing 41117483 :250:100:175
[root@zeq files]# awk '/xiaoyu/,/waiwai/' reg.txt zhang xiaoyu 390320151 :155:90:201 meng feixue 80042789 :250:60:50 wu waiwai 70271111 :250:80:75
$5>500 第五列大于500 nr>20 大于第20行的行,20行以后 > >= == != 不等于 <= <
[root@zeq files]# df -h filesystem size used avail use% mounted on /dev/sda3 19g 7.8g 10g 44% / tmpfs 491m 0 491m 0% /dev/shm /dev/sda1 190m 61m 120m 34% /boot /dev/sdb1 193m 1.8m 181m 1% /data
[root@zeq files]# df -h|awk '$5>20{print $1,$nf}' filesystem on /dev/sda3 / /dev/sda1 /boot [root@zeq files]# df -h|awk '$5>9{print $1,$nf}' 这里会默认$5>9是字符串(字母)而不是比较表达 filesystem on
[root@zeq files]# df -h|awk -f"[% ]+" '$5>9{print $1,$nf}' filesystem on /dev/sda3 / /dev/sda1 /boot
想要去掉第一列filesystem on信息
[root@zeq files]# df -h|awk 'nr>1 && $5+0>9{print $1,$nf}' 第1行以后(&&并且) /dev/sda3 / /dev/sda1 /boot
[root@zeq files]# df -h|awk '$5+0>9{print $1,$nf}' 第5列做比较,第5列加0 /dev/sda3 / /dev/sda1 /boot
1)awk执行的过程
1.执行命令的参数(赋值) -f -v
2.begin{} 里面的内容 (awk还没有开始读取文件内容)
3.读取文件内容
判断是否满足条件(模式)
符合 执行命令(动作)
不符合 读取下一行直到最后一行
4.文件内容读取完成后,开始执行end{}里面的内容
2)begin{} 里面的内容会在 awk读取文件内容之前执行
1.显示标题
2.修改awk内置变量 创建变量
awk 'begin{ofs=:}' 相当于 awk -vofs=:
3.测试 计算
3)end{} awk读取完文件之后 执行
显示计算结果
先计算,end显示结果
[root@zeq files]# cat passwd.txt 查看文件虚拟用户为nologin root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
统计数量
[root@zeq files]# awk '/nologin$/{i=i+1}end{print i}' passwd.txt i=i+1相当于i++ 6
[root@zeq files]# awk '/^$/{i++}end{print i}' /etc/services 16
gsub 函数 (命令)
变量 计算
[root@zeq files]# df filesystem 1k-blocks used available use% mounted on /dev/sda3 19534104 8076500 10458644 44% / tmpfs 502056 0 502056 0% /dev/shm /dev/sda1 194241 62009 121992 34% /boot /dev/sdb1 197209 1813 185003 1% /data
[root@zeq files]# df |awk 'nr>1{print $3/$2}' 0.413456 0 0.319237 0.00919329
[root@zeq files]# free total used free shared buffers cached mem: 1004112 806016 198096 236 101452 563232 -/+ buffers/cache: 141332 862780 swap: 786428 420 786008
[root@zeq files]# free |awk '/mem/{print ($3-$6-$7)/$2}' 0.140705 [root@zeq files]# free|awk 'nr==3{print $3/($3+$4)}' 0.140705
[root@zeq files]# free|awk 'nr==3{print $4/($3+$4)}' 0.859211
[root@zeq files]# free|awk 'nr==3{sum=$3+$4;print $3/sum,$4/sum}' sum为变量 0.140765 0.859235
如对本文有疑问, 点击进行留言回复!!
linux下文本编辑器vim的使用方法(复制、粘贴、替换、行号、撤销、多文件操作)
网友评论