文本三剑客指 Linux环境下的 grep(搜索)sed(编辑)awk(分析)三款用于文本处理的核心命令,三者分工明确、功能互补,是处理日志、配置文件、结构化数据等场景的 “刚需工具”。

一、grep(文本搜索)

grep命令的核心定位是文本搜索,可以按照“关键词”或“正则表达式”在数据源中进行行过滤,从而检索到相匹配的行。该命令不修改文本内容,只负责查找内容。

1、命令格式

grep [参数] '<匹配内容>' [文件名]

2、常见参数

  • -i: 不区分大小写
  • -n: 显示行号
  • -r: 逐层遍历目录查找
  • -v: 查找不包含指定内容的行,反向选择
  • -E:使用扩展正则匹配
  • ^key:以关键字开头
  • key$:以关键字结尾
  • ^$:匹配空行
  • -w: 按单词搜索
  • -o: 打印匹配关键字
  • -c: 统计匹配到的次数
  • -A: 显示匹配行及后面多少行
  • -B: 显示匹配行及前面多少行
  • -C: 显示匹配行前后多少行
  • -l:只列出匹配的文件名
  • -L:列出不匹配的文件名
  • -e: 使用正则匹配

3、应用示例

#忽略大小写匹配包含Error的行
grep -i Error catalog.out#精确匹配Error单词
grep -w Error catalog.out#打印匹配到的关键字Error
grep -wo Error catalog.out#打印匹配到Error关键字的行号
grep -n Error catalog.out#忽略大小写匹配统计包含关键字Error的行
grep -ni Error catalog.out#忽略大小写匹配统计包含关键字Error的行数
grep -nic Error catalog.out#忽略大小写匹配以Error开头的行
grep -i ^Error catalog.out#匹配以bash结尾的行
grep bash$ /etc/passwd#匹配空行并打印行号
grep -n ^$ /etc/passwd#匹配以#号开头的行
grep ^# nginx.conf#匹配不以#号开头的行
grep -v ^# nginx.conf#匹配包含Cause关键字及其后5行
grep -A 5 Cause catalog.out#匹配包含Cause关键字及其前5行
grep -B 5 Cause catalog.out#匹配包含Cause关键字及其前后5行
grep -C 5 Cause catalog.out

二、sed(文本编辑)

sed是一种流文本编辑工具,专注于按照指定规则批量修改文本(如替换字符、删除、插入等)。编辑文件的时候,会在内存中开辟一块模式空间(缓存空间),以行为单位将文件内容加载到该空间,并在其中进行内容编辑。编辑完成后会默认在当前终端界面打印内容,然后清空缓存 空间里的内容,再来读取第二行内容,依次循环。通过制定选项,才会修改原文件。

1、命令格式

sed [参数] '<匹配条件> [动作]' [文件名]

sed -i [替换格式] [文件名]

源数据 | sed -i [替换格式]

2、常见参数

  • 空:只展示sed的操作效果,实际上不对文件进行编辑
  • -n:不自动打印所有内容
  • -e:基于命令实现对文件的多点编辑操作
  • -f:从指定文件中读取编辑文件的“匹配条件+动作”
  • -r:支持使用扩展正则表达式
  • -i:表示对文件进行编辑
  • -i.bak:复制文件原内容到备份文件,然后对原文件编辑

3、常见匹配条件

匹配条件分为两种:数字行号或者关键字匹配
数字行号:

  • 空:表示所有行
  • n:表示第n行
  • $:表示末尾行
  • n,m:表示第n到m行内容
  • n,+m: 表示第n到n+m行
  • ~步进:1~2 表示奇数行,2~2 表示偶数行

关键字匹配:

  • '/关键字/'

4、常见动作

  • -a[\text]:在匹配到的内容下一行增加内容,支持\n实现多行追加
  • -i[\text]:在匹配到的内容当前行增加内容
  • -c[\text]:在匹配到的内容替换内容
  • -d|p:删除|打印匹配到的内容
  • -s:替换匹配到的内容
  • W /path/somefile:保存模式匹配的行至指定文件
  • r /path/somefile:读取指定文件的文本至模式空间中
  • =:为模式空间中的行打印行号
  • ! :模式空间中匹配行取反处理

