awk实例

1.时间段匹配

[[email protected] ~]# cat c

10:01

10:02

10:03

10:05

10:06

10:07

12:01

11:01

[[email protected] ~]# awk ‘$1>="10:05" &&
$1<="11:10"‘ c

10:05

10:06

10:07

11:01

awk的时间匹配是不受时间顺序的影响

[[email protected] ~]# awk ‘/10:05/,/11:10/‘ c

10:05

10:06

10:07

12:01

11:01

而这种匹配是受数值顺序的影响的,这里需要特别注意

2.awk中调用shell中的变量

文件内容

[[email protected] ~]#
cat a

2017-04-19
10:26:56 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:27:03 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:31:18 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:31:31 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:32:42 EcChannel EC EcChannel-4 socketuser4

2017-04-19
10:33:03 EcChannel EC EcChannel-3 socketuser3

2017-04-19 10:33:04
EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:33:16 EcChannel EC EcChannel-4 socketuser4

2017-04-19
10:33:37 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:34:32 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:35:00 EcChannel EC EcChannel-3 socketuser3

2017-04-19
10:35:07 EcChannel EC EcChannel-3 socketuser3

2017-04-19
15:04:39 EcChannel EC EcChannel-3 socketuser3

2017-04-19
15:04:39 EcChannel EC EcChannel-3 socketuser3

2017-04-19
18:10:39 EcChannel EC EcChannel-3 socketuser3

要求:

  过滤从现在的时间开始,到10个小时之前或10个小时之后,这个时间段内的行

#!/bin/bash

A=$(date |awk
‘{print $(NF-1)}‘)

B=$(date
--date=‘+10 hour‘ |awk ‘{print $(NF-1)}‘)

awk
‘$2>="‘$A‘" && $2<="‘$B‘"‘ /root/a

解释:

注意的是,awk命令本身需要将模式和动作部分用单引号引用,所以里面引用shell变量是双引号+单引号,双引号是保证正确处理变量值的空格

执行结果:

[[email protected] ~]#
sh b

2017-04-19
15:04:39 EcChannel EC EcChannel-3 socketuser3

2017-04-19
15:04:39 EcChannel EC EcChannel-3 socketuser3

2017-04-19
18:10:39 EcChannel EC EcChannel-3 socketuser3

3.过滤出nginx日志中,页面响应时间最长的URL路径

日志内容如下

192.168.3.1 - -
[08/Jun/2017:01:36:26 +0800] "GET / HTTP/1.1" 304 0 "-"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.001

192.168.3.1 - -
[08/Jun/2017:16:20:10 +0800] "GET /b.html HTTP/1.1" 304 0
"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.212

192.168.3.1 - -
[08/Jun/2017:16:20:16 +0800] "GET /b.html HTTP/1.1" 200 18
"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.022

192.168.3.1 - -
[08/Jun/2017:16:20:16 +0800] "GET /b.html HTTP/1.1" 200 18
"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.12

192.168.3.1 - -
[08/Jun/2017:16:20:16 +0800] "GET /b.html HTTP/1.1" 200 18
"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.032

192.168.3.1 - -
[08/Jun/2017:16:20:16 +0800] "GET /b.html HTTP/1.1" 200 18
"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-" 0.021

 

如果让日志中能够记录页面的响应时间,需要自定义日志,在日志格式中加入$request_time参数

log_format  abc 
‘$remote_addr - $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent
"$http_referer" ‘

                      ‘"$http_user_agent"
"$http_x_forwarded_for" $request_time‘;

 

过滤命令如下

[[email protected]
logs]# grep $(awk ‘BEGIN{a=0}{if
($NF>a){a=$NF}}END{print a}‘ /usr/local/nginx/logs/access.log )
/usr/local/nginx/logs/access.log

结果如下

192.168.3.1 - -
[08/Jun/2017:16:20:10 +0800] "GET /b.html HTTP/1.1" 304 0
"-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko)Chrome/58.0.3029.110 Safari/537.36"
"-" 0.212

 

然后过滤出url

