shell编程之sed

ops/2024/12/1 8:42:22/

一、sed工作原理

sed是一种流编程器,配合正则表达式使用来处理文本。

原理:首先,把当前处理的行存储在临时缓冲区(模式空间),接着用sed命令处理缓冲区中的内容,处理完成之后,把缓冲区的内容送往屏幕。接着处理下一行,这样处理下一行,这样不断重复,知道文件末尾。——文件内容并没有改变。

二、sed基本语法

sed OPTIONS… [SCRIPT] [INPUTFILE…]
<=> sed  选项… [脚本]   [要处理的文本文件…]
注:SCRIPT指的是sed命令的脚本部分,它是一系列sed命令的集合,用于指定对输入文本的处理方式。

常见的选项:

-n |  --quiet | --silent:安静模式,不输出模式空间中的内容。

理解:在一般sed用法中,所有来自stdin的数据一般都会被列出到屏幕上,但是如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来。如果不加则会将文本空间中的内容和正在处理的内容都输出来

注意:加n,只输出改过的内容的行

-i :直接编辑原文件,而不是屏幕输出。

注意:默认不对原文件进行操作。

-e :直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开。

如: sed -e 'command1;command2...' filename 或者 sed -e 'command1' -e 'command2' ……filename

-r :使用扩展正则表达式。

-f :直接将sed的动作写在一个文件内。

理解 :-f filename则可以执行filename内的sed动作。

三、模式空间中的编辑操作

1、地址界定

地址界定示例说明
不写地址界定对文件所有行进行处理
num1,num21,3或者1,$对文件指定范围的行(1-3)进行处理;如果是$,则表示文件的最后一行

num1,+N