5、常见替换格式

  • '行号s/原内容/替换后内容/列号':替换指定匹配的内容
  • 's/原内容/替换后内容/':替换每行首个匹配内容
  • 's/原内容/替换后内容/g':替换所有匹配的内容
  • '行号s/原内容/&新增内容/列号':替换指定的内容(&符号代表源内容,实现的效果是 '原内容+新内容')
  • '行号a\新增内容':在指定行号的下一行增加内容
  • '行号i\新增内容':在指定行号的当行增加内容
  • '行号d':删除指定行
  • '行号c\内容':替换指定行整行内容
  • '行号r 文件名':替换文件内容到指定行
  • '行号w 文件名':将指定行内容保存到指定文件

6、应用示例

#只打印第2行
sed -n '2p' nginx.log#只打印第1行和第3行
sed -n '1p;3p' nginx.log#只打印包含Error的行
sed -n '/Error/p' nginx.log#只打印奇数行
sed -n '1~2p' nginx.log#只打印偶数行
sed -n '2~2p' nginx.log#只打印第1行和第3行,-e实现多次文件编辑动作
sed -n -e '1p' -e '3p' nginx.log#使用sed_cmd.list文件里的匹配条件和动作去编辑文件
sed -n -f sed_cmd.list nginx.log#取反显示,输出除了第2行以外的其他所有行
sed -n '2!p' nginx.log#查看内容属于第几行
sed -n '/Error/=' nginx.log#替换每行的第一个匹配上的xmx为Xmx
sed -i 's/xmx/Xmx/' jvm.conf#替换文件中所有的xmx为Xmx
sed -i 's/xmx/Xmx/g' jvm.conf#替换第2行的首个xmx为Xmx
sed -i '2s/xmx/Xmx/#' jvm.conf#替换每行的第2个xmx为Xmx
sed -i 's/xmx/Xmx/2' jvm.conf#替换第3行的第2个xmx为Xmx
sed -i '3s/xmx/Xmx/2' jvm.conf#指定第2行的下一行新增内容test
sed -i '2a\test' jvm.conf#指定1~3行,每行的下一行都增加内容test
sed -i '1,3a\test' jvm.conf#指定第2行新增内容test
sed -i '2i\test' jvm.conf#指定1~3行都增加内容test
sed -i '1,3i\test' jvm.conf#删除第2行
sed -i '2d' jvm.conf#删除第1~3行
sed -i '1,3d' jvm.conf#替换第2行内容为test
sed -i '2c\test' jvm.conf#替换第1~3行为1行,内容为test
sed -i '1,3c\test' jvm.conf#将第2行替换为1.txt的文件内容
sed -i '2r 1.txt' jvm.conf#将第2行内容保存到1.txt中
sed -i '2w 1.txt' jvm.conf#将第1~3行内容保存到1.txt中
sed -i '1,4w 1.txt' jvm.conf#查看匹配的内容
sed -n '/send/p' nginx.conf#查看匹配内容到第8行的内容
sed -n '/send/,8p' nginx.conf#查看第1行到匹配行的内容
sed -n '1,/send/p' nginx.conf#查看匹配内容和后三行的内容
sed -n '/send/,+3p' nginx.conf#通过!p去除空行匹配
sed -n '/^$/!p' nginx.conf

三、awk(文本分析)

awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符。它的工作方式是逐行读取文本数据,将每一行数据视为一条记录(record),每条记录以字段分隔符分成若干字段,然后输出各个字段的值。然后以查找匹配某个特定模式的文本行,并对这些文本执行制定动作。

简单来说就是按 “行” 和 “字段” 分割文本(默认空格 / 制表符为分隔符),支持条件判断、计算、统计,适合处理日志、CSV 等结构化数据。

1、命令格式

awk [参数] '[动作]' [文件名]

awk [参数] –f 动作文件 var=value [文件名]

awk [参数] 'BEGIN段 [动作] END段' [文件名]

  • BEGIN: 在开始处理数据流之前执行,可选项
  • 动作: 如何处理数据流,必选项
  • END: 处理完数据流后执行,可选项

2、常见参数

  • -F:指定列的分隔符,默认一行数据的列分隔符是空格
  • -f:file 指定读取程序的文件名
  • -v:var=value 自定义变量

3、常见动作

  • print:显示内容
  • $0:显示当前行所有内容
  • $n:显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号隔开

4、常见内置变量

  • FILENAME:当前输入文件的文件名,该变量是只读的
  • NR:指定显示行的行号
  • FNR:多文件时候,分别计数
  • NF:表示字段数量
  • OFS:输出格式的列分隔符,缺省是空格
  • FS:输入文件的列分隔符,缺省是连续的空格和Tab
  • RS:输入记录分隔符,指定输入时的换行符,原换行符($)仍有效
  • ORS:输出记录分隔符,输出时用指定符号代替换行符
  • ARGC|ARGV[n]:获取命令的参数个数|参数内容

