awk经典实战、正则表达式

目录

1.筛选给定时间范围内的日志

 2.统计独立IP

案列

 需求

代码 

运行结果

3.根据某字段去重

案例

运行结果

4.正则表达式

1)认识正则

 2)匹配字符

3)匹配次数 

4)位置锚定:定位出现的位置

5)分组和后向引用 


1.筛选给定时间范围内的日志

grep/sed/awk用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现。

但是awk提供了mktime()函数,它可以将时间转换成epoch时间值。

root@Ubuntu:~# # 2019-11-10 03:42:40转换成epoch为1970-01-01 00:00:00
root@Ubuntu:~# awk 'BEGIN{print mktime("2023 08 05 08 44 40")}'
1691196280

借此,可以取得日志中的时间字符串部分,再将它们的年、月、日、时、分、秒都取出来,然后放入mktime()构建成对应的epoch值。因为epoch值是数值,所以可以比较大小,从而决定时间的大小。

下面strptime1()实现的是将2023-08-04-12-40-40 29T03:42:40+08:00格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志。

可以利用patsplit来取时间中的数字

root@Ubuntu:~# vim demo.awk
root@Ubuntu:~# cat demo.awk
BEGIN{
#要筛选什么时间的日志,将其时间构建成epoch值
        which_time = mktime("2023 08 04 22 40 29")
}
{
#取出日志的日期时间字符串部分
        #match($0,"^.*\\[(.*)\\].*",arr)
#将日期时间字符串转换为epoch值
        tmp_time = strptime1(arr[1])
#通过比较epoch值来比较时间大小
        if(tmp_time > wgich_time){print}
}
#构建的时间字符串格式为:“2023-08-04T12:40:40+08:00"
function strptime1(str ,arr,Y,M,D,H,m,S){
        patsplit(str,arr,"[0-9]{1,4}")
        Y=arr[1]
        M=arr[2]
        D=arr[3]
        H=arr[4]
        m=arr[5]
        S=srr[6]
        return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}

下面strptime2()实现的是将10/Nov/2023:23:53:44+08:00格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志。

root@Ubuntu:~# vim dwmo.awk
root@Ubuntu:~# cat dwmo.awk
BEGIN{
  # 要筛选什么时间的日志,将其时间构建成epoch值
  which_time = mktime("2023 08 04 11 42 40")
}

{
  # 取出日志中的日期时间字符串部分
  match($0,"^.*\\[(.*)\\].*",arr)
  
  # 将日期时间字符串转换为epoch值
  tmp_time = strptime2(arr[1])
  
  # 通过比较epoch值来比较时间大小
  if(tmp_time > which_time){
    print 
  }
}

# 构建的时间字符串格式为:"10/Nov/2023:23:53:44+08:00"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # dt_sr = "10 Nov 2023 23 53 44 08 00"
  split(dt_str,arr," ")
  Y=arr[3]
  M=mon_map(arr[2])
  D=arr[1]
  H=arr[4]
  m=arr[5]
  S=arr[6]
  return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}

function mon_map(str,mons){
  mons["Jan"]=1
  mons["Feb"]=2
  mons["Mar"]=3
  mons["Apr"]=4
  mons["May"]=5
  mons["Jun"]=6
  mons["Jul"]=7
  mons["Aug"]=8
  mons["Sep"]=9
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]

 2.统计独立IP

? url 访问IP 访问时间 访问人

案列

a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.23|2015-11-20 20:34:48|guest
c.com.cn|202.109.134.24|2015-11-20 20:34:48|guest
a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
a.com.cn|202.109.134.24|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.25|2015-11-20 20:34:48|guest

 需求

统计每个URL的独立访问IP有多少个(去重),并且要为每个URL保存一个对应的文件,得到的结果类似

代码 

BEGIN{
        FS="|"  
}

!arr[$1,$2]++{
        arr1[$1]++
}

END{
        for(i in arr1) {
                print i, arr1[i] >(i".txt")
        }
}

