欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

awk命令的使用

程序员文章站 2022-04-30 15:19:30
...

awk命令的使用

awk命令格式
awk '条件1{动作1} 条件2{动作2}…' 文件名

在介绍awk命令的用法前,先来看一下cut命令,对比一下就能体现出awk命令的强大。

[[email protected]~]#vim student.txt
[[email protected]~]#cat student.txt 
ID    Name      PHP   Linux   MySQL   Average
1     Jaking    82     95     86       87.66
2     Geling    74     96     87       85.66
3     igi       99     83     93       91.66
[[email protected]~]#cut -d " " -f 1 student.txt 
ID
1
2
3
[[email protected]~]#cut -d " " -f 2 student.txt 




[[email protected]~]#cut -d " " -f 4 student.txt 




[[email protected]~]#

很明显,后面两条命令执行后截取不到任何内容。这是因为当用空格作为分隔符时,有用信息列与列之间有一些空格,这样一来cut命令很可能就会截取到空格所在的列。

awk就不一样了,它可以准确截取到有用信息。

[[email protected]~]#awk '{printf $2 "\t" $6 "\n"}' student.txt
Name    Average
Jaking  87.66
Geling  85.66
igi     91.66

[[email protected]~]#df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   18G  7.1G  9.4G  43% /
tmpfs                         2.0G  224K  2.0G   1% /dev/shm
/dev/sda1                     485M   40M  421M   9% /boot
[[email protected]~]#df -h | awk '{print $1 "\t" $3}'
Filesystem  Used
/dev/mapper/VolGroup-lv_root    7.1G
tmpfs   224K
/dev/sda1   40M

#注意:如果用printf打印内容到屏幕,则需要在最后加\n换行。

awk的BEGIN与END模式

这两种模式的作用是在awk命令执行前和执行后做一些动作。

[[email protected]~]#awk 'BEGIN{printf "This is a transcript \n" } {printf $2 "\t" $6 "\n"}' student.txt
This is a transcript 
Name    Average
Jaking  87.66
Geling  85.66
igi 91.66
[[email protected]~]#awk '{printf $2 "\t" $6 "\n"}' student.txt
Name    Average
Jaking  87.66
Geling  85.66
igi 91.66
[[email protected]~]#awk 'END{printf "The End \n" } {printf $2 "\t" $6 "\n"}' student.txt
Name    Average
Jaking  87.66
Geling  85.66
igi 91.66
The End 
[[email protected]~]#awk '{printf $2 "\t" $6 "\n"}' student.txt
Name    Average
Jaking  87.66
Geling  85.66
igi 91.66

FS内置变量

FS变量的作用是设置分隔符,一般要结合BEGIN一起使用。

[[email protected]~]#cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\t" $3 "\n"}' #以":"为分隔符截取/etc/passwd文件里与/bin/bash有关的行。
root:x:0:0:root:/root:/bin/bash #第一行没有被截取是因为awk是先读取文件的第一行,然后再进行截取的。为了把第一行也截取,可以加上BEGEN。
mysql   27
[[email protected]~]#cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
root    0
mysql   27

关系运算符

[[email protected]~]#cat student.txt 
ID    Name      PHP   Linux   MySQL   Average
1     Jaking    82     95     86       87.66
2     Geling    74     96     87       85.66
3     igi       99     83     93       91.66
[[email protected]~]#cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n" }'  #加入数学关系式,截取平均分大于等于87分的人名。
Jaking
igi

转载于:https://www.jianshu.com/p/a866a0257363