5、应用示例

#打印第1列的内容
awk '{print $1}' info.csv#打印第3列内容
awk '{print $3}' info.csv#打印最后一列信息
awk '{print $NF}' info.csv#打印所有内容
awk '{print $0}' info.csv#打印第列和第3列内容
awk '{print $1,$3}' info.csv#打印信息时候,合并信息
awk '{print $1$3}' info.csv#使用\t实现内容的分割,需要用""扩住
awk '{print $1"\t"$3}' info.csv#打印指定的内容
awk '{print "hello awk"}' info.csv#打印每列的行号
awk '{print NR,$0}' info.csv#按照行号打印对应列的内容
awk '{print NR, $NR}' info.csv#指定行号打印信息
awk 'NR==1 {print NR,$1,$3}' info.csv#以逗号为列分隔符,打印第2列
awk -F ',' '{print $2}' info.csv
awk -v FS="," '{print $2}' info.csv#以冒号为列分隔符,打印第1列和第2列
awk -F ',' -v OFS=":" '{print $1,$2}' info.csv
awk -F"," 'BEGIN{OFS=":"} {print $1,$7}' info.csv#在BEGIN内部同时实现多个环境变量
awk 'BEGIN{-F",";OFS=":"} {print $1,$7}' info.csv#设置变量,字符串赋值并输出变量值
awk 'BEGIN{name="test";print name}'#设置变量,数字赋值并输出变量值
awk 'BEGIN{i=10;print i+=1}'#数值运算
awk 'BEGIN{print 100+3}'
awk 'BEGIN{print 100*3}'
awk 'BEGIN{print 100/3}'#逻辑运算(输出真假,即1、0)
awk 'BEGIN{print 100>=2 && 100>=3 }'
awk 'BEGIN{print 100>=2 && 1>=100 }'
awk 'BEGIN{print 100>=2 || 1>=100 }'
awk 'BEGIN{print 100>=200 || 1>=100 }'#文件参与的逻辑运算,输出uid为0或大于1000的用户名
awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

附:正则表达式

在 Linux 中,正则表达式(Regular Expression,简称 regex)是一种用于 模式匹配与文本过滤 的工具,广泛结合 grep、sed、awk 等文本处理命令使用,用于精准查找、替换或提取符合规则的字符串。

1、正则表达式的分类(Linux 中核心两类)

Linux 工具对正则表达式的支持分为 基础正则表达式(BRE) 和 扩展正则表达式(ERE),主要区别在于对部分元字符的支持是否需要转义:

  • 基础正则(BRE):grep(默认)、sed(默认)等工具支持,部分元字符(如 +、?、|)需要用 \ 转义才能生效。
  • 扩展正则(ERE):grep -E(或 egrep)、sed -r、awk 等工具支持,元字符无需转义,直接使用。

2、常用基础元字符与示例(BRE 和 ERE 通用,无需转义)

