Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令,脚本或者文本处理任务中会用到。这里做个整理。
三者的功能都是处理文本,但侧重点各不相同,grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

1、grep

grep的全称是Global Regular Expression Print,全局正则表达式打印。用于文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(就是只要一行里有对应的字符被匹配到,这一行都会被打印出来)。

grep加上正则匹配会有很多功能,但我目前只常用一些简单的:

  • xxx | grep AA 在命令的输出后提取AA关键词并显示。可以过滤其他不关心的输出
  • grep -r “xxx” . 在当前目录及其中所有文件中查找包含xxx的文件和语句。我在找不到某句话出自哪个文件时会用

2、sed

linux下输入sed会显示他的用法:

-n:静默模式,仅打印由 p 命令指定的行。
-e script:直接在命令行模式中添加 sed 脚本。
-f script-file:从文件中读取 sed 脚本。
-i:直接编辑文件。

注意只有-i才会直接修改文件,其余的都是打印到终端,或者可以输出到另一个文本中。

常见命令

  • 匹配行,打印 ( p ):打印指定行或匹配的行。
    注意想只输出其中的几行只用’20,40p’不行,必须加上-n,否则会打印所有行
  • 增加(a)/插入(i),删除 (d),替换(s)

替换匹配行的关键字s/regexp/replacement/flags):

s 代表替换命令
regexp 是一个正则表达式,用于匹配要替换的文本。
replacement 是用来替换匹配文本的新文本。
flags 是可选的标志,用于修改替换行为。  g表示全局替换,不加的话只替换匹配到的第一行
sed -n '20,40p' input.txt  只打印txt中的20到40行
sed '5,10d' input.txt    删除5-10行
sed -n '/aaaa/'p test.txt 显示包含关键字的所有行
sed 's/foo/bar/g' input.txt  将所有 foo 替换为 bar
sed -i '4s/a/A/g' test.txt -i 直接修改文件内容 ,替换修改会保存到源文件中。
4s指的是进行第四行替换, g代指的全局替换 将a替换成A。并保存文件。

3、awk

sed对行进行操作,awk适合对列进行操作。awk就是把文件逐行的读入,以空格为默认分隔符分隔符也可以自己选定,可以用多个分隔符,用 -F指定)将每行切片,切开的部分再进行各种分析处理。
在这里插入图片描述

设置pattern:
awk '/^This/' test  打印开头是This的行设置options:  {}中写要做什么操作
awk '{print $1,$4}' test  最常用的命令,打印以空格分隔的第一列和第三列。$0是打印整行
awk -F',' '{print $1, $2}' file  以逗号为分隔
awk -F '[ ,]'  '{print $1,$2,$5}' test  []中的是正则表达式,表示以空格和逗号做分隔
awk '{sum += $1} END {print sum}' file 求列的总和

(1)内建变量

其中awk还有很多内建变量:

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)
awk '{print $NF}' test   取每行的最后一个匹配到的字符($NF代表的是分割后的字段数量)

awk也可以配合管道符一起,平头哥笔试中有考过awk的使用,提取最后一列
在这里插入图片描述

(2)内建函数

可以参考AWK 内置函数|菜鸟教程

这里只说一个split( String, array, fieldsep)
参数分别是:要拆分的字符串;拆分后保存结果的数组;用于拆分的分隔符,可以是正则表达式

sed -n '10,1000p' timing.rpt | awk '{split($1,a,"/");print a[1],$5}' > output.csv

时序分析总结报告的每一行都是 AA/BB/CC 1.2 4.6 0.0 -0.13 xxxx之类的形式,我希望提取AA来确定是哪个大模块,-0.13表示对应的slack,就可以用上面的表达式

$1是以空格分隔的第一列字符串,要将他继续用/进行拆分,并且把结果存到数组a中;之后打印数组a的第一个元素和原本空格为分解的第5列.
这样就可以实现先用一个元素分界,之后再细分其中的结果。 其实直接用awk -F ‘[ /]'也可以分开,但是这个例子就适用于先用空格分,之后再对分出来的列做处理,因为一开始就用/分的话,因为路径长度不一致,后面slack的个数就不确定了,不过应该也可以倒着往回数

结果为:
AA1 -0.13
AA2 -0.12

4、正则表达式

正则表达式(Regular Expressions,简称 regex 或 regexp)引擎是一个用于匹配字符串的模式匹配工具。它是一种强大的工具,用于在文本中搜索、匹配和操作复杂的字符串模式。