[[email protected]
logs]#grep $(awk ‘BEGIN{a=0}{if ($NF>a){a=$NF}}END{print a}‘
/usr/local/nginx/logs/access.log ) /usr/local/nginx/logs/access.log  |awk ‘{print $6,$7}‘

结果如下

"GET /b.html

原文地址:https://www.cnblogs.com/henglinux/p/9571388.html

时间: 2024-10-21 14:18:38

awk实例的相关文章

Awk 实例

AWK 是一种用于处理文本的编程语言工具.AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法.它的设计思想来源于 SNOBOL4 .sed .Marc Rochkind设计的有效性语言.语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想.在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令.该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式.如果发现匹配内容,则

(转)awk实例练习(二)

文章转自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.html 先来总结一下awk内置变量: ARGC          命令行参数个数 ARGV          命令行参数排列 ENVIRON       支持队列中系统环境变量的使用 FILENAME      awk浏览文件名 FNR           浏览文件的记录数 FS            设置输入域分隔符,等价于命令行-F选项 NF          

(转)awk实例练习(一)

文章转自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591822.html 前一篇学习了awk的基本知识,现在来做一些练习加深一下印象. 假设我们有这样一个待处理的文件"grade.txt": M.Tansley     05/99     48311     Green     8     40     44 J.Lulu     06/99     48317     green     9     24     26

awk 实例练习

假设我们有这样一个待处理的文件"grade.txt": M.Tansley     05/99     48311     Green     8     40     44 J.Lulu     06/99     48317     green     9     24     26P.Bunny     02/99     48     Yellow     12     35     28J.Troll     07/99     4842     Brown-3     12

awk实例(持续更新)

1.显示第几列到第几列. 显示第3至第5列 awk '{for(i=3;i<=5;i++) printf $i""FS;print ""}' file 显示第3列至最后一列 awk '{for(i=3;i<=NF;i++) printf $i""FS;print ""}' file 扩展: find . -mtime 0 -name "*.php" -exec ls -lih {} \; |aw

sed和awk的用法以及区别

sed主要处理"行问题". awk主要处理"列问题". sed实例:sed -n "2p" /file 输出file文件中的第二行 awk实例:awk -F= 'BEGIN{print "hello"}{print $2}END{print "bye"}' /file 以"="为分块符,输出第一行为"hello",中间输出为file的所有行的第二列,最后输出 &quo

awk系列:在awk中如何使用流程控制语句

导读 当你回顾所有到目前为止我们已经覆盖的 awk 实例,从 awk 系列的开始,你会注意到各种实例的所有指令是顺序执行的,即一个接一个地执行.但在某些情况下,我们可能希望基于一些条件进行文本过滤操作,即流程控制语句允许的那些语句. 在 awk 编程中有各种各样的流程控制语句,其中包括: if-else 语句 for 语句 while 语句 do-while 语句 break 语句 continue 语句 next 语句 nextfile 语句 exit 语句 然而,对于本系列的这一部分,我们将

Linux常用命令之awk

标题:awk命令的使用 作用:awk是非常好用的数据处理工具,主要处理每一行的字段内的数据,默认的字段的分割符为空格键或[tab]键 一.awk脚本的基本结构: awk 'BEGIN{print "start"} pattern {commands} END{print "ends"} file // 一个awk脚本通常由:BEGIN语句块.能够使用模式匹配的通用语句块.END语句块3部分组成,这三部分是可选的,任意一部分都可以不出现在脚本中            

使用awk格式化输出文本

注意:本文并不是一篇awk入门文章,而是偏重实例讲解,由于awk是借鉴了c语法,因此awk的许多地方还保留有c语言的痕迹,比如printf语句:for,if的语法结构等 介绍 最简单地说,AWK 是一种用于处理文本的编程语言工具,处理模式是只要在输入数据中有模式匹配,就执行一系列指令.awk命令格式为: awk {pattern + action} {filenames} awk可以读取后接的文件,也可以读取来自前一命令的标准输入,它分别扫描输入数据的每一行,查找命令行中pattern是否匹配.