root@Ubuntu:~# awk -f  1.awk demo3.txt
root@Ubuntu:~# ls -al
总计 92
drwx------  6 root root 4096  8月  5 09:50 .
drwxr-xr-x 19 root root 4096  8月  3 17:32 ..
-rw-r--r--  1 root root  109  8月  5 09:50 1.awk
-rw-r--r--  1 root root   11  8月  5 09:50 a.com.cn.txt
-rw-r--r--  1 root root   25  8月  4 10:19 awk
-rw-------  1 root root  973  8月  4 17:19 .bash_history
-rw-r--r--  1 root root 3106 10月 17  2022 .bashrc
-rw-r--r--  1 root root   11  8月  5 09:50 b.com.cn.txt
drwx------  2 root root 4096  8月  3 18:13 .cache
-rw-r--r--  1 root root   11  8月  5 09:50 c.com.cn.txt
drwxr-xr-x  2 root root 4096  8月  4 17:26 .cookiecutters
-rw-r--r--  1 root root  566  8月  4 16:17 demo1.txt
-rw-r--r--  1 root root  250  8月  5 09:24 demo2.txt
-rw-r--r--  1 root root  300  8月  5 09:35 demo3.txt
-rw-r--r--  1 root root  611  8月  5 09:08 demo.awk
-rw-r--r--  1 root root  984  8月  5 08:50 dwmo.awk
-rw-------  1 root root   20  8月  4 10:37 .lesshst
-rw-r--r--  1 root root  161 10月 17  2022 .profile
drwx------  5 root root 4096  8月  3 17:39 snap
drwx------  2 root root 4096  8月  3 17:39 .ssh
-rw-------  1 root root 8280  8月  5 09:50 .viminfo 

运行结果

root@Ubuntu:~# cat a.com.cn.txt 
a.com.cn 2
root@Ubuntu:~# cat b.com.cn.txt 
b.com.cn 2
root@Ubuntu:~# cat c.com.cn.txt 
c.com.cn 1

3.根据某字段去重

去掉uid=xxx重复的行

案例

2019-01-13_12:00_index?uid=123
2019-01-13_13:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710
2019-01-14_12:00_index?uid=123
2019-01-14_13:00_index?uid=123
2019-01-15_14:00_index?uid=333
2019-01-16_15:00_index?uid=9710

 首先利用uid去重,我们需要利用?进行划分,然后将uid=xxx保存在数组中,这是判断重复的依据
然后统计uid出现次数,第一次出现统计,第二次不统计

运行结果

root@Ubuntu:~# vim demo2.txt
root@Ubuntu:~# awk -F"?" '!arr[$2]++{print}' demo2.txt
2019-01-13_12:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710

4.正则表达式

1)认识正则

(1)介绍

  正则表达式应用广泛,在绝大多数的编程语言都可以完美应用,在Linux中,也有着极大的用处。

  使用正则表达式,可以有效的筛选出需要的文本,然后结合相应的支持的工具或语言,完成任务需求。

  在本篇博客中,我们使用grep/egrep来完成对正则表达式的调用

(2)正则表达式类型

正则表达式可以使用正则表达式引擎实现,正则表达式引擎是解释正则表达式模式并使用这些模式匹配文本的基础软件。

在Linux中,常用的正则表达式有:

  • POSIX 基本正则表达式(BRE)引擎

  • POSIX 扩展正则表达式(BRE)引擎

 2)匹配字符

  • . 匹配任意单个字符,不能匹配空行

  • [] 匹配指定范围内的任意单个字符

  • [^] 取反

  • [:alnum:] 或 [0-9a-zA-Z]

  • [:alpha:] 或 [a-zA-Z]

  • [:upper:] 或 [A-Z]

  • [:lower:] 或 [a-z]

  • [:blank:] 空白字符(空格和制表符)

  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

  • [:digit:] 十进制数字 或[0-9]

  • [:xdigit:]十六进制数字

  • [:graph:] 可打印的非空白字符

  • [:print:] 可打印字符

  • [:punct:] 标点符号

