文本处理 awk
一 awk简介:
awk是一种编程语言,用于在linux或者unix系统下对文本或者数据进行处理, 数据可以来自标准输入,一个或者多个
文件,或者其他命令输出,他支持用户自定义函数和动态正则表达式功能,是linux和unix下强大的编程工具,可以在命
令中使用但是更多的是作为脚本来使用
awk处理文本和数据的方式是这样的,它逐行扫描文件,送第一行到最后一行,寻找匹配特定模式的行,并在这些行上面
进行你想要的操作,如果没有指定处理动作,则把匹配的行显示在标准输出(屏幕),如果没有指定模式,则操作所有行,
awk分别代表作者姓氏的地一个字母,gawk是awk的GNU版本,他提供了Bell实验室和GNU的一些扩展
二 awk的两种形式的语法格式
awk [options] ‘commands’ filenames
awk [options] -f ‘awk-script-file’ filenames默认为换行符号回车
==options
-F 定义输入字段分割符号,默认的分割符是空格或者制表符(tab)
==commands
BEGIN{} 行处理前
{} 行处理中
END{} 行处理后
awk ‘BEGIN{FS=":";OFS=":"} {print $1,$2} END{print “------------”}’ /etc/passwd
==awk命令格式
1 awk ‘/pattern/’ filename
示例: awk ‘/^root/’ /etc/passwd
2 awk ‘{action}’ fiename
示例: awk -F: ‘{print $1}’ /etc/passwd
3 awk ‘/pattern/ {action}’ filename
示例: awk ‘/^r…t/ {print $1}’ /etc/passwd
awk ‘BEGIN{FS=":"}/^root/ {print $1,$2}’ /etc/passwd
4 command | awk ‘/pattern/ {action}’
示例: cat /etc/passwd | awk ‘/^root/ {print $1}’
===记录与字段相关的内部变量
$0 保存当前记录的内容,整行内容
NR 全部记录的行号, 多个输入文件记录的行号相加
FNR 当前记录的行号,仅为当前文件而非全部输入的文件
NF 当前记录的字段个数
FS 输入字段分割符,默认为空格
OFS 输出字段分割符,默认为空格
RS 输入记录分割符号(默认为换行符号回车)
ORS 输出记录分割符号(默认为换行符号回车)
CONVFMT 用于数字的字符串转换格式(默认格式 %.6g)
ENVIRON 环境变量的关联数组
OFMT 数字的输出格式(默认为%.6g)
ARGC 命令行中的参数个数
ARGV 包含命令行参数的数组
awk格式话输出
print函数
date | awk ‘{print "Month: "KaTeX parse error: Undefined control sequence: \nYear at position 4: 2 "\̲n̲Y̲e̲a̲r̲: "NF}’
awk -F: ‘{print “username:”$1"\tuid is:"$3}’ /etc/passwd
awk -F: ‘{print “\tusername and uid:” $1,$3 “!”}’ /etc/passwd
printf函数
%s 字符类型
%d 数值类型
%f 浮点类型
-15s 代表 占用15个字符, -代表左对齐, 默认是右面对齐,printf默认不会在尾部加\n
awk -F: ‘{printf “%-15s %-10s %-15s\n”,$1,$2,$3}’ passwd
awk -F: ‘{printf “|%-15s|%-10s|%-15s|\n”,$1,$2,$3}’ passwd
awk的模式和动作
任何awk语句都是由模式和动作组成,模式部分决定动作语句何时触发及触发语句,处理即对数据进行的操作,如果省略模式部分,动作将时刻保持执行状态.模式可以是任何条件语句或复合语句或者正则表达式,模式包括两个特殊字段BEGIN和END.使用BEGIN语句设置计数和打印头,BEGIN语句可以使用在任何文本动作之前,之后文本浏览动作依据输入文本开始执行,END语句用来在awk完成文本浏览之后打印输出文本总数和结尾状态.
awk模式:
====正则表达式
1 匹配记录整行内容
awk ‘/alice/{print $0}’ /etc/passwd
awk ‘$0 ~ /alice/’ /etc/passwd
awk ‘!/alice/’ /etc/passwd
awk ‘$0 !~ /alice/’ /etc/passwd
2 匹配字段 匹配操作符(~ !~)
awk ‘$1 ~ /root/’ /etc/passwd
awk ‘$NF ~ //bin/bash/’ /etc/passwd
awk ‘ N F ! / b a s h NF !~ /bash NF! /bash/’ /etc/passwd
awk ‘$NF ~ //bin/bash/’ /etc/passwd
====比较表达式
比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作,比较表达式使用关系运算符号,用于比较数字与字符串
关系运算符号
运算符号
含义
示例
<
大于
x<y
<=
小于等于
x<=y
==
等于
x==y
!=
不等于
x!=y
=
大于等于
x>=y
大于
x>y
举例子:
awk -F: ‘$3 > 0 {print $0}’ passwd
awk ‘$3 == 0 {print $0}’ passwd
awk -F: ‘$NF == “/bin/bash” {print $0}’ /etc/passwd