awk使用

awk使用

命令格式

awk  -F 分隔符  -v  key=value  ‘BEGIN {初始化} {循环执行部分}  END  {结束处理}’   file  file2.....

参数
-F  指定分隔符  默认为空格   -F  ':'
-v   定义变量 a=1 k=v

常用变量
$0   当前读取的整行数据
$1-$n  分隔符后的第一列数据,第二列....
NF   每次被分割之后的字段数量
NR   awk 读取的行数
FNR   当前读取的记录数,不同于NR,因为当awk读取第二个文件的时候,FNR就会从0开始,但是NR会继续递增
RS  输入文件的行分隔符,缺省是换行符\n  ORS 输出文件行分隔符
FS  输入文件的列分割字符,默认为tab和空格  OFS输出文件列分隔符

BEGIN和END

END  读完所有数据后执行
BEGIN  在读取数据之前执行

打印

print  默认输出字段分隔符和记录分隔符
printf 默认不输出字段分隔符和记录分隔符,适用于行转列操作,或格式化输出

运算符

 =   赋值  += -=  /= *=  %=求余   ^=求幂 
 == >=  <=  !=  > < 比较
 && ||  ! 与或非
~ !~ 匹配正则

if判断

awk '{if($1>3){print a}else{print b}}' 
substr提取字符串
substr(要提取的字段,要提取字段的位置,要提取的字符的数量)
比如 zhangzhizhong   文件中只有一个字段用$1
提取zhang  substr($1,1,5)
提取zhi    substr($1,6,3)
提取zhong  substr($1,9,5)

for循环

awk '{for(a=1;a<=10;a++){print a}}'#for循环语法格式1
for(初始化; 布尔表达式; 更新) {
//代码语句
}
 
#for循环语法格式2
for(变量 in 数组) {
//代码语句
}
 
#while循环语法
while( 布尔表达式 ) {
//代码语句
}
 
#do...while循环语法
do {
//代码语句
}while(条件)
#for循环语法格式1
for(初始化; 布尔表达式; 更新) {
//代码语句
}
 
#for循环语法格式2
for(变量 in 数组) {
//代码语句
}
 
#while循环语法
while( 布尔表达式 ) {
//代码语句
}
 
#do...while循环语法
do {
//代码语句
}while(条件)
与其他编程语言中一样,在awk中,同样可以使用break与continue跳出循环。

continue的作用:跳出”当前”循环

break的作用:跳出”整个”循环

数组

a[b]a[1]=10   a[1,2]=10

内置函数

gsub(a,b,str)全局替换 把str字符串中所有的a字段替换成b字段
sub()执行第一次替换,
index(str,a) 存在返回编号,不存在返回0
length(str) 返回str的长度
split(str,数组名,"分隔符") 字段分割,
mktime(YYYY MM DD HH MM SS)生成时间格式 把当前输入的时间转换为timestamp,1970年1月1日以来计算
systime()  当前时间timestamp
strftime("Time = %m/%d/%Y %H:%M:%S", systime()) 格式化时间 

序号	描述
%a	星期缩写(Mon-Sun)。
%A	星期全称(Monday-Sunday)。
%b	月份缩写(Jan)。
%B	月份全称(January)。
%c	本地日期与时间。
%C	年份中的世纪部分,其值为年份整除100。
%d	十进制日期(01-31)
%D	等价于 %m/%d/%y.
%e	日期,如果只有一位数字则用空格补齐
%F	等价于 %Y-%m-%d,这也是 ISO 8601 标准日期格式。
%g	ISO8610 标准周所在的年份模除 100(00-99)。比如,1993 年 1 月 1 日属于 1992 年的第 53 周。所以,虽然它是 1993 年第 1 天,但是其 ISO8601 标准周所在年份却是 1992。同样,尽管 1973 年 12 月 31 日属于 1973 年但是它却属于 1994 年的第一周。所以 1973 年 12 月 31 日的 ISO8610 标准周所在的年是 1974 而不是 1973。
%G	ISO 标准周所在年份的全称。
%h	等价于 %b.
%H	用十进制表示的 24 小时格式的小时(00-23)
%I	用十进制表示的 12 小时格式的小时(00-12)
%j	一年中的第几天(001-366)
%m	月份(01-12)
%M	分钟数(00-59)
%n	换行符 (ASCII LF)
%p	十二进制表示法(AM/PM)
%r	十二进制表示法的时间(等价于 %I:%M:%S %p)。
%R	等价于 %H:%M。
%S	时间的秒数值(00-60)
%t	制表符 (tab)
%T	等价于 %H:%M:%S。
%u	以数字表示的星期(1-7),1 表示星期一。
%U	一年中的第几个星期(第一个星期天作为第一周的开始),00-53
%V	一年中的第几个星期(第一个星期一作为第一周的开始),01-53。
%w	以数字表示的星期(0-6),0表示星期日 。
%W	十进制表示的一年中的第几个星期(第一个星期一作为第一周的开始),00-53。
%x	本地日期表示
%X	本地时间表示
%y	年份模除 100。
%Y	十进制表示的完整年份。
%z	时区,表示格式为+HHMM(例如,格式要求生成的 RFC 822或者 RFC 1036 时间头)
%Z	时区名称或缩写,如果时区待定则无输出。

相关案例

1、 取第二行的数据
awk 'NR==2{print $0}'
2、 取第二列数据
awk '{print $2}'
3、取包含xxx的行
awk '/xxx/{print $0}'
4、取第二行到第五行的数据
awk 'NR==2,NR==5{print $0}'
awk 'NR>=2 &&NR<=5{print $0}'
5、取包含aaa或bbb的行
awk '/aaa|bbb/{print $0}'
6、 取出包含aaa到bbb的行
awk '/aaa/,/bbb/{print $0}'

7、分隔符为: 取第一列数据
awk -F: '{print $1}'
awk  'BEGIN{FS=":"}{print $1}'

8、包含~ 不包含!~
取第三列中包含a的打印
awk '$3~/a/{print $0}'

awk使用
http://www.jcwit.com/article/207/
作者
Carlos
发布于
2023年11月20日
许可协议