首页 > 其他分享 >AWK进阶教程:精通match函数,让字符串搜索游刃有余!

AWK进阶教程:精通match函数,让字符串搜索游刃有余!

时间:2024-09-30 22:52:55浏览次数:9  
标签:10 匹配 进阶 Activated AWK Plan Data match

AWK 中的 match 函数允许你在字符串中搜索模式。在本教程中,你将学习如何使用 awk match 函数,基于匹配结果执行条件处理,并遍历字符串中的多个匹配项。

语法和用法

awk match函数的基本语法是:

awk '{ if (match($0, pattern)) print $0; }' filename

这里,$0表示整行输入,pattern是在文件名文件的每行中搜索的正则表达式。

下面是sample_data.txt的文件,它里面装满了各种有趣的日志信息哦。

2024-03-10 10:15:00, Data Plan Activated, User 45678
2024-03-10 10:17:00, Data Plan Deactivated, User 12345
2024-03-10 10:19:00, Payment Received, User 45678

查找与Data Plan Activated相关的所有条目,使用以下命令:

awk '{ if (match($0, "Data Plan Activated")) print $0; }' sample_data.txt

输出结果如下所示:

2024-03-10 10:15:00, Data Plan Activated, User 45678

该命令在每行中搜索短语Data Plan Activated,并打印找到匹配项的行。

使用RSTART和RLENGTH变量

RSTARTRLENGTH变量允许您捕获匹配子字符串的位置和长度。

当找到匹配项时,RSTART将包含匹配子字符串的第一个字符的索引,RLENGTH将包含匹配子字符串的长度。

同样适用数据文件sample_data.txt为例,假设你想从提到Data Plan Activated的行中提取时间戳:

awk '{ if (match($0, /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/)) \
print substr($0, RSTART, RLENGTH) }' sample_data.txt
  • 在这个命令中正则表达式[0-9]{4}-[0-9]{2}-[0-9]{2}[0-9]{2}:[0-9]{2}:[0-9][0-9]{2}匹配时间戳格式。

  • 一旦找到匹配项,substr($0, RSTART, RLENGTH)从RSTART开始提取长度为RLENGTH的子字符串

输出结果如下所示:

2024-03-10 10:15:00
2024-03-10 10:17:00
2024-03-10 10:19:00

基于匹配的条件处理

假设您希望根据该行是否包含Data Plan ActivatedData Plan Deactivated采取不同的操作。

awk '{
  if (match($0, "Data Plan Activated")) {
    print "Activation: ", $0
  } else if (match($0, "Data Plan Deactivated")) {
    print "Deactivation: ", $0
  }
}' sample_data.txt

该脚本使用ifelse if条件检查匹配并执行不同的打印操作。

当匹配到Data Plan Activated时,打印以Activation:为前缀的行,当匹配到Data Plan Deactivated时,打印以Deactivation:为前缀的行。

执行上述命令后,输出结果如下所示:

Activation:  2024-03-10 10:15:00, Data Plan Activated, User 45678
Deactivation:  2024-03-10 10:17:00, Data Plan Deactivated, User 12345

查找和处理多个匹配

让我们使用以下示例数据:

User 12345, Data Plan Activated, Payment Pending; User 67890, Data Plan Deactivated, Payment Complete

假设您需要从这一行单独提取和处理每个用户的详细信息。

下面是如何使用awk迭代多个匹配:

awk '{
  n = split($0, segments, "; ");
  for (i = 1; i <= n; i++) {
    if (match(segments[i], /User [0-9]+, Data Plan (Activated|Deactivated), Payment (Pending|Complete)/)) {
      print segments[i]
    }
  }
}' sample_data.txt

在这个例子中,split($0, segments, ";")根据分号和空格分隔符将行分成几段。

for循环遍历每个段,match()用于检查段是否包含所需的模式。如果找到匹配项,则打印该段。

执行上述命令后,输出结果如下所示:

