Linux文本处理三剑客(详解)

news2025/3/16 14:41:30

一、文本三剑客是什么?

1. 对于接触过Linux操作系统的人来说,应该都听过说Linux中的文本三剑客吧,即awk、grep、sed,也是必须要掌握的Linux命令之一,三者都是用来处理文本的,但侧重点各不相同,awk功能最强大,但也最复杂。

二、文本三剑客介绍 

1. grep

 特点

  • 使用正则表达式搜索文本
  • 匹配到的文本会显示出来并标红
  • 使用权限是所有用户

工作方式 

  • grep可以在一个或多个文件中检索,如果条件中包含了空格,需要使用双引号引起

工作结果

  • 如果搜索成功则返回为0的状态码 ,否则为1的状态码

格式

grep -参数 条件 文件名

参数:

-i		忽略大小写
-c		统计匹配的行数
-v		取反,不显示匹配的行-i	
-w		匹配单词
-E		等价于egrep,即启用扩展正则表达式
-n		显示行号
-rl		将指定目录内的文件打印
-A数字		匹配行及以下n行
-B数字		匹配行及以上n行
-c数字		匹配行及上下n行
-q		静默模式,没有任何内容输出,使用$?来判断是否执行成功
-o		只显示匹配的内容
示例
操作对象文件:/etc/passwd

作用:  记录账户的信息,共分为7段,使用冒号分割
意义:  账户名:密码代号x: UID:GID: 注释:家目录:登录的Shell
注意:  最后一段/sbin/nologin表述不允许登录


# 搜索/etc/passwd 含有root的字符串并显示行号
[root@server ~]# grep -n "root" /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

# 搜索/etc/passwd 含有sshd的字符串并显示行号
[root@server ~]# grep -n "sshd" /etc/passwd 
32:sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin

# 匹配/bin/bash的行数,显示行号
[root@server ~]# grep  "/bin/bash" /etc/passwd  | wc -l
22

# 匹配不是/sbin/nologin的行,并显示行号
[root@server ~]# grep -nv "/sbin/nologin" /etc/passwd 

# -n显示行号 -i忽略大小写
[root@server ~]# grep -ni "d" /etc/passwd 

# 匹配含有ftp行及以上3行内容
[root@server ~]# grep -nB3 "ftp" /etc/passwd
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.sed

介绍

sed命令是将一系列的编辑命令应用于批处理文本的理想工具。sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间。本节将介绍sed命令的基础知识。

sed命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输出的行进行编辑。其中,标准输出可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。

sed命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。

工作原理

  • 模式空间pattern space:sed在内存里开辟模式空间,处理文件的每个输入行,最多8192字节

  • 保留空间holding space:sed在内存里开辟保留空间,保存已经处理过的输入行,最多8192字节

原理:sed 的工作流程主要包括读取、执行和显示三个过程

  • 1.读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)

  • 2. 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行

  • 3.显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空

  • 重复上述过程,直到将文件中所有数据处理完毕

基本语法

sed -参数	'[定址符]'  '[操作]'  文件名

参数:
-n,--quiet,--silent:安静模式,不输出模式空间中的内容,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来
-i:  直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
-e:  直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开,如:sed -e command1; command2......filename  或者  sed -e 'command1'  -e 'command2'......filename
-r:使用扩展正则表达式F
-f:  直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作
  --help:显示帮助
  --version:显示版本
  -{}:  可组合多个命令,以分好隔开

定址符
  • 用于使用数字指定处理行区间,或者使用正则进行过滤

  • 表示方法

地址定界

作用
1,5对文件的1-5行进行处理
2,$对文件的2-最后一行进行处理
1,+3对文件第一行以及以后的第三行内容进行处理
1~2对文件的1,3,5,7,......的行进行处理
/正则表达式/对任何能够被正则表达式匹配带的行进行处理
操作
S: 替换,普换指定字符,一般搭配正则表达式
d: 删除,删除选定的行。
p: 打印,如果同时指定行,表示打印指定行:如果不指定行,则表示打印所有内容:如果有非打印字符,则以 ASCII 码输出。其通常与“-n” 选项一起使用。
=: 打印行号。
a: 增加,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i: 插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
C: 行替换,指定行中的所有内容,普换成该选项后面的字符串。
y: 字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
!: 对指定行以外的所有行应用命令
&: 代表匹配到的内容
详细示例
### 切记多加练习!!!
[root@server ~]# vim sed1.txt

