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

awk命令使用示例

程序员文章站 2022-03-02 18:15:49
...
#1---awk命令的基本格式,   
#options :表示可选参数  
#program :表示awk的可执行脚本代码  
#file : 表示需要处理的文件  
awk [options] 'program' file  
  
#2---逐行打印  
awk '{print $0}' score.txt  
(1) Amit : Physics 80
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89
  
#3---指定':'为分隔符,awk默认的分隔符为空格和制表符  
awk -F ':' '{print $2}' /etc/passwd  
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp  
  
#指定多个分隔符,'[:)]'  
awk -F '[:()]' '{print $1,$2,$3,$4}' score.txt  
 1  Amit   Physics 80
 2  Rahul   Maths 90
 3  Shyam   Biology 87
 4  Kedar   English 85
 5  Hari   History 89  
  
#打印每行第一项,第二项...  
awk '{print $1,$2,$3,$4,$5}' score.txt  
(1) Amit : Physics 80
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89  
  
#加入分隔符  
 awk '{print $1,"\n",$2,"\n",$3,"\n",$4,"\n",$5}' score.txt
(1) 
 Amit 
 : 
 Physics 
 80
(2) 
 Rahul 
 : 
 Maths 
 90
(3) 
 Shyam 
 : 
 Biology 
 87
(4) 
 Kedar 
 : 
 English 
 85
(5) 
 Hari 
 : 
 History 
 89
  
#4---awk 内置变量的使用  
   
#$0 这个表示文本处理时的当前行  
  
#$1 表示文本行被分隔后的第 1 个字段列  
  
#$2 表示文本行被分割后的第 2 个字段列  
  
#$3 表示文本行被分割后的第 3 个字段列  
  
#$n 表示文本行被分割后的第 n 个字段列  
  
#NR 表示文件中的行号,表示当前是第几行  
  
#NF 表示文件中的当前行列的个数,类似于 mysql 数据表里面每一条记录有多少个字段  
  
#FS 表示 awk 的输入分隔符,默认分隔符为空格和制表符,你可以对其进行自定义设置  
  
#OFS 表示 awk 的输出分隔符,默认为空格,你也可以对其进行自定义设置  
  
#FILENAME 表示当前文件的文件名称,如果同时处理多个文件,它也表示当前文件名称  
  
  
  
  
#打印行号,内置变量NR表示行号  
awk '{print NR , $1}' score.txt  
1 (1)
2 (2)
3 (3)
4 (4)
5 (5)  
  
#内置变量NF表示每一行的列数  
awk '{print NF}' score.txt  
5
5
5
5
5  
  
#内置变量NF的使用示例,打印最后一列  
awk '{print $NF,$(NF-1)}' score.txt 
80 Physics
90 Maths
87 Biology
85 English
89 History  
  
  
#指定输出分隔符为"**"  
awk -F ':' '{print $1,$2,$3,$4,OFS="**"}' score.txt   
(1) Amit ** Physics 80********
(2) Rahul ** Maths 90********
(3) Shyam ** Biology 87********
(4) Kedar ** English 85********
(5) Hari ** History 89********  
  
  
#5---同时处理多个文件  
awk '{print $0}' score.txt, students.txt  
(1) Amit : Physics 80
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89
linux
java
python
maven
git
shell  


#6---BEGIN关键字 : 在开始读取一个文件之前,运行一次 BEGIN后面的脚本,只执行一次
awk 'BEGIN{print "Hello World!"} {print $0}' score.txt 
Hello World!
(1) Amit : Physics 80
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89

#7---END关键字 : END 指令和 BEGIN 恰好相反,在 awk 读取并且处理完文件的所有内容行之后,才会执行 END 后面的脚本代码段
awk 'BEGIN {print "hello world!\n"} END {print "\nGood bye....."} {print $1,$2}' score.txt
Hello World!
(1) Amit : Physics 80
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89
Good bye...... 

awk 'BEGIN{print "Hello World!"} {print $0} END{print "Good bye......."} {print $0}' score.txt 
Hello World!
(1) Amit : Physics 80
(1) Amit : Physics 80
(2) Rahul : Maths 90
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(3) Shyam : Biology 87
(4) Kedar : English 85
(4) Kedar : English 85
(5) Hari : History 89
(5) Hari : History 89
Good bye.......

#8---awk使用变量,注意分割符号';'
awk '{msg="hello world!";print msg}' score.txt
awk 'BEGIN{msg="hello world!";print msg}' score.txt
awk 'BEGIN{msg="hello world!"} {print msg}' score.txt
awk 'BEGIN{msg="hello"} {print msg, $0}' score.txt 
hello (1) Amit : Physics 80
hello (2) Rahul : Maths 90
hello (3) Shyam : Biology 87
hello (4) Kedar : English 85
hello (5) Hari : History 89

awk 'BEGIN{a=1;b=2} {print a,"+",b,"=",a+b}' score.txt
1 + 2 = 3
1 + 2 = 3
1 + 2 = 3
1 + 2 = 3
1 + 2 = 3

#9---awk使用条件判断
awk '$5>80 {print $0}' score.txt
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89

awk '{if($5>80) print $0}' score.txt
(2) Rahul : Maths 90
(3) Shyam : Biology 87
(4) Kedar : English 85
(5) Hari : History 89

#10---awk中使用正则表达式
awk '/Maths/{print $0}' score.txt
(2) Rahul : Maths 90



#11---执行awk脚本
awk -f calculate.awk score.txt 

#!/usr/bin/awk 
#before calculate
BEGIN{
	math=0;
	english=0
	computer=0
	history=0
	printf"----------------------------------------------------------------------------\n"
	printf("%-10s %10s %10s %10s %10s %10s %10s\n","Name","NO.","Math","English","Computer","History","Total")
	printf"----------------------------------------------------------------------------\n"
}
#calculating
{
	math+=$3
	english+=$4
	computer+=$5
	history+=$6
	printf("%-10s %10s %10d %10d %10d %10d %10d\n",$1,$2,$3,$4,$5,$6,$3+$4+$5+$6)
}

#after calculating
END{
	printf"----------------------------------------------------------------------------\n"
	printf("%-21s %10d %10d %10d %10d\n","Total",math,english,computer,history)	
	printf("%-21s %10.2f %10.2f %10.2f %10.2f\n","Average",math/NR,english/NR,computer/NR,history/NR)	
	}

执行结果如下:

----------------------------------------------------------------------------
Name              NO.       Math    English   Computer    History      Total
----------------------------------------------------------------------------
Amit             1001         80         90         78        100        348
Rahul            1002         90         89         87         89        355
Shyam            1003         87         78         96         94        355
Kedar            1004         85         85         89         83        342
Hari             1005         69         94         78         90        331
----------------------------------------------------------------------------
Total                        411        436        428        456
Average                    82.20      87.20      85.60      91.20


 #12---拆分文件(使用重定向):例如,按照每个学生的姓名,输出该学生的成绩到一个单独的文件
awk '{print >$1}' score.txt  
执行之后,会按照姓名输出文件
ls
Amit   Hari  history.txt  Kedar  Rahul  score.txt  Shyam  

#13---找出文件中长度大于100的行    
awk 'length>100' calculate.awk