使用awk和正则表达式过滤文本或字符串 - 详细指南和示例

当我们在 Linux 中运行某些命令来读取或编辑字符串或文件中的文本时,我们经常尝试将输出过滤到感兴趣的特定部分。这就是使用正则表达式派上用场的地方。

什么是正则表达式?

正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式最重要的事情之一是它允许您过滤命令或文件的输出、编辑文本或配置文件的一部分等等。

正则表达式的特点

正则表达式由以下部分组成:

  • 普通字符,例如空格、下划线(_)、A-Z、a-z、0-9。
  • 扩展为普通字符的元字符包括:
    • (.) 它匹配除换行符之外的任何单个字符。
    • (*) 它匹配零个或多个其前面的直接字符。
    • [character(s)]匹配character(s)中指定的任意一个字符,也可以使用连字符(-)表示一系列字符,如[a-f]、[1-5]等。
    • ^ 它匹配文件中行的开头。
    • $ 匹配文件中的行尾。
    • \ 它是一个转义字符。

为了过滤文本,必须使用 awk 等文本过滤工具。您可以将 awk 视为一种编程语言。但对于本指南[1]使用 awk 的范围,我们将其作为一个简单的命令行过滤工具进行介绍。

awk 的一般语法是:

awk 'script' filename

其中“script”是 awk 可以理解在文件 filename 上执行的一组命令。

它的工作原理是读取文件中的给定行,制作该行的副本,然后执行该行上的脚本。文件中的所有行都会重复此操作。

“script”的形式为“/pattern/action”,其中pattern是正则表达式,而action是 awk 在行中找到给定pattern时将执行的操作。

如何在Linux中使用awk过滤工具

在下面的示例中,我们将重点关注 awk 的元字符。

  • 由于没有给出模式,下面的示例打印文件 /etc/hosts 中的所有行。
awk '//{print}'/etc/hosts
alt
  • 使用 Awk 模式:在文件中匹配带有“localhost”的行

在下面的示例中,已给出模式 localhost,因此 awk 将匹配 /etc/hosts 文件中具有 localhost 的行。

awk '/localhost/{print}' /etc/hosts 
alt
  • 在模式中使用带有 (.) 通配符的 Awk

(.) 将匹配下面示例中包含 loc、localhost、localnet 的字符串。

awk '/l.c/{print}' /etc/hosts
alt
  • 在模式中使用带有 (*) 字符的 Awk

它将匹配包含 localhost、localnet、lines、capable 的字符串,如下例所示:

awk '/l*c/{print}' /etc/localhost
alt

您还将意识到 (*) 试图为您提供它可以检测到的最长匹配项。

让我们看一个案例来演示这一点,采用正则表达式 t*t,它表示匹配以下行中以字母 t 开头并以 t 结尾的字符串:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

当您使用模式 /t*t/ 时,您将得到以下可能性:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

/tt/ 通配符中的 () 允许 awk 选择最后一个选项:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
  • 使用带有 set [ 字符 ] 的 awk

以集合[al1]为例,这里awk将匹配文件/etc/hosts中一行中包含字符a或l或1的所有字符串。

awk '/[al1]/{print}' /etc/hosts
alt

下一个示例匹配以 K 或 k 开头后跟 T 的字符串:

# awk '/[Kk]T/{print}' /etc/hosts 
alt
  • 指定范围内的字符

用 awk 理解字符:

  • [0-9]表示单个数字
  • [a-z] 表示匹配单个小写字母
  • [A-Z] 表示匹配单个大写字母
  • [a-zA-Z] 表示匹配单个字母
  • [a-zA-Z 0-9] 表示匹配单个字母或数字
awk '/[0-9]/{print}' /etc/hosts 
alt

在上面的示例中,文件 /etc/hosts 中的所有行都至少包含一个数字 [0-9]。

  • 将 Awk 与 ($) 元字符结合使用

它匹配以提供的模式结尾的所有行:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
alt
  • 将 Awk 与 () 转义字符一起使用

它允许您将其后面的字符视为文字,也就是说按原样考虑它。

在下面的示例中,第一个命令打印出文件中的所有行,第二个命令不打印任何内容,因为我想匹配包含 $25.00 的行,但没有使用转义字符。

第三个命令是正确的,因为转义字符已用于按原样读取 $。

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
alt
Reference
[1]

Source: https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研数学|数一125学长备考经验+资料

考研数学复习规划的关键,是不要执着于进度,不要执着于每天每个时间段准确的划分去做什么做什么,就好像完成任务的权重大于复习质量的权重一样,本末倒置了。 正确的做法,是聚焦于学习质量,持之以恒。所需要掌…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况,大部人都要配置为外部高速时钟 另外,本实验使用了FreeRTOS,FreeRTOS的时基使用的是Systick,而 STM32CubeMX中默认的HAL库时基也是Systick,为了避免可能的冲突,最…

如何理解XML解析库?

untangle untangle 是一个简洁的用于解析 XML 文档的库。输入一个 XML 文档后&#xff0c;untangle 将文档的结构映射成结点和属性&#xff0c;并返回一个 Python 对象。 形如以下的 XML 文件&#xff1a; <?xml version"1.0"?> <root><child nam…