[root@server ~]# sed -n 'p' sed1.txt  #打印全文

[root@server ~]# sed -n '=;p' sed1.txt # 打印全文并显示行号

[root@server ~]# sed -n -e '=' -e  'p' sed1.txt 

[root@server ~]# sed -n 'l' sed1.txt  #打印控制字符

[root@server ~]# sed -n '1p' sed1.txt  # 打印第一行

[root@server ~]# sed -n '1p' sed1.txt # 不加-n会显示全部,加-n只显示处理行
[root@server ~]# 
[root@server ~]# sed -n '4,6p' sed1.txt  #打印4-6行
four
five
six

[root@server ~]# sed -n '7,$p' sed1.txt # 打印7到最后一行
seven
eight
nine
ten

[root@server ~]# sed -n '$p' sed1.txt #打印最后一行
ten

[root@server ~]# sed -n '1~2p' sed1.txt #打印基数行
one
three
five
seven
nine

[root@server ~]# sed -n '2~2p' sed1.txt  #打印偶数行
two
four
six
eight
ten
[root@server ~]# sed -n '4p;6p;8p' sed1.txt #打印4,6 8行
four
six
eight

[root@server ~]# sed -n -e '4p' -e '6p' -e '8p' sed1.txt 
four
six
eight

[root@server ~]# sed -n '1!p' sed1.txt #打印非第一行内容
two
three
four
five
six
seven
eight
nine
ten

[root@server ~]# sed -n '1,+5p' sed1.txt  #打印第一行后的5行
one
two
three
four
five
six

[root@server ~]# sed -n '/^f/p' sed1.txt  #打印f开头的行
four
five

[root@server ~]# sed -n '/t/p' sed1.txt  #检索包含t的行
two
three
eight
ten

[root@server ~]# sed -n '/^f/p;/t/p' sed1.txt  #检索f开头行或者包含t的行
two
three
four
five
eight
ten

[root@server ~]# sed -n '2,/five/p' sed1.txt #检索第二行到five所在行
two
three
four
five

[root@server ~]# sed -n '/n$/p' sed1.txt #检索n结尾的行
seven
ten

[root@server ~]# sed -n 'n;p' sed1.txt #打印偶数行
two
four
six
eight
ten

[root@server ~]# sed -n 'p;n' sed1.txt #打印奇数行
one
three
five
seven
nine

[root@server ~]# sed -n '$=' sed1.txt #打印行数
10

文本替换

范例文件

