awk命令详解

发布时间 2023-08-04 10:50:40作者: 耿筱诺

awk变量

1、主要作用

用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组

2、格式

2.1 awk [选项] '匹配规则和处理规则 ' [处理文本路径]

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd

匹配规则主要是:正则表达式

处理规则主要是:

  设置变量

  设置数组

  定义函数(用的比较少)

  数组循环

  加减乘除运算

  字符串拼接

2.2 匹配规则

  字符串

  正则表达式

2.3 处理规则

  • BEGIN{} : BEGIN是在awk处理文本之前运行
  • // : 使用的匹配规则
  • {} :循环(每次只处理一行数据)
  • END{} :当所有的处理全部执行完毕之后,执行END中的相关操作

案列1:把/etc/passwd中的包含root的行打印出来

awk -F: '/root/' /etc/passwd

 案例2:把/etc/passwd中以root开头的行打印出来

awk -F: '/^root/' /etc/passwd

 案例3:/etc/passwd中匹配第三列和第五列的数据

awk -F: '{print $5,$3}' /etc/passwd

 案例4:打印以root或者ftp开头的行的解析器

awk -F: '/^root|^ftp/{print $7}' /etc/passwd
或者
awk -F: '/^(root|ftp)/{print $7}' /etc/passwd

3、工作原理

(1)awk会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行也可称为一个记录,行的边界是以换行符作为结束(表明:awk是一行一行的去处理文本的)

awk -F: '{print $0}' /etc/passwd

 (2)然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段

注意:如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格,如果说要指定分隔符,需要使用-F参数或者重新定义FS变量

awk -F: '{print $2}' /etc/passwd

 (3)使用print函数打印,如果$1$3之间没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号

awk -F: '{print $1,$3}' /etc/passwd

4、awk参数

参数 解释
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f  从脚本文件中读取awk命令

对于awk而言,变量分为

  1. 内置变量
  2. 外置变量
内置变量 解释
FS

输入字段分隔符,默认为空白字符

OFS  输入字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时指定符号代替换行符
NF NF:number of Filed,当前行的字段的个数(即当前行被分割了几列),字段数量
NR NR:行号,当前处理文本行的行号
FNR FNR:各文件分别计数的行号
FLIENAME FLIENAME:当前文件名
ARGC ARGC:命令行参数的个数
ARGV ARGV:数组,保存的是命令行所指定的各参数  

 

案列1:自定义输出内容

awk,必须外层单引号,内层双引号

内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号

awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd

 

案列2:显示文件的行号

NR表示文件的行号,NR==5表示行号是5的那一行

注意一个等于号,是修改变量值得意思,两个等于号是关系运算符,是“等于”的意思

 awk 'NR==5' passwd 

 

 显示文件2-5行内容

awk 'NR==2,NR==5' passwd 

 显示文件2-5行且输出行号

awk 'NR==2,NR==5 {print NR,$0}' passwd 

 案列3:显示文件的第一列,倒数第二和倒数第三列

awk '{print $1,$(NF-1)}' test.txt 
awk '{print $1,$(NF-1),$(NF-2)}' test.txt

 案列4:awk分隔符

  输入分隔符:awk默认是空格,空白字符,变量名是FS

  输出分隔符:简称OFS

FS输入分隔符:awk逐行处理文本的时候,以输入分割符为准,把文本切成多个片段,默认符号是空格,当我们处理特殊文本的时候,没有空格的时候,可以自由指定分割符特点

awk -F ":" '{print $1}' passwd

 除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-v选项搭配,修改FS变量

awk -v FS=":" '{print $1,$NF}' passwd 

 OFS输出分割符:awk执行完命令,默认用空格隔开每一列,这个空格就是awk的默认输出符。可以通过OFS指定分隔符

awk -F ":" -v OFS="--" '{print $1,$NF}' passwd 

案列5:处理多个文件显示行号

#普通的NR变量,会将多个文件按照顺序排序
awk '{print NR,$0}' old.txt test.txt 

#使用FNR可以分别对文件行数进行计数
awk '{print FNR,$0}' old.txt test.txt 

 案列6:内置变量RS和ORS

ORS是输出分隔符的意思,awk默认认为,每一行结束了,就得添加回车换行符

ORS可以更改输出符

awk -v ORS="xiaonuo666" '{print NR,$0}' test.txt

awk -v RS=" " '{print NR,$0}' test.txt

 案例7:ARGC和ARGV

ARGV表示的是一个数组,数组中保存的是命令行所给的参数

awk 'BEGIN{print "开始用awk了"}{print ARGV[0],$0}' test.txt
awk 'BEGIN{print "开始用awk了"}{print ARGV[1],$0}' test.txt 
awk 'BEGIN{print "开始用awk了"}{print ARGV[0],ARGV[1]}' test.txt 

案例8:自定义变量 

  方法一:-v varName=value

  方法二:在程序中直接定义

awk -v myname="xiaonuo" 'BEGIN{print "我的名字是?",myname}'

myname="xiaonuo"
awk -v awk_name=$myname 'BEGIN{print awk_name}'

5、awk pattern

回顾一下awk的语法

awk [option] 'pattern[action]' file...

现在讲解特殊的pattern:BEGIN和END

BEGIN模式是处理文本之前需要执行的操作

END模式是处理所有行之后需要执行的操作

awk 'BEGIN{print "文本之前的操作开始了"}{print $0}END{print "END操作开始了"}' test.txt

awk模式

关系运算符 解释 示例
< 小于 x<y
<= 小于等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>=

大于等于

x>=y
> 大于 x>y
~ 匹配正则 x~/正则/
!~ 不匹配正则 x!~/正则/

awk与正则表达式

正则表达式主要与awk的pattern模式结合使用

  不指定模式,awk每一行都会执行对应的动作

  指定模式,只有被模式匹配到的,符合条件的才会执行动作

awk '/正则表达式/动作'  /etc/passwd

 

  awk使用正则表达式,必须把正则放入“//”双斜杠中,匹配到结果后执行动作{print $0},打印整行信息

行范围模式

awk '/正则1/,/正则2/{动作}' file.txt