1、正则表达式引擎
正则表达式引擎是一个程序或库,能够解析和执行正则表达式语法。它接受一个正则表达式和一个输入字符串,然后根据正则表达式的模式在字符串中查找匹配项。正则表达式引擎通常内置于编程语言或文本编辑器中,如 Perl、Python、JavaScript、Java、.NET、Vim、grep 等。

2、正则表达式的基本组成部分
正则表达式由元字符和普通字符组成。元字符具有特殊意义,可以表示位置、数量、分组等操作。以下是一些常见的元字符及其含义:

(1)格式
. 匹配任意单个字符,不能匹配空行
[] 匹配指定范围内的任意单个字符
[^] 取反
[: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:] 标点符号

(1)字符类:
[abc]:匹配 a、b 或 c 中的任意一个字符。
[^abc]:匹配除 a、b 或 c 之外的任意一个字符。
[a-z]:匹配从 a 到 z 的任意一个小写字母。

预定义字符类:
.:匹配除换行符外的任意字符。
\d:匹配任何数字,相当于 [0-9]。
\w:匹配任何字母、数字或下划线,相当于 [a-zA-Z0-9_]。
\s:匹配任何空白字符,包括空格、制表符等。

(2)量词:
*:匹配前面的元素零次或多次
+:匹配前面的元素一次或多次
?:匹配前面的元素零次或一次
{n}:匹配前面的元素恰好 n 次。
{n,}:匹配前面的元素至少 n 次。
{n,m}:匹配前面的元素至少 n 次,至多 m 次。

(3)锚点:
^:匹配字符串的开始。
$:匹配字符串的结束。

(4)分组和捕获:
(…):将模式分组并捕获匹配的文本。
(?:…):将模式分组但不捕获匹配的文本。

(5)转义字符:
\:用于转义元字符,使其失去特殊意义。

参考:
Linux 文本处理三剑客:grep、sed 和 awk(有例子,易懂)
Linux文本三剑客超详细教程—grep、sed、awk(写的很详细)

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

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

相关文章

Elasticsearch 为时间序列数据带来存储优势

作者:来自 Elastic Martijn Van Groningen, Kostas Krikellas 背景 Elasticsearch 最近投资了对存储和查询时间序列数据的更好支持。存储效率一直是关注的主要领域,许多项目取得了巨大的成功,与将数据保存在标准索引中相比,可以节…

基于java的英文翻译字典