元字符作用示例
^匹配行首(以指定字符开头的行)grep "^root" /etc/passwd → 匹配以 root 开头的行
$匹配行尾(以指定字符结尾的行)grep "bash$" /etc/passwd → 匹配以 bash 结尾的行
.匹配任意单个字符(除换行符)grep "r..t" /etc/passwd → 匹配 r 开头、t 结尾,中间 2 个任意字符的字符串(如 rootrxtt
*匹配前面的字符 0 次或多次grep "ro*ot" test.txt → 匹配 r 后接任意个 o 再跟 ot(如 rotrootrooot
[]匹配字符集中的任意一个字符grep "[0-9]" test.txt → 匹配包含数字的行;grep "[a-zA-Z]" → 匹配包含字母的行
[^]匹配 不在 字符集中的任意一个字符(取反)grep "[^0-9]" test.txt → 匹配不包含数字的行;grep "^[^#]" config.conf → 匹配非注释行(非 # 开头)
\转义字符(将特殊字符视为普通字符)grep "a\*b" test.txt → 匹配字符串 a*b* 被转义为普通字符)

3、常用扩展元字符(ERE 直接用,BRE 需转义为 \+\? 等)

元字符作用示例(以 ERE 为例)
+匹配前面的字符 1 次或多次grep -E "ro+ot" test.txt → 匹配 r 后接至少 1 个 o 再跟 ot(如 rootrooot,不匹配 rot
?匹配前面的字符 0 次或 1 次grep -E "ro?ot" test.txt → 匹配 r 后接 0 个或 1 个 o 再跟 ot(如 rotroot,不匹配 rooot
()分组(将多个字符视为一个整体)grep -E "(ab)+" test.txt → 匹配 ab 连续出现 1 次或多次(如 ababab
``逻辑 “或”(匹配多个模式中的一个)
{n}匹配前面的字符 恰好 n 次grep -E "o{2}" test.txt → 匹配包含连续 2 个 o 的字符串(如 ooroot 中的 oo
{n,}匹配前面的字符 至少 n 次grep -E "o{2,}" test.txt → 匹配包含连续 2 个及以上 o 的字符串(如 ooooo

4、不同工具中的正则使用差异

  • grep:默认使用 BRE,扩展元字符需转义(如 grep "ro\+ot"),加 -E 选项启用 ERE(如 grep -E "ro+ot"),无需转义。
  • sed:默认使用 BRE(如 sed 's/ro\+ot/xxx/'),加 -r 选项启用 ERE(如 sed -r 's/ro+ot/xxx/')。
  • awk:本身支持 ERE,无需转义(如 awk '/ro+ot/' test.txt)。

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

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

相关文章

​​《开源字幕神器VideoCaptioner实战:基于Whisper+LLM的全链路方案,免费平替剪映会员》​​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 博主…

redisIO模型

​​1. 总述核心​​“Redis采用了​​单线程的Reactor模型​​来处理网络IO和命令请求。其核心在于&#xff0c;​​它使用一个主线程通过IO多路复用机制来并发地处理大量的客户端连接&#xff0c;而实际的命令解析和执行则是单线程的​​。”这句话非常重要&#xff0c;它直接…

视觉采集模块的用法

一、图像源模块用法采集模块中最基础的单元就是图像源模块&#xff0c;其中图像的输入方式包括相机输入、本地图像、SDK三种。添加图像源后&#xff0c;需要对内部的参数进行对应的配置&#xff0c;正常我们连接相机后图像源选择我们对应的连接相机。配置所需要的相机参数&…

Linux下基于Electron的程序ibus输入法问题

Linux下基于Electron的程序ibus输入法问题 最近想体验一下KDE Plasma桌面&#xff0c;遇到一个问题&#xff0c;就是浏览器输入不了中文&#xff0c;Edge、Chrome都一样&#xff0c;当然它们都是基于Chromium的&#xff0c;出同样的问题很正常。后面发现Visual Code也有同样的问…

Ubuntu20系统上离线安装MongoDB

Ubuntu20系统上离线安装MongoDB 准备工作&#xff1a;下载安装包及依赖​ 下载MongoDB二进制包​ 在联网环境中访问MongoDB官网&#xff0c;选择以下配置&#xff1a; 下载地址&#xff1a;https://www.mongodb.com/try/download/community ​Version​&#xff1a;需与目标系统…

K-Means 聚类算法如何选择初始点

n_clusters 参数是告诉 K-Means 算法对 整个数据集 (X_scaled) 进行分簇。让我们分解一下这个过程的逻辑&#xff1a;目标&#xff1a;我们的目标不是要对数据进行分类&#xff0c;而是要从成百上千个数据点中&#xff0c;智能地挑选出大约30个点作为贝叶斯优化的“起点”。这些…

聚铭安全管家平台2.0实战解码 | 安服篇(四):重构威胁追溯体系

在企业安全运营中&#xff0c;两类问题常常让团队陷入被动 1、“看得见威胁&#xff0c;却追不到源头” 明明检测到多台内网设备遭攻击&#xff0c;却迟迟找不到攻击源头&#xff0c;更说不清攻击者用了什么手法&#xff0c;导致无法及时封禁或隔离。 2、“找到了源头&#xff…

【Microi吾码】:低代码加速业务和技术深度融合

目录 一.低代码优势&#xff1a; 1.1低代码平台和传统代码开发&#xff1a; 1.2低代码和0代码平台&#xff1a; 1.3低代码平台&#xff1a;Microi吾码 二.关于开源低代码平台&#xff1a;Microi吾码 2.1Mircroi吾码介绍&#xff1a; 2.2产品特点&#xff1a; 2.3产品团…

Mongodb操作指南

一、数据库操作1. 展示所有非空数据库show dbs该命令会列出所有包含数据的数据库。2. 显示当前数据库db此命令用于查看当前正在使用的数据库。3. 切换或创建数据库use 数据库名如果指定的数据库不存在&#xff0c;MongoDB 会在首次插入数据时自动创建它。如果已存在&#xff0c…

线性回归计算

一、理论&#xff1a;明确线性回归的核心逻辑模型本质&#xff1a;线性回归是通过属性的线性组合实现预测的模型&#xff0c;核心目标是找到最优的直线&#xff08;单变量&#xff09;、平面&#xff08;双变量&#xff09;或超平面&#xff08;多变量&#xff09;&#xff0c;…

pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

解决办法 1、以管理员身份运行window powershell 2、执行Get-ExecutionPolicy&#xff0c;显示Restricted 3、执行set-ExecutionPolicy&#xff0c;会提示输入参数&#xff0c;此时输入RemoteSigned回车 4、执行y回车

[特殊字符] TTS格局重塑!B站推出Index-TTS,速度、音质、情感表达全维度领先

B站维度之言&#xff1a;B 站 2025 新声计划&#xff1a;IndexTTS 全维度拆解 ——从开源血统到中文特调的架构复盘1&#xff1a;打破边界&#xff1a;Index-TTS 的技术动因场景野心&#xff1a;直播实时口播、无障碍字幕、AI 虚拟 UP 主……B 站需要一把“声音瑞士军刀”&…

第5.3节:awk数据类型

1 第5.3节&#xff1a;awk数据类型 awk并没有非常严格的数据类型&#xff0c;但在编写代码的过程中&#xff0c;大致可以分为以下数据类型&#xff1a; 1.1 数字型 #普通表示法 a 123 b 123.333 #科学表示法 c 1.33e13 d 1.05e-5代码示例&#xff1a; $ echo |awk { >…

基于coco和kitti数据集训练YOLOX

原文发表在知乎&#xff0c;辛苦移步&#xff5e;&#xff5e; 《基于coco和kitti数据集训练YOLOX》 yolox官方的指标数据是在coco数据集上训练出来的&#xff0c;yolox-s模型在11万coco数据集上训练后&#xff0c;mAP(0.5-0.95)40.5。手头有kitti的数据集&#xff0c;所以在…

声网AI语音体验太丝滑,支持随时打断提问

我们教培团队近期测试了一款整合声网语音引擎的对话式 AI 教学工具&#xff0c;体验远超预期。原本以为它仅适用于 1v1 口语练习&#xff0c;没想到已能支持小班课 —— 实测 3 人课堂中&#xff0c;学生轮流发言、提问、插话&#xff0c;AI 都能紧跟节奏&#xff0c;不打断讨论…

【GaussDB】内存资源告急:深度诊断一起“memory temporarily unavailable”故障

一、背景在客户测试环境中&#xff08;GaussDB 506.0 SPC0100 集中式&#xff09;&#xff0c;一个重度使用存储过程的系统&#xff0c;频繁出现内存临时不可用的问题(ERROR: memory is temporarily unavailable)。令人困惑的是&#xff0c;这个环境配置的内存大小已经数十倍于…

LeeCode 40.组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意&#xff1a;解集不能包含重复的组合。 示例 1:输入: candidates [10,1,2,7,6,1,5], t…

数据结构:队列 二叉树

队列&#xff08;Queue&#xff09; 是一种先进先出&#xff08;First In First Out, FIFO&#xff09; 的线性数据结构。 队列的基本特性 1. FIFO 原则 • 最先进入的元素最先出去 • 就像现实生活中的排队&#xff1a;先来的人先接受服务 2. 两个主要操作端 • 队尾&#xff…

FTP工作原理及搭建实操

文章目录前言一、FTP概述二、FTP工作原理2.1 FTP的作用与模式2.2 FTP工作流程2.2.1 主动模式&#xff08;PORT模式&#xff09;2.2.2 被动模式&#xff08;PASV模式&#xff09;2.2.3 对比表格2.2.4 如何选择&#xff1f;2.2.5 补充&#xff1a;现代FTP服务器的常见做法三、FTP…

setup 语法糖核心要点

1. 基本语法<!-- 传统写法 --> <script lang"ts"> export default {setup() {let name 张三function changeName() { name 李四 }return { name, changeName }} } </script><!-- 语法糖写法 --> <script setup lang"ts"> …