作用:
awk 适合处理 类似于数据库表的文本 对文本进行格式化;
以行为单位,对符合条件的行进行相应的处理
-----------------------------------------------------------------------------------
格式:
awk [options] 'Pattern1 {Action1} Pattern2 {Action2}' Filename1, Filename2
格式说明:
[options]:
awk命令的选项,包括:-F指定输入分隔符,例如-F: -v设定变量的值(通常用于设定输出字段分隔符)
--posix 或者 --re-interval:正则表达式中使用{m,n}时需要加上
Pattern:
模式,条件,包括空模式(不写条件,所有行全都匹配),BEGIN模式,END模式,关系运算模式,正则模式,行范围模式
Action:
对符合条件的行所进行的处理动作
--------------------------------------------------------------------------------------------------
内置变量
FS输入字段分隔符,默认为空白字符
OFS输出字段分隔符,默认为空白字符
NF当前行的字段数
NR当前行的行号
FNR各文件分别计数的行号
FILENAME当前文件名
$0整行
$1第一个字段
$NF最后一个字段
$(NF-1)倒数第二个字段
例1:[root@localhost ~]# awk -F: -v OFS="\t" '{print $1,$(NF-1)}' /etc/passwd
------------------------------------------------------------------------------------------------------
BEGIN模式:
该模式的Action指定了,在处理文件第一行之前需要先执行的动作,通常用于制作表头
END模式:
该模式的Action指定了,在处理完文件的最后一行之后需要执行的动作,通常用于制作表尾
---------------------------------------------------------------------------------------------------------------
关于输出分割符
[root@localhost ~]# awk -F: -v OFS="\t" '{print $1,$NF}' /etc/passwd
[root@localhost ~]# awk -F: -v OFS="\t" '{print $1 $NF}' /etc/passwd
[root@localhost ~]# awk -F: -v OFS="\t" '{print $1 "#" $NF}' /etc/passwd
字段之前有逗号,时字段之间以输出分割符隔开显示;
字段之间为空格时,两个字段连在一起显示;
也可以在字段之间自定义用来分割输出的内容。
-------------------------------------------------------------------------------------------------------------
print printf
print 会输出换行符
printf 不会输出换行符,可以对文本进行格式化输出
例2:[root@localhost ~]# awk -F: '{printf "%-20s\t%-20s\n" , $1,$NF}' /etc/passwd
----------------------------------------------------------------------------------------------------------------
关系运算模式
包括 < <= == != > >=
~ 与对应的正则表达式匹配
!~与对应的正则表达式不匹配
例3:[root@localhost ~]# awk -F: '$1=="root" {printf "%-20s\t%-20s\n" , $1,$NF}' /etc/passwd
-----------------------------------------------------------------------------------------------------------------------------
正则模式
格式 /正则表达式/(不要引号,用到/时需要转义即\/)
单独写/正则表达式/即没有出现~时,表示$0~/正则表达式/
例4
[root@localhost ~]# awk -F: '/^root/ {printf "%-20s\t%-20s\n" , $1,$NF}' /etc/passwd
等价于
[root@localhost ~]# awk -F: '$0~/^root/ {printf "%-20s\t%-20s\n" , $1,$NF}' /etc/passwd
awk中使用的正则表达式属于扩展正则表达式
使用{m,n}时需要加上 --posix 或者 --re-interval
-------------------------------------------------------------------------------------------------
行范围模式
格式: awk '/正则表达式1/,/正则表达式2/ {Action}' FileName
对第一次匹配到正则表达式1的行和第一次匹配到正则表达式2的行(这两行包括)之间的行执行Action
------------------------------------------------------------------------------------------------------------
Action
Action中可以类似于C语言那样使用 if else for while等,
特有的next:结束对当前行的处理,直接处理下一行
还可以使用内置函数
---------------------------------------------------------------------------------------------------------------
内置函数
先srand 后rand 产生随机数
int取整
gsub sub 字符替换
gsub("l","L","$1")第一个字段中的l替换为L
sub("l","L","$1")第一个字段中的第一个l替换为L
第三个参数省略时默认为$0