基于java的英文翻译字典,附有源代码,源数据库初始化文件 源码地址 dict_demo: 提取一段英文对话中的英文词汇,输出为英文单词字典形式 解析json字条 private void readFile(String pathname) {long start System.currentTimeMillis(); //…

Spring Boot 事务传播机制详解

Spring Boot 事务传播机制详解 1. 事务传播机制概述 Spring Boot 中的事务传播机制用于处理多个事务方法之间相互调用时的事务行为,保证数据的完整性和一致性。当务传播机制定义了在调用一个事务方法时,当前事务该如何传播或传递。Spring Boot 中的事务…

数据结构篇:旋转操作在AVL树中的实现过程

本节课在线学习视频(网盘地址,保存后即可免费观看): https://pan.quark.cn/s/06d5ed47e33b AVL树是平衡二叉搜索树的一种,它通过旋转操作来保持树的平衡。AVL树的特点是,任何节点的两个子树的高度最大差别…

微服务链路追踪ELK

微服务链路追踪&ELK 链路追踪概述链路追踪sluthzipkinelk日志管理平台 一 链路追踪 1 概述 1.1 为什么需要链路追踪 ​ 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0…

PostgreSQL 快速入门与实战

1、概述 前面2篇博客给大家详细的介绍了PostgreSQL的安装和配置,本篇文章就带着大家一起学习一下PostgreSQL的用法,主要内容包括 基本的数据库操作、用户管理、数据备份、SCHEMA(模式)以及和MySQL的区别。 2、数据库基本操作 PostgreSQL是严格遵守SQL规…

Apple - File System Events Programming Guide

本文翻译整理自:File System Events Programming Guide (pdated: 2012-12-13) https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/FSEvents_ProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005289 文章目录 一、介…

C++将任意文件编码为汉字文本实现简单加密,将汉字文本转码还原原文件实现解密

C将任意文件编码为汉字文本实现简单加密&#xff0c;将汉字文本转码还原原文件实现解密。 #include <QCoreApplication> #include <iostream> #include <fstream> #include <map> #include <vector> #include <string> #include <loca…

[Rust] 求Vec中的最值、统计特定值的数量和统计数组总和

一、简介 本文以Vec<i32>为例&#xff0c;介绍了在Rust中如何求 Vec<T>容器中中最大值、最小值&#xff0c;如何确定特定值的下标、如何统计其中特定值的数量和统计数组元素的总和。 二、代码 0. Rust 中 Vec<T> 是什么&#xff1f; 在Rust中 Vec<T&g…

基于System-Verilog的FPGA设计与仿真

一、System-Verilog System Verilog的发展 SystemVerilog 的出现是为了因应日益复杂的数位电路设计和验证需求。虽然Verilog HDL 在早期的数位电路设计中得到了广泛应用&#xff0c;但随着技术的发展和电路复杂度的增加&#xff0c;Verilog HDL 在某些方面已经显得有些不足以满…

leetcode 56合并区间

思路 合并就是首先应该按照left左边界排序&#xff0c;排完序以后&#xff0c;如果i的左边界小于等于i-1的右边界&#xff0c;说明有重合&#xff0c;此时这两个可以合并&#xff0c;右边界应该取最大值。 代码 排序 我是定义了一个类,存储左右边界&#xff0c;先将数组转化…

Linux Centos 环境下搭建RocketMq集群(双主双从)

1、下载rocketmq的包 下载 | RocketMQ 2、配置环境变量 1、编辑环境变量文件&#xff1a;vim /etc/profile2、加入如下配置&#xff1a; #rocketmq 4.9.8 ROCKETMQ_HOME/home/rocketmq/rocketmq-4.9.8 export PATH${ROCKETMQ_HOME}/bin:${PATH}3、刷新配置&#xff1a;source…

OpenStack入门体验及一键部署

OpenStack入门体验 技能目标&#xff1a; 了解云计算概念 了解OpenStack 了解OpenStack的构成 会OpenStack单机环境一键部署 从控制台认识OpenStack各项功能会 通过OpenStack控制台创建云主机 什么是云计算 云计算(cloudcomputing)是一种基于网络的超级计算模式&a…

51单片机STC89C52RC——2.1 独立按键控制LED亮灭

目录 目的 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 六&#xff0c;效果 目的 当独立K1按键按下时LED D1 点亮&#x…

10:Hello, World!的大小

OpenJudge - 10:Hello, World!的大小 描述 还记得在上一章里&#xff0c;我们曾经输出过的“Hello, World!”吗&#xff1f; 它虽然不是本章所涉及的基本数据类型的数据&#xff0c;但我们同样可以用sizeof函数获得它所占用的空间大小。 请编程求出它的大小&#xff0c;看看跟你…

微信小程序中实现将数据库返回的数据对象res.data赋值给两个变量,并且这两个变量互不影响,改变一个变量中对象值的同时不影响另一个变量

背景 今天在做功能需求的时候&#xff0c;遇到一个问题&#xff0c;就是想把获取到数据库的数据res.data&#xff08;res.data是对象&#xff09;&#xff0c;赋值给两个不同&#xff08;包括值和地址&#xff09;的变量action1和action2&#xff0c;其中一个变量需要将res.da…

一般简单的功能使用GIS 服务器工具还需要进行扩展开发吗?

有网友困惑怎么使用了我们的 GIS 服务器工具&#xff0c;一些简单的功能需不需要对服务器进行扩展开发&#xff1f;下面我们首先看一下标准GIS WEB服务器例如GEOSERVER&#xff0c;QGISSERVER、GIS数据快捷共享发布工具&#xff08;建立自己的地图网站&#xff09;及其它一些商…

【Python基础】内置属性

1. __name__ 查看对象名 py文件被直接运行时&#xff0c;__name__ __main__ py文件被导入使用&#xff0c;__name等于文件名 2.__doc__ 查看文档注释 3.__all__ 模块的内置属性&#xff0c;默认存放的是模块里面所有的对象(变量&#xff0c;函数名) __all__ […

【Unity】加速Unity编辑器模式启动时间

Unity每次Play之后都会Reload Script Assemblies&#xff08;重新加载脚本程序集&#xff09;。 如果我们没有使用很多Assem&#xff0c;则并不需要在播放前重新编译。 可以在设置中将此事的重新编译关闭。 在Edit > Project Settings > Editor 面板中 找到Enter Play…

OpenGL3.3_C++_Windows(3)

GLSL Shader基础 Shader&#xff08;把输入转化为输出,运行在GPU上&#xff09;&#xff1a;首先要声明版本&#xff0c;有各自的入口点main&#xff08;&#xff09;顶点数据上限:16个包含4分量&#xff1a;16 * 4 64个分量向量&#xff1a;容器vec。使用.x、.y、.z和.w&am…