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而言,变量分为
- 内置变量
- 外置变量
内置变量 | 解释 |
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
标签:etc,passwd,命令,详解,awk,分隔符,print,NR From: https://www.cnblogs.com/gengxiaonuo/p/17603636.html