电脑公司网站系统源码,学生个人静态网页制作过程,电子商务网站建设与管理英文,wordpress 酒店目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK
awk、grep、sed是linux操作文本的三大利器#xff0c;合称文本三剑客。三者的功能都是处理文本合称文本三剑客。三者的功能都是处理文本但侧重点各不相同其中属awk功能最强大但也最复杂。grep更适合单纯的查找或匹配文本sed更适合编辑匹配到的文本awk更适合格式化文本对文本进行较复杂格式处理。三剑客最好要搭配神兵利器正则表达式一起使用。
2.正则表达式 3.语法
1.awk [options] program varvalue file…2.awk [options] -f programfile varvalue file…3.awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file … 语法说明1.pattern部分决定动作语句何时触发及触发事件BEGIN、END 2.action 对数据进行处理放在{}内指明print、printf 3.最常用的是 print默认以空白字符分隔 4.options 参数输入分隔符默认以空白字符分隔通过 -F 选项来执行分隔符
4.内置变量
FS 输入字段分隔符默认为空白字符OFS 输出字段分隔符默认为空白字符RS 输入记录分隔符指定输入时的换行符原换行符仍有效ORS输出记录分隔符输出时用指定符号代替换行符NF 字段数量共有多少字段 N F 引用最后一列 NF引用最后一列 NF引用最后一列(NF-1)引用倒数第2列NR 行号后可跟多个文件第二个文件行号继续从第一个文件最后行号开始FNR 各文件分别计数, 行号后跟一个文件和NR一样跟多个文件第二个文件行号从1开始FILENAME 当前文件名ARGC命令行参数的个数ARGV 数组保存的是命令行所给定的各参数查看参数
示例
[rootlocalhost ~]# cat awkdemo //示例文件
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[rootlocalhost ~]# awk -v FS: {print $1,$2} awkdemo
hello world
linux redhat
along love
[rootlocalhost ~]# awk -v FS: -v OFS--- {print $1,$2} awkdemo
hello---world
linux---redhat
along---love
[rootlocalhost ~]# awk -v FS: -v ORS--- {print $1,$2} awkdemo
hello world---linux redhat---along love---[rootlocalhost ~]# awk -F: {print NF} awkdemo
2
4
3
[rootlocalhost ~]# awk -F: {print $(NF-1)} awkdemo
hello
lalala
love
[rootlocalhost ~]# awk {print NR} awkdemo awkdemo
1
2
3
4
5
6
[rootlocalhost ~]# awk END{print NR} awkdemo awkdemo
6
[rootlocalhost ~]# awk {print FNR} awkdemo awkdemo
1
2
3
1
2
3
[rootlocalhost ~]# awk {print FILENAME} awkdemo
awkdemo
awkdemo
awkdemo
[rootlocalhost ~]# awk BEGIN {print ARGC} awkdemo awkdemo
3printf命令
1格式化输出
printf FORMAT, item1,item2, ...必须指定FORMAT 不会自动换行需要显式给出换行控制符\n FORMAT 中需要分别为后面每个item 指定格式符
2格式符与item 一一对应 %c: 显示字符的ASCII码 %d, %i: 显示十进制整数 %e, %E: 显示科学计数法数值 %f 显示为浮点数小数 %5.1f带整数、小数点、整数共5位小数1位不够用空格补上 %g, %G 以科学计数法或浮点形式显示数值 %s 显示字符串例%5s最少5个字符不够用空格补上超过5个还继续显示 %u 无符号整数 %%: 显示% 自身
3修饰符放在%c[/d/e/f…]之间
#[.#]第一个数字控制显示的宽度第二个# 表示小数点后精度%5.1f-左对齐默认右对齐 %-15s显示数值的正负符号 %d
[rootlocalhost ~]# awk -F: {print $1,$3} /etc/passwd
root 0
bin 1
daemon 2
// 第一列显示小于20的字符串第2列显示整数并换行
[rootlocalhost ~]# awk -F: {printf %20s---%u\n,$1,$3} /etc/passwdroot---0bin---1daemon---2
// 使用-进行左对齐第2列显示浮点数
[rootlocalhost ~]# awk -F: {printf %-20s---%-10.3f\n,$1,$3} /etc/passwd
root ---0.000
bin ---1.000
daemon ---2.000
adm ---3.000 5.复现awk经典实例
(1).插入几个新字段
在a b c d的b后面插入3个字段e f g。
[rootlocalhost ~]# echo a b c d | awk {$2$2 e f g;print}
a b e f g c d(2).格式化空白
移除每行的前缀、后缀空白并将各部分左对齐。
[rootlocalhost ~]# cat shiyan.txt aaaa bbb ccc bbb aaa ccc
ddd fff eee gg hh ii j
[rootlocalhost ~]# awk BEGIN{OFS\t}{$1$1;print} shiyan.txt
aaaa bbb ccc
bbb aaa ccc
ddd fff eee gg hh ii j(3).筛选IPv4地址
从ip a命令的结果中筛选出除了lo网卡外的所有IPv4地址。 (4).筛选给定时间范围内的日志
下面strptime2()实现的是将10/Nov/2019:23:53:4408:00格式的字符串转换成epoch值然后和which_time比较大小即可筛选出精确到秒的日志。
BEGIN{# 要筛选什么时间的日志将其时间构建成epoch值which_time mktime(2019 11 10 03 42 40)
}{# 取出日志中的日期时间字符串部分match($0,^.*\\[(.*)\\].*,arr)# 将日期时间字符串转换为epoch值tmp_time strptime2(arr[1])# 通过比较epoch值来比较时间大小if(tmp_time which_time){print }
}# 构建的时间字符串格式为10/Nov/2019:23:53:4408:00
function strptime2(str ,dt_str,arr,Y,M,D,H,m,S) {dt_str gensub([/:], ,g,str)# dt_sr 10 Nov 2019 23 53 44 08 00split(dt_str,arr, )Yarr[3]Mmon_map(arr[2])Darr[1]Harr[4]marr[5]Sarr[6]return mktime(sprintf(%s %s %s %s %s %s,Y,M,D,H,m,S))
}function mon_map(str ,mons){mons[Jan]1mons[Feb]2mons[Mar]3mons[Apr]4mons[May]5mons[Jun]6mons[Jul]7mons[Aug]8mons[Sep]9mons[Oct]10mons[Nov]11mons[Dec]12return mons[str]
}