3)匹配次数 

  • * 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配

  • .* 任意前面长度的任意字符,不包括0次

  • \? 匹配其前面的字符0 或 1次

  • + 匹配其前面的字符至少1次

  • {n} 匹配前面的字符n次

  • {m,n} 匹配前面的字符至少m 次,至多n次

  • {,n} 匹配前面的字符至多n次

  • {n,} 匹配前面的字符至少n次

 

4)位置锚定:定位出现的位置

  • ^ 行首锚定,用于模式的最左侧

  • $ 行尾锚定,用于模式的最右侧

  • ^PATTERN$,用于模式匹配整行

  • ^$ 空行

  • ^[[:space:]].*$ 空白行

  • < 或 \b 词首锚定,用于单词模式的左侧

  • > 或 \b 词尾锚定;用于单词模式的右侧

  • <PATTERN>

5)分组和后向引用 

① 分组:() 将一个或多个字符捆绑在一起,当作一个整体进行处理

  分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

② 后向引用

引用前面的分组括号中的模式所匹配字符,而非模式本身

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

\2 表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推

& 表示前面的分组中所有字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32 Max30102 (3)修复心率误差

1. 运行效果 2. 新建修复心率误差.py 代码如下: from machine import sleep, SoftI2C, Pin, Timer from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM from hrcalc import calc_hr_and_spo2BEATS = 0 # 存储心率 FINGER_F…

如何识别手机是否有灵动岛(dynamic island)

如何识别手机是否有灵动岛&#xff08;dynamic island&#xff09; 灵动岛是苹果2022年9月推出的iPhone 14 Pro、iPhone 14 Pro Max首次出现&#xff0c;操作系统最低是iOS16.0。带灵动岛的手机在竖屏时顶部工具栏大于等于51像素。 #define isHaveDynamicIsland ({ BOOL isH…

Taro保存图片到手机

萌新亚历山大啊&#xff0c;搞了一下午&#xff0c;真多坑 Taro.downloadFile({url: res,filePath: Taro.env.USER_DATA_PATH /xcxcode.jpg,success: res > {if (res.statusCode 200) {console.log(res)const tempFilePath res.filePath; // 获取下载的临时文件路径// …

编程(Leetcode, SQL)知识

有志者&#xff0c;事竟成 1. Nim游戏 2. sql中求连续时间的问题 思路&#xff1a;一般来说&#xff0c;有两种方向。一种如果是日期的格式&#xff0c;求连续时间可以先提取出日期中的月份或者天&#xff0c;然后减去row_number()生成的rank&#xff0c;以此来计算分组或者不…

微信小程序的项目解构

视频链接 黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili 接口文档 https://www.escook.cn/docs-uni-shop/mds/1.start.html 1&#xff1a;微信小程序宿主环境 1&#xff1a;常见的宿…

如何创建Google test shared library(dll)和static library(lib),并编写测试用例

从Github下载google test源码确保本地安装Visual Studio和CMake GUI&#xff0c;本次测试使用VS2017及Cmake GUI 3.20.5解压googletest-main&#xff0c;打开Cmake GUI&#xff0c;配置源码路径&#xff08;googletest-main路径&#xff09;&#xff0c;和生成路径&#xff08;…

安达发制造工业迈向智能化:APS高级计划排程助力提升生产效率

随着市场竞争的加剧&#xff0c;制造企业纷纷寻求提高生产效率和降低成本的方法。近年来&#xff0c;越来越多的制造企业开始采用APS(高级计划与排程)系统&#xff0c;以优化生产计划和排程&#xff0c;提高生产效率&#xff0c;并在竞争中取得优势。 现代制造业通常面临复杂的…

【第一阶段】kotlin的range表达式