1,+3对文件的num1行以及第N行(1,3)内容进行处理
first~step1~2对文件指定步长(1,3,5,7,……)的行内容进行处理
/模式//^root/,/r/|对任何能够被正则表达式匹配到的行进行处理
\%模式%\%/r%%(表示边界符),可以使用其他的边界符(例如#),对任何能够被正则表达式匹配到的行进行处理
/模式1/,/模式2//^root/,/^adm/表示正则表达式1和正则表达式2匹配到的行和两个正则表达式之间的所有行
0,/模式1/或者1,/模式1/1,/^adm/第0/1行开始到能够被正则表达式匹配到的行之间的所有内容

相关使用:

/r/I :加I,表示可匹配 I 前的字符的大写,且只匹配 I前的字符

/模式1/,/模式2/ 的应用:

下列表示:匹配有root的行,直到匹配a的行,并且多次匹配,一直输出,直到匹配到a的行

2、常见的编辑命令

对文件内容的编辑命令说明示例
d删除匹配到的行
[root@node13
~]#sed '1 d' file
[root@node13
~]#sed '/^$/d'
/etc/hosts
p打印匹配到的行
[root@node13
~]#sed '1 p' file
a 文本内容将文本内容添加到匹配到的行的下一行
[root@node13
~]#sed '1 a hello' file
i 文本内容将文本内容添加到匹配到的行的上一行
[root@node13
~]#sed '1 i hello' file
c 文本内容用文本内容替换匹配到的所有行
[root@node13
~]#sed '1,3 c hello'
file
s/模式/替换文本(replacement)/标志(flag)

根据正则表达式进行匹配,将匹配到的内容替为replacement,flag可以指定g(表示全局替换,默认只替换每行的第一个),num 1(表示对匹配到的第几行的内容进行替换),i(不区分大小写),p(如果成功替换则打印)

[root@node13
~]#sed '1 s#\
<print\>#echo#g'
file
[root@node13 ~]#
sed '1 s/\bprint\b/echo/2'
file
r读入文件内容追加到匹配行后面
[root@node13
~]#sed '2 r
/root/ceshi.sh' file
R读入文件一行内容追加到匹配行后面
[root@node13
~]#sed '2 R
/root/ceshi.sh' file
w /dir/filename将匹配到的内容另存到/dir/filename
[root@node13 ~]#
sed '1 w /dir1/file1'
file

补充:

①^$:表示空行

②vim在文本文件中多行添加 #

ctrl+v——按下键选中行——按 I ——按 # —— 按esc

 相关使用:

a 文本内容:

 在匹配到old行的下一行添加内容,但是不改变file文件里面的内容,只是在模拟空间中处理;

(1)sed 's/north/hello/' datafile -- 替换每行第一个 north
(2)sed 's/north/hello/g' datafile -- 全部替换
(3)sed '1 s/north/hello/g' datafile -- 替换第一行所有的 north
(4)sed '1 s/north/hello/' datafile -- 替换第一行第一个 north
(5)sed '1 s/north/hello/2' datafile -- 只替换第一行第二个 north
ps 巧用替换删除内容(不是删除行)
(6)sed 's/north//' datafile -- 删除所有行的第一个 north
(7)sed 's/north//g' datafile -- 删除全部的 north
(8)sed '1 s/north//2' datafile -- 删除第一行第二个
(9)sed 's/^.//' datafile -- 删除每行第一个字符
(10)sed 's/^\(..\)./\1/' datafile -- 删除第 3 个字符
(11)sed 's/^\<[a-Z]*[a-Z]\>//' datafile -- 删除每行第一个单词
特殊符号说明

对指定行以外的所有行应用命令

=打印当前行行号
~
“first~step” 表示从 first 行开始,以步长 step 递增
&代表匹配到的内容
实现一行命令语句可以执行多条sed命令
{}对单个地址或地址范围执行批量操作
+地址范围中用到的符号,做加法运算

相关使用:

[root@node13 ~]# sed '1 ! p' file # 打印除了第一行以外的行内容
[root@node13 ~]# sed '/echo/ = ' file
[root@node13 ~]# sed '1 s/echo/:&:/' file
[root@node13 ~]# sed '1 s/echo/:&:/; 3 s/bea/aaa/' file
[root@node13 ~]# sed '1,3 {p;=}' file 等同于 [root@node13 ~]# sed '1p;2p;3p;1
=;2=;3 =' file

!:打印除了第一行之外的行 

课后练习:

1 、把 /etc/passwd 复制到 /root/test.txt ,用 sed 打印所有行;
2 、打印 test.txt 3 10 行;
3 、打印 test.txt 中包含 ’root’ 的行;
4 、删除 test.txt 15 行以及以后所有行;
5 、删除 test.txt 中包含 ’bash’ 的行;
6 、替换 test.txt ’root’ ’toor’
7 、替换 test.txt ’/sbin/nologin’ ’/bin/login’
8 、删除 test.txt 5 10 行中所有的数字;
9 、删除 test.txt 中所有特殊字符(除了数字以及大小写字母);
10 、在 test.txt 20 行到末行最前面加 ’aaa:’
[root@localhost ~] # sed '20,$s/^.*$/aaa:&/g' test.txt
11 、复制 /etc/grub2.cfg /root/grub2.cfg, 删除文件中所有以空白开头的行行首的空白字符;
[root@localhost ~] # sed 's/^[[:space:]]//' grub2.cfg
12 、删除 /etc/fstab 文件中所有以 # 开头,后面至少跟一个空白字符的行的行首的 # 和空白字符
[root@localhost ~] # sed 's/^#[[:space:]]*//' /etc/fstab
13 、给文件 /root/anaconda-ks.cfg 每一行行首增加 #
[root@localhost ~] # sed 's/^.*$/#&/' /root/anaconda-ks.cfg
14 、在 /etc/fstab 文件中不以 # 开头的行的行首增加 # 号;
[root@localhost ~] # sed 's/^[^#]/#&/' /etc/fstab
15 、处理 /etc/sysconfig/network-scripts/ 路径 , 使用 grep sed 命令取出其目录名和基名
[root@localhost ~] # echo "/etc/sysconfig/network-scripts/" |sed -r
's#^/(.*)/(.*)/#\1#' etc/sysconfig
[root@localhost ~] # echo "/etc/sysconfig/network-scripts/" |sed -r
's#^/(.*)/(.*)/#\2#'
network-scripts
[root@localhost ~] # echo "/etc/httpd/conf.d/host.conf" | sed -r 's#(^/.*/)
[^/].* #\1#'
/etc/httpd/conf.d/
[root@localhost ~] # echo "/etc/httpd/conf.d/host.conf" | sed -r
's#^/.*/([^/].*)#\1#'
host.conf
[root@localhost ~] # basename /etc/httpd/conf.d/host.conf
host.conf
[root@localhost ~] # dirname /etc/httpd/conf.d/host.conf
/etc/httpd/conf.d
[root@localhost ~] # echo "/etc/sysconfig/network-scripts/"|grep -o -E "
[^/]+/?
$"|grep -o -E " ^[^/] + "
network-scripts
[root@localhost ~] # echo "/etc/sysconfig/network-scripts/"|grep -o -E "
(^/([^/] + /)*[^[:space:]])|^/ "|grep -o -E " ^/([^/] + /)* "|grep -o -E "
(/[^/] + ) + |^/ "
/etc/sysconfig
16 、利用 sed 取出 ifconfig 命令中本机的 IPv4 地址
[root@localhost ~] # ifconfig |sed -n '2p' | sed -r "s/.*inet[[:space:]]*//"
|
sed -r "s/[[:space:]]*netmask.*//"
192 .168.168.128
17 、统计 centos 安装光盘中 Package 目录下的所有 rpm 文件的以 . 分隔倒数第二个字段的重复次数
[root@localhost ~] # ls /mnt/Packages/|grep "rpm$"|sed -r 's@.*\.
(.*)\.rpm@\1@ '|sort|uniq -c
1085 i686
1216 noarch
2319 x86_64

脚本练习:

1 、删除 /etc/grub2.conf 文件中所有以空白开头的行行首的空白字符
2 、删除 /etc/fstab 文件中所有以 # 开头,后面至少跟一个空白字符的行的行首的 # 和空白字符
3 、在 /root/install.log 每一行行首增加 #
4 、在 /etc/fstab 文件中不以 # 开头的行的行首增加 #
5 、利用 sed 取出 ifconfig 命令中本机的 IPv4 地址
6 、关闭本机 SELinux 的功能
7 、在 /etc/hosts 配置文件中添加内容

替换file中所有old为new,包括大写字符;标志分隔符可以用/或者#

加n:只输出改过的内容的行

-r:

-R:

删除前三个字符的中的第三个字符(用的子表达式)

!:打印除了第一行之外的行

&:与s替换结合,表示匹配到的字符前面添加内容


http://www.ppmy.cn/ops/138149.html

相关文章

scala的名次排名

1.准备一个空的List 2.读取文件—按行读取 3.添加学生到List 对有序的列表&#xff0c;从前开始向后一一比较 (1).如果当前的分数不等于预设分数&#xff0c;则名次1&#xff0c;更新预设分数 (2).如果当前的分数等于预设分数&#xff0c;则名次不变 4.排名 实例操作代码如…

JavaScript 进阶教程:深入理解函数、事件和模块化

在上一节中&#xff0c;我们学习了 JavaScript 的基础语法&#xff0c;并通过一个简单计数器案例感受了它的实际应用。这一节将进一步深入学习 JavaScript 中的重要概念&#xff0c;如函数的高级用法、事件机制以及模块化开发&#xff0c;为更复杂的项目开发打下基础。 一、深入…

android将pcm byte[]通过Librtmp进行rtmp推流

需求 我们这边做的功能是智能戒指&#xff0c;戒指可以录音&#xff0c;然后app通过蓝牙连接&#xff0c;将音频的byte[]进行rtmp推流 技术 因为我们不涉及直播&#xff0c;也不涉及视频&#xff0c;工期也比较短&#xff0c;只是音频推流&#xff0c;所以没用更复杂的ffmpe…

【MySQL-6】MySQL的复合查询

目录 1. 整体学习的思维导图 2. 回顾基本查询 3. 多表查询 4. 自连接 5. 子查询 5.1 单行子查询 5.2 多行子查询 5.3 多列子查询 5.4 在from子句中使用子查询 6. 合并查询 1. 整体学习的思维导图 2. 回顾基本查询 使用scott数据库中的表&#xff0c;完成以下查询&am…

Ansible自动化一键部署单节点集群架构

自动化部署利器&#xff1a;Ansible 一键部署脚本 在现代IT基础设施管理中&#xff0c;Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本&#xff0c;旨在简化部署流程&#xff0c;提升效率&#xff0c;确保一致性和可靠性。 通过这个…

模拟器快速上手,助力HarmonyOS应用/服务高效开发

文章目录 1 创建模拟器1&#xff09;打开设备管理界面2&#xff09;设置本地模拟器实例存储路径3&#xff09;创建一个模拟器&#xff08;1&#xff09;选择模拟器设备&#xff08;2&#xff09;创建模拟器&#xff08;3&#xff09;启动模拟器&#xff08;4&#xff09;关闭模…

微服务篇-微服务保护:使用 Sentinel 来实现请求限流、线程隔离、服务熔断和 Fallback 备用方案的使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 微服务保护 1.1 请求限流方案 1.2 线程隔离方案 1.3 服务熔断方案 2.0 Sentinel 2.1 Sentinel 安装 2.2 微服务整合 3.0 Sentinel-请求限流 4.0 Sentinel-线程隔离…

射频ADS匹配器阻抗仿真KEYSIGHT FR Basic:Efficient Impedance Matching With ADS

射频ADS匹配器阻抗仿真KEYSIGHT FR Basic&#xff1a;Efficient Impedance Matching With ADS