[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg  ps
模板  图片  下载  桌面  passwd           sed1.txt
格式
sed '行范围s/旧字符串/新字符串/替换标记'  处理文件名
  • 行范围:使用数字表示,即对第几行到第几行进行替换管理处理,若省略则表示进行全文处理

  • s:替换动作

  • 替换标记

1.数字: 使用1-512之间的数字,表示指定需要替换的字符串出现第几次才进行替换

2.g: 对数据中所有匹配到的内容进行替换,若省略g则只会对第一次匹配的内容进行替换

3.p:替换成功立刻打印,一般与-n一起使用D:

4.w :文件名:将缓冲区的内容写入到指定文件中

5. &: 使用正则表达式匹配的内容进行替换

6.\: 转义符,若有特殊符号或路径则需要转义

示例
# 替换root为boot
[root@server ~]# sed  's/root/boot/g' ps

#将每一行的第一个root替换为admin
[root@server ~]# sed -n  's/root/admin/p' ps
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将本行第二次出现的root进行替换admin
[root@server ~]# sed -n 's/root/admin/2p' ps
root:x:0:0:admin:/root:/bin/bash

#将全文所有root进行替换admin并打印
[root@server ~]# sed -n 's/root/admin/gp' ps
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将第四行的adm替换为root
[root@server ~]# sed -n '4s/adm/root/p' ps #替换第一个
root:x:3:4:adm:/var/adm:/sbin/nologin
[root@server ~]# sed -n '4s/adm/root/gp' ps #加g,全行替换
root:x:3:4:root:/var/root:/sbin/nologin

#将行尾的/sbin/nologin替换为/bin/bash  注意:/需要转义
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/p' ps

#注意:上例中替换内容包含路径符号/,可以使用#暂时替代sed命令中的/,可改为
[root@server ~]# sed 's#/sbin/nologin#bin/bash#p'  ps

#将最后一行的:替换为@
[root@server ~]# sed -n '$s/:/@/gp' ps
fox_6@x@1000@1000@fox_6@/home/fox_6@/bin/bash

#全文注释
[root@server ~]# sed  's/^/#&/p' ps #指定位置处左侧添加#
[root@server ~]# sed  's/^/#/p' ps

#检索ssh行在其单词左侧添加一个#
[root@server ~]# sed -n  's/SSH/#&/gp' ps
sshd:x:74:74:Privilege-separated #SSH:/usr/share/empty.sshd:/sbin/nologin
#右侧添加#
[root@server ~]# sed -n  's/SSH/&#/gp' ps
sshd:x:74:74:Privilege-separated SSH#:/usr/share/empty.sshd:/sbin/nologin

#所有的行首添加@及行尾添加@
[root@server ~]# sed -e  's/^/@&/' -e ' s/$/&@/' ps

#在第一行之前插入空白行
[root@server ~]# sed  '1s/^/\n/' ps
 
#最后一行之后插入空白行
[root@server ~]# sed  '$s/$/\n/' ps

#所有小写改为大写,\u表示大写  &:启用正则
[root@server ~]# sed 's/[a-z]/\u&/g' ps

#所有大写改小写,\l(小写l):表示小写字母
[root@server ~]# sed -i  's/[A-Z]/\l&/g'  ps

#单词第一个字母大写 \b:表示分匹配单词的边界
[root@server ~]# sed 's/\b[a-z]/\u&/g' ps
#实战1:关闭或者打开selinux
[root@server ~]# sed -i '22s/disabled/enforcing/' /etc/selinux/config 

#实战2:apache的网页目录修改
[root@server ~]# yum install httpd -y
[root@server ~]# sed -i -e  '124s/\/var\/www.html/\/zy/' -e '129s/\/var\/www/\/zy/' /etc/httpd/conf/httpd.conf 
[root@server ~]# vim /etc/httpd/conf/httpd.conf 
#利用替换实现删除

#将全文的root删除
[root@server ~]# sed -n 's/root//gp' ps

#删除每一行的第一个字符
[root@server ~]# sed -n  's/^.//p' ps 		#.代表任意

#删除每一行的最后字符
[root@server ~]# sed -n 's/.$//p' ps

#删除注释符#
[root@server ~]# sed -n 's/^#//p' /etc/sos/sos.conf 

#删除5-10行的所有数字
[root@server ~]# sed '5,10s/[0-9]//g' ps

#删除特殊字符(出来数字字母),即将结果写入到t1.txt中
[root@server ~]# sed 's/[^(0-9)(a-z)(A-Z)]//gw t1.txt' ps

文本删除

注意:d操作用于删除文本的特定航,会删除指定的所有内容,则使用该命令必须特别小心,若忘记指定处理行的话会删除所有内容,也不会任何输出

示例 
示例文件
[root@server ~]# cp /etc/sos/sos.conf ~/

#删除第一行
[root@server ~]# sed '1d' sos.conf 

#删除2-5行
[root@server ~]# sed '2,5d' sos.conf 

#删除8-最后一行
[root@server ~]# sed '8,$d' sos.conf 

#删除最后一行
[root@server ~]# sed '$d' sos.conf 

#使用变量最为行号
[root@server ~]# num_line=1
[root@server ~]# sed "${num_line}d" sos.conf #注意双引号

#删除空白行
[root@server ~]# sed '/^$/d' sos.conf 

#删除带[]
[root@server ~]# sed '/\[/d' sos.conf 

[root@server ~]# sed '/root/d' ps

插入文本

注意:使用a动作在文本最后追加一行,使用i动作在指定行前添加一行,俩者格式相同

 格式
sed '行范围a(或i)\新文本' 文件名
示例
[root@server ~]# sed -i '$a\192.168.228.133 www.openlab.com' /etc/hosts

[root@server ~]# sed -i '3i\192.168.228.132 www.openlab.com' /etc/hosts

[root@server ~]# sed -i '/132/i\192.168.228.131 www.openlab.com' /etc/hosts

#注意:sed是基于数据流处理的命令,若文本无内容则无法处理,座椅空文件无法插入内容
[root@server ~]# touch t2.txt
[root@server ~]# sed -i '$a\xaio ming 19,98.5' t2.txt 
[root@server ~]# cat t2.txt 

3.awk

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

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

相关文章

MySQL---通用语法及分类

目录 一、SQL通用语法 二、 SQL分类 1.DDL 1.1 DDL数据库操作 1.2 DDL表操作---查询 1.3 DDL表操作---创建​编辑 1.4 DDL表操作---数据类型 1.5 DDL表操作---修改 1.6 DDL表操作---删除 1.7 DDL总结 2. 图形化界面工具DataGrip 2.1 创建 2.2 使用 3. DML 3.1 DML介绍 3.2 DM…

基于开源ATmega8 无感BLDC程序移植到ATmega328PB

基于开源ATmega8 无感BLDC程序移植到ATmega328PB 🔖基于Atmel Studio 7.0开发环境。🥕开源原项目资源地址:https://svn.mikrokopter.de/websvn/listing.php?repnameBL-Ctrl&path%2F&📍原理图和PCB资源 BL-Ctrl v2.0 in E…

【FPGA】VGA显示文字、彩条、图片——基于DE2-115

文章目录 前言一、VGA概述1.1 简述1.2 管脚定义1.3 VGA显示原理1.4 VGA时序标准1.5 VGA 显示模式及相关参数 二、VGA显示自定义的汉字字符2.1 点阵汉字生成2.2 生成BMP文件2.3 生成txt文件2.4 实现效果 三、VGA显示条纹3.1 实现流程3.2 实现效果 四、VGA输出一幅彩色图像4.1 bm…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

Plotly库利用滑块创建数据可视化

使用了Plotly库来创建一个数据可视化图表,并使用滑块来控制显示哪些数据 import plotly.graph_objects as go from plotly.subplots import make_subplots# 示例数据 x [1, 2, 3, 4, 5] y1 [1, 2, 3, 4, 5] y2 [5, 4, 3, 2, 1] y3 [2, 3, 1, 5, 4]# 创建子图 f…

基于jeecgboot-vue3的Flowable增加流程支持组件与element-plus组件导入支持

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、package.json文件需要增加相关流程组件,如下 "dependencies": {"element-plus/icons-vue": "^2.3.1","highlightjs/vue-plugin":…

JDBCTemplate介绍

Spring JDBC Spring框架对Spring的简单封装。提供一个JDBCTemplate对象简化JDBC开发 *步骤: 1、导入jar包 2、创建JDBCTemplate对象。依赖于数据源DataSource *JdbcTemplate templatenew JdbcTemplate(ds); 3、调用JdbcTemplate的方法来完成CRUD的操作 *update()&…

解决问题:Collecting package metadata (current_repodata.json)--faile

目录 解决步骤: 1、创建pip.ini文件:winR对话框中复制输入:%APPDATA%,然后回车。 2、conda添加清华源: 3、这些创建完,重启电脑就可以创建你的虚拟环境了 4、利用镜像源下载库: 5、查看to…

青鸟云报修系统:实现高效、便捷的维修申请处理

在日常生活和工作中,故障报修难免会遇到,售后报修服务则成为了解决问题的关键。纸质化售后报修维修申请单,作为报修流程中的重要一环,在一定程度上能够记录和追踪售后报修维修流程,但在实际操作过程中却存在着诸多弊端…

C# NetworkStream 流的详解与示例

文章目录 一、NetworkStream类的基本概念1.1 NetworkStream类概述1.2 NetworkStream类属性1.3 NetworkStream类方法 二、NetworkStream的连接方式三、NetworkStream的传输模式四、NetworkStream类示例服务器端代码:客户端代码: 五、总结 在C#中&#xff…

代码审计--一道简单的文件包含题目的多种利用方式

NO.1 传统方法 首先来看下代码 <?php error_reporting(0); if(isset($_GET["file"])){include($_GET["file"]); }else{highlight_file(__FILE__);phpinfo(); } ?>看完代码后再来学习学习函数吧&#xff0c;毕竟菜啊&#xff01;&#xff01;&…

webpack编译过程

webpack编译过程 初始化 此阶段&#xff0c;webpack会将**CLI参数**、**配置文件**、**默认配置**进行融合&#xff0c;形成一个最终的配置对象。​ 对配置的处理过程是依托一个第三方库yargs完成的 ​ 此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备 ​…

那智不二越机器人维修案例分享

那智不二越工业机器人在工业范围内广泛应用于各种生产领域。其示教器作为人机交互的重要设备&#xff0c;常常需要定期维护和Nachi不二越机械手示教盒修理。 【Nachi不二越机器人示教器维修步骤】 1. 关闭电源 在进行任何那智不二越机器人维修操作之前&#xff0c;务必确保机器…

arc-eager算法XJTU-NLP自然语言处理技术期末考知识点

arc-eager算法&#xff1a;以我/做了/一个/梦为例来描述arc-eager算法的四个操作&#xff1a;shift&#xff0c;left-arc&#xff0c;right-arc&#xff0c;reduce XJTU-NLP期末考点2024版 题型&#xff1a;5*6简答题4*15计算题 简答题考点&#xff1a; &#xff08;1&#…

总结 HTTPS 的加密流程

一、前言 http是为了解决http存在的问题而在http基础上加入了SSL/TSL&#xff0c;在HTTP/2中TCP三次握手后会进入SSL/TSL握手&#xff0c;当SSL/TSL建立链接后&#xff0c;才会进行报文的传输。 二、HTTPS的混合加密 我们先来认识密钥&#xff1a; 密钥是用于加密和解密数据…

【spring】@PathVariable注解学习

PathVariable介绍 PathVariable是Spring框架中的一个注解&#xff0c;主要用于处理RESTful风格URL中的路径变量。在RESTful接口设计中&#xff0c;我们经常将资源的ID或者其他标识信息直接放在URL路径中&#xff0c;而不是作为查询参数。PathVariable注解使得控制器方法能够轻…

开源博客项目Blog .NET Core源码学习(22:App.Hosting项目结构分析-10)

本文学习并分析App.Hosting项目中后台管理页面的通知公告维护页面、友情链接维护页面。 通知公告维护页面 通知公告维护页面用于显示、检索、新建、编辑、删除通知公告数据&#xff0c;以便在前台页面的首页循环显示通知公告。通知公告维护页面附带一新建及编辑页面&#xff0…

hsql学习笔记

1. row_number() over (partition by uid order by dt 分析&#xff1a; row_number()&#xff1a; 这是一个窗口函数&#xff0c;用于为结果集中的每一行分配一个唯一的序号。默认情况下&#xff0c;这个序号是按照查询结果的顺序来分配的&#xff0c;但你可以通过OVER()子句…

docker搭建私有仓库并推送本地镜像

1、私仓搭建 docker pull registry#拉取镜像 docker images#查看镜像 mkdir -p /czx/myregistry 创建挂载目录 运行私有库registry (相当于本地有个是有docker hub) docker run -d -p 5000:5000 -v /czx/myregistry/:/tmp/registry --restartalways --privilegedtrue regist…

如何利用GitHubAction来发布自己的Python软件包

我们开发的python软件包如果想发布到网上&#xff0c;可以让其他人通过pip install下载&#xff0c;一般是把软件包发布到PYPI平台。 PYPI准备 我们要现在pypi注册登录一下 文件组织架构 一般的python软件包的文件组织架构为包名文件夹__init__.py程序&#xff0c;包文件夹的…