BUUCTF-Misc-[安洵杯 2019]Attack1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件打开是一个流量包文件 拖到kali尝试用foremost是否可以分离 分离出来一个压缩包需要密码&#xff1a; 寻找密码&#xff0c;打开数据包导出http数据&#xff0c;发现一个lsass.dump文件 使用kali中mimkatz命令查看 得到…

测试需求平台10-DBUtils 优化数据连接与 SQL Limit 实现分页

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

干货!带你快速了解Python元组

1.元组 元组一般用来存储多个数据&#xff0c;使用() 2.创建元组 创建空元组 tup1 () print(tup1) # () print(type(tup1)) # <class tuple> 创建非空元组&#xff08;元组中只有一个元素&#xff0c;一般要在元素的后面加 , 若不加 , 该数据类型不一定是元组…

【Leetcode每日一题】 前缀和 - 寻找数组的中心下标(难度⭐)(28)

1. 题目解析 题目链接&#xff1a;724. 寻找数组的中心下标 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给数组是否存在某一个元素左边的和等于右边的和&#xff0c;存在返回那个元素下标即可&#xff0c;不…

#WEB前端(JS基础语法)

1.实验&#xff1a; 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;数据类型 var&#xff0c;let&#xff0c;const var,let声明变量&#xff0c;const声明常量。var声明的变量具有函数作用域,let声明的变量具有块级作用域&#xff0c;let跟安全更…

基于SSM的农业电商服务系统(农产品销售管理系统)(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业电商服务系统&#xff08;农产品销售管理系统&#xff09;&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#…

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…

图像AI换脸软件:AI FaceSwap 中文版

AI FaceSwap 是一款利用人工智能技术进行面部交换的软件。该软件通过先进的人工智能算法&#xff0c;能够将一个人的面部表情、神态和特征准确地映射到另一个人身上&#xff0c;实现面部交换的效果。用户只需要提供两张照片&#xff0c;一张是目标人物的照片&#xff0c;另一张…

一维化01背包(详细)

http://t.csdnimg.cn/P7R3G 之前我们介绍了01背包&#xff0c;但是dp数组是二维化的&#xff0c;现在我们需要将其变成一维数组&#xff0c;如果已经对二维化的01背包十分了解了&#xff0c;那么理解一维化的dp数组也不是问题。 目录 分析 遍历顺序 原二维遍历 一维倒序遍…

GPT-4 及更高版本:大型语言模型的力量

GPT-4革命&#xff1a;人工智能如何重塑SEO行业 在人工智能领域&#xff0c;GPT-4 等语言模型的演变标志着一个重要的里程碑。 本文深入探讨了 GPT-4 的功能和潜力&#xff0c;同时也思考了人工智能领域的未来。 GPT-4 的出现&#xff1a;人工智能的新时代OpenAI 开发的 GPT-4…

Java引用强度

强引用 > 软引用 > 弱引用 > 虚引用 强引用&#xff1a;传统的创建Java对象的方式&#xff0c;如&#xff1a;Object obj new Object();任何情况下&#xff0c;只要存在强引用关系&#xff0c;垃圾回收器永远不会回收掉被引用的对象。 软引用&#xff1a;描述一些还…

微信小程序开发学习笔记《20》uni-app框架-分类导航区域与楼层区域

微信小程序开发学习笔记《20》uni-app框架-分类导航区域与楼层区域 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、分类导航区域 1.1 获取分类导航的数据 实现思路: 定义data数据在onLoad…

smardaten数据报表功能全新上线,迎战“中国式报表”!

数据报表是企业业务数据统计分析最主要的应用方式之一。 面对复杂多元的报表结构、大量的数据处理需求时&#xff0c;“中国式报表”依然是业务人员、特别是财务人员进行数据统计分析的主要方式。虽然绝大多数企业都已部署高效的BI平台&#xff0c;但报表统计与可视化BI之间的…

电源完整性设计的重要三步!

电源模块布局布线 电源模块是电子设备的能量来源&#xff0c;其性能与布局直接影响到整个系统的稳定性和效率。正确的布局和走线不仅能减少噪声干扰&#xff0c;还能确保电流的顺畅流通&#xff0c;从而提高整体性能。 1、电源模块布局 ● 源头处理&#xff1a;电源模块作为…

解决手机连接校园网同一设备老是需要重复认证的问题(+解决原理)

相信大家平时在使用校园网的时候总会遇到同一设备隔三岔五就要重复认证绑定的问题&#xff0c;这里直接附上解决方案。 打开手机的wifi-->连接校园网然后进入设置-->在隐私选项选择“使用设备MAC” 如下图&#xff0c;问题解决了&#xff01;如果想知道原理的可以继续往…

通过docker安装Mongodb

通过Docker安装MongoDB非常简单和方便&#xff0c;以下是基本步骤&#xff1a; 拉取MongoDB镜像&#xff1a; 首先确保你已经在本地机器上安装了Docker。然后&#xff0c;在命令行中执行以下命令来从Docker Hub下载官方的MongoDB镜像&#xff08;这里以最新版本为例&#xff09…

Java基础(5) 泛型 日期和时间 线程 File-输入流

泛型 java的泛型有点像ts的泛型 public class ArrayList<T> {private T[] array;private int size;public void add(T e) {...}public void remove(int index) {...}public T get(int index) {...} }// 创建可以存储String的ArrayList: ArrayList<String> strLis…