range:范围&#xff1a;从哪里到哪里的意思 in:表示在 !in&#xff1a;表示不在 … :表示range表达式 代码示例&#xff1a; fun main() {var num:Int20if(num in 0..9){println("差劲")}else if(num in 10..59){println("不及格")}else if(num in 60..89…

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法 PyTorch强化学习:介绍强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法引言强化学习的基本概念状态(State)动作(Action)奖励(Reward)策略(Pol…

c语言每日一练(3)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

MySQL数据库的操作

MySQL 连接服务器 库的操作创建数据库数据库删除查看数据库进入数据库查看所在的数据库修改数据库显示创建语句查看连接情况 表的操作创建表查看数据库所有的表查看表的详细信息查看创建表时的详细信息删除表修改表名向表中插入数据在表结构中新增一列对表结构数据的修改删除表…

std::string 的append方法 存放文本和非文本数据

今天在用std::string来拼接数据 有文本数据 也有 非文本数据 如果是文本数据那么append方法参数为 ( char *data, int len&#xff09; 将data的前len个字节附加到 string中 如果是非文本数据 则参数为&#xff08;int size, char data&#xff09;; 重复size个data 附加…

SolidUI社区-AI模型代理

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

【技巧】如何保护PowerPoint不被改动?

PPT&#xff0c;也就是PowerPoint&#xff0c;是很多小伙伴在工作生活中经常用到的图形演示文稿软件。 做好PPT后&#xff0c;担心自己不小心改动了或者不想他人随意更改&#xff0c;我们可以如何保护PPT呢&#xff1f;下面小编就来分享两个常用的方法&#xff1a; 1. 将PPT改…

【周赛第69期】满分题解 软件工程选择题 枚举 dfs

目录 选择题1.2.3.4.面向对象设计七大原则 编程题S数最小H值 昨晚没睡好&#xff0c;脑子不清醒&#xff0c;痛失第1名 选择题 1. 关于工程效能&#xff0c;以下哪个选项可以帮助提高团队的开发效率&#xff1f; A、频繁地进行代码审查 B、使用自动化测试工具 C、使用版本控…

STM32 4G学习(二)

特性参数 ATK-IDM750C是正点原子开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和电信4G手机卡。 它以高速率、低延迟和无线数传作为核心功能&#xff0c;可快速解决应用场景下的无线数传方案。 它支持TCP/UDP/HTTP/MQTT/DNS/RNDIS/NTP协议&#xff0c;支持…

ASCP系列电气防火限流式保护器在养老院的应用-安科瑞黄安南

摘要&#xff1a;2020年&#xff0c;我国65岁及以上老年人口数量为1.91亿&#xff0c;老龄化率达到13.5%。总体来看&#xff0c;大部分省市的养老机构数量还较少。养老设施的建设与民生息息相关&#xff0c;养老院的电气安全也非常重要。如果发生电气火灾&#xff0c;对于行动不…

lab7 proxylab

前情提要&#xff0c;如果看了书本&#xff0c;这个lab难度不高&#xff0c;但是如果不看书&#xff0c;难度还是挺高的&#xff0c;并且这个lab会用到cachelab中学到的东西&#xff0c;需要阅读 第十章&#xff1a;系统编程第十一章&#xff1a;网络编程第十二章&#xff1a;…

Licheepi Nano屏幕驱动并输出打印信息

Licheepi Nano买回来好长时间&#xff0c;没咋玩&#xff0c;最近看了一个利用F1C100S自制迷你电脑的博客&#xff0c;里面主要参考的就是Licheepi Nano。我打算先在Licheepi Nano上完成屏幕操作、Debian文件系统和USB键盘等内容&#xff0c;这里介绍怎样利用Licheepi Nano外接…

Oracle单实例升级补丁

目录 1.当前DB环境2.下载补丁包和opatch的升级包3.检查OPatch的版本4.检查补丁是否冲突5.关闭数据库实例&#xff0c;关闭监听6.应用patch7.加载变化的SQL到数据库8.ORACLE升级补丁查询 oracle19.3升级补丁到19.18 1.当前DB环境 [oraclelocalhost ~]$ cat /etc/redhat-releas…