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/