User 12345, Data Plan Activated, Payment Pending
User 67890, Data Plan Deactivated, Payment Complete

推荐阅读



标签:10,匹配,进阶,Activated,AWK,Plan,Data,match
From: https://blog.csdn.net/sinat_28521487/article/details/142660176

相关文章

  • 【python进阶攻略10】异常、lambda表达式
    异常异常处理是一种艺术,一旦你掌握,会授予你无穷的力量。我将要向你展示我们能处理异常的一些方式。最基本的术语里我们知道了try/except从句。可能触发异常产生的代码会放到try语句块里,而处理异常的代码会在except语句块里实现。这是一个简单的例子:try:file=open(......
  • 【python进阶攻略11】一行式、For - Else
    一行式本章节,我将向大家展示一些一行式的Python命令,这些程序将对你非常有帮助。简易WebServer你是否想过通过网络快速共享文件?好消息,Python为你提供了这样的功能。进入到你要共享文件的目录下并在命令行中运行下面的代码:#Python2python-mSimpleHTTPServe......
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
    文章目录C++模板进阶编程前言第一章:非类型模板参数1.1什么是非类型模板参数?1.1.1非类型模板参数的定义1.2非类型模板参数的注意事项1.3非类型模板参数的使用场景示例:静态数组的实现第二章:模板的特化2.1什么是模板特化?2.1.1模板特化的分类2.2函数模板特化......
  • js进阶——FormData常用知识点介绍
    FormData是JavaScript中用于构建表单数据对象的API,它主要用于处理enctype="multipart/form-data"类型的表单提交,即上传文件和数据。通过FormData,开发者可以在客户端构建和发送表单数据,尤其是在没有使用传统的HTML表单提交时,允许开发者进行更多的自定义和控制。For......
  • [CVPR2024]CDMAD Class-Distribution-Mismatch-Aware Debiasing for Class-Imbalanced
    Introduction在不平衡数据集上训练的分类器往往对头部类(majorityclasses)有偏好。在半监督学习(semi-supervisedlearning,SSL)设置下,生成伪标签的算法由于生成带偏置的伪标签,往往会进一步加剧偏置。带偏置的伪标签会降低表征学习质量。特别的,如果有标签集合和无标签集合的分布差异......
  • SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法
    目录0需求描述1数据准备2问题分析  方法1:最大、最小值法(技巧)  方法2:常规思路3小结 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏,部分内容如下:数字化建设通关指南专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢复原价0需求描述星星点......
  • C++学习:模版进阶:非类型模板参数 特化 分离编译
    目录一:非类型模版参数二:模版特化三:函数模版特化四:类模版特化一:全特化(将模板参数列表中所有的参数都确定化)二:偏特化(部分特化或更进一步限制)五:模版分离编译一:非类型模版参数非类型模版参数是在模版参数列表中,跟在模版参数后面的,就是用常量当参数(下面的n就是)templa......
  • sed与awk
     一.Sed命令 sed -n‘n’pfilename,单引号内的n是一个数字,表示第几行。-n的选项作用只显示我们要打印的行。把/etc/passwd复制到 /tmp/test.txt,用sed打印所有的行: 打印test.txt的第3行~第10行二.Awk  使用awk查找所有包含bash的行: 用:作为分隔符,查......
  • Spring Boot 进阶-Spring Boot的全局异常处理机制详解
      我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了trycatchfinally语句。  大量的......
  • 题解 ABC373G【No Cross Matching】/ POJ3565【Ants】
    题目描述年轻的自然主义者比尔在学校里研究蚂蚁。他的蚂蚁以生活在苹果树上的蚜虫为食。每个蚂蚁群需要自己的苹果树来养活自己。比尔有一张地图,上面标有\(n\)个蚂蚁群和\(n\)棵苹果树的坐标。他知道蚂蚁从它们的蚂蚁群到它们的取食地点,然后返回蚂蚁群,都是使用化学标记的路线......