linux文本三剑客之sed命令详解
linux文本三剑客之sed命令详解
1.sed命令详解
sed称为流编辑器,处理流程如下:
- 一次处理一行内容,把当前处理的行缓存在临时缓存区中,称为“模式空间”,用sed命令处理缓存区的内容,处理完成后,把缓冲区的内容送往屏幕。sed默认不会修改源文件数据。
- 当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
sed命令的语法结构如下:
sed [OPTION]... {script} [input-file]...
{script}:为地址命令
sed命令的选项如下:
选项 | 说明 |
---|---|
-n | 默认情况下,sed 会在所有的脚本执行完毕后,会自动输出处理后的内容,而该选项会屏蔽自动输出,需使用 p 命令来完成输出。 |
-e | 多点编辑,逻辑与,需同时匹配前后两者内容才会输出 |
-f | 从指定文件中读取编辑文件 |
-r | 支持使用扩展正则表达式,默认支持标准正则表达式 |
-i | 此选项会直接修改源文件 |
1.1 地址定界和编辑命令
地址定界
地址定界符 说明 不给地址 默认进行全文处理 # 指定的#行 $ 最后一行 /pattern/ 被此模式匹配到的每一行 m,n 从第m行到第n行 m,+n 从第m行到m+n行 /pat1/,/pat2/ 从模式1的行到模式2的行 m,/pat1/ 从第m行到被模式1匹配的行 ~ 步进 编辑命令
命令 选项 d 删除模式空间的行,并开启下一行 p 打印当前模式匹配的行,追加到指定行之后 a [\]text 在指定的行后面追加文本,\用于读特殊符号转义,\n换行实现多行文本追加 i [\]text 在指定的行之前追加文本 c [\]text 把指定的行替换为text文本 w FILE 保存模式匹配的行到FILE文件 r FILE 读取指定文件的行到模式空间中,匹配到指定行后 ! 模式空间的行取反处理 = 为模式空间的行打印行号 sed用法示例如下:
#示例一:sed默认会对没有处理的行自动打印,对要处理的行再次处理一次
[root@xuzhichao ~]# seq 1 5 | sed '2p'
1
2
2
3
4
5 #示例二:-n选项,会把没有处理的内容不输出到屏幕
[root@xuzhichao ~]# seq 1 5 | sed -n '2p'
2 #示例三:sed的地址定界功能
[root@xuzhichao ~]# sed -n '/^root/,/^bin/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
rooter:x:1002:1002::/home/rooter:/bin/bash
[root@xuzhichao ~]# sed -n '/^root\>/,/^bin/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin #示例四:sed的地址定界功能
[root@xuzhichao ~]# sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@xuzhichao ~]# sed -n '2,3p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@xuzhichao ~]# sed -n '2,+1p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@xuzhichao ~]# sed -n '/^root\>/,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin #示例五:打印奇数行和偶数行
[root@xuzhichao ~]# seq 6 | sed -n '1~2p'
1
3
5
[root@xuzhichao ~]# seq 6 | sed -n '2~2p'
2
4
6 #示例六:-e选项,同时实现多个选项
[root@xuzhichao ~]# seq 5 | sed -n -e '2p' -e '4p'
2
4 #示例七:d选项,删除,不加地址定界会删除全部内容,与-n选项合用也会删除全部内容
[root@xuzhichao ~]# seq 5 | sed 'd'
[root@xuzhichao ~]# seq 5 | sed -n '4d'
[root@xuzhichao ~]# seq 5 | sed '1,4d'
2
3
5 #示例八:!的取反功能
[root@xuzhichao ~]# seq 5 | sed -n '4!p'
1
2
3
5
[root@xuzhichao ~]# seq 5 | sed '4!d'
4 #示例九:显示行号
[root@xuzhichao ~]# sed -n '/root/=' /etc/passwd
1
10
39
40
[root@xuzhichao ~]# sed -n -e '/root/=' -e '/root/p' /etc/passwd
1
root:x:0:0:root:/root:/bin/bash
10
operator:x:11:0:operator:/root:/sbin/nologin
39
admroot:x:1001:1001::/home/admroot:/bin/bash
40
rooter:x:1002:1002::/home/rooter:/bin/bash #示例十:a选项追加内容
[root@xuzhichao ~]# seq 5 | sed '2,4a\ =======\n\ ======='
1
2
======= <==空格后跟多个等号=
=======
3
=======
=======
4
=======
=======
5 #示例十一:a追加的用法:在~/.bashrc文件中增加两个别名项。
[root@xuzhichao ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi [root@xuzhichao ~]# sed '/specific/aalias cdnet="cd /etc/sysconfig/network-scripts/"\nalias p=poweroff' ~/.bashrc
# .bashrc
# User specific aliases and functions
alias cdnet="cd /etc/sysconfig/network-scripts/"
alias p=poweroff alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi #示例十二:i选项用于在指定行前面增加内容
[root@xuzhichao ~]# seq 5 | sed '2iabc\nefg'
1
abc
efg
2
3
4
5 #示例十三:c选项用于替换指定行的内容
[root@xuzhichao ~]# seq 5 | sed '1,2cabc\nefg'
abc
efg
3
4
5 #示例十四:w选项可以保存指定行到一个文件中
[root@xuzhichao ~]# seq 5 | sed -n '2,4wf1'
[root@xuzhichao ~]# cat f1
2
3
4 #示例十五:r选项可以读取指定的文件内容追加到指定的行后
[root@xuzhichao ~]# cat f2
1
2
3
[root@xuzhichao ~]# seq 4 6 | sed '3r f2'
4
5
6
1
2
3 #示例十六:-i选项可以直接修改原始文件,-i.bak可以先备份原始文件,然后再修改原始文件
[root@xuzhichao ~]# cat f2
1
2
3
[root@xuzhichao ~]# sed -i '2aabc' f2
[root@xuzhichao ~]# cat f2
1
2
abc
3
[root@xuzhichao ~]# sed -i.bak '2aabc' f2
[root@xuzhichao ~]# cat f2
1
2
abc
abc
3
[root@xuzhichao ~]# cat f2.bak
1
2
abc
3
1.2 搜索替换
sed可以实现搜素替换功能,比较常用,命令格式为:
[address]s/pattern/replacement/flags
[address]:代表地址定界;
pattern:指的是需要替换的内容,支持正则表达式;
replacement:指的是要替换的新内容,支持后向引用;
其中/可以换为@或#,即s@@@或s###;
常用的flags意义如下:
flags | 说明, |
---|---|
g | 对一行中的数据匹配到的内容全部进行替换,如果没有 g,则只会对匹配到的第一个数据做替换操作。 |
p | 打印替换命令中被pattern模式匹配到的行,此标记通常与 -n 选项一起使用 |
n | 1~512 之间的数字,表示要替换第几次被模式匹配到的字符串,例如,一行中有 3 个 A,但用户只想替换第二个 A,则n为2 |
w file | 将缓冲区中的内容写到指定的 file 文件中 |
& | 后向引用,表示对[address]s/pattern/replacement/flags中的pattern匹配的内容进行引用 |
\n | 后向引用,表示对pattern中的内容匹配的第 n 个小括号分组匹配中的内容进行引用。 |
\ | 用于转义特殊字符 |
sed搜索替换相关的使用示例如下:
#示例一:sed的搜索替换如果不加flag,默认只对一行中匹配的地址pattern进行替换;
#使用数字n可以指定对第n个匹配到的pattern进行替换;
#使用g会对所有匹配到的pattern进行替换;
[root@xuzhichao ~]# echo "root root root" | sed 's/root/admin/'
admin root root
[root@xuzhichao ~]# echo "root root root" | sed 's/root/admin/2'
root admin root
[root@xuzhichao ~]# echo "root root root" | sed 's/root/admin/g'
admin admin admin
#示例二:w选项,会把匹配到的行写入文件中;
#注意:仅仅会把pattern匹配到的行写入文件中,而且是被替换之后;
[root@xuzhichao ~]# seq 5 | sed -n 's/1/11/w f1'
[root@xuzhichao ~]# cat f1
11
#示例三:&的应用:不需要使用分组(),会对pattern匹配到的所有内容进行引用
[root@xuzhichao ~]# echo "root root root" | sed 's/root/&er/g'
rooter rooter rooter
#示例四:把/etc/default/grub的第六行之后增加single单用户模式
[root@xuzhichao ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
[root@xuzhichao ~]# sed '/GRUB_CMDLINE_LINUX/s/"$/ single&/' /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 single"
GRUB_DISABLE_RECOVERY="true"
#示例五:取路径的基名和文件夹名
#basename命令用于取文件路径中的文件名
#dirname命令用于取文件路径中的目录名
[root@xuzhichao ~]# echo "/etc/httpd/conf/httpd.conf" | sed -r 's@(^.*/)([^/]+/?$)@\1@'
/etc/httpd/conf/
[root@xuzhichao ~]# echo "/etc/httpd/conf/httpd.conf" | sed -r 's@(^.*/)([^/]+/?$)@\2@'
httpd.conf
[root@xuzhichao ~]# basename /etc/httpd/conf/httpd.conf
httpd.conf
[root@xuzhichao ~]# dirname /etc/httpd/conf/httpd.conf
/etc/httpd/conf
#示例六:删除/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
[root@xuzhichao ~]# sed -r 's/^[[:space:]]+(.*)/\1/' /etc/grub2.cfg
#示例七:注释/etc/fstab中的所有行
[root@xuzhichao ~]# sed -r 's/.*/#&/' /etc/fstab
[root@xuzhichao ~]# sed -r 's/^[^#]+/#&/' /etc/fstab
#示例八:把/etc/httpd/conf/httpd.conf文件中所有注释行删除,grep -v "^$"用于删除空行
[root@xuzhichao ~]# sed -r 's/^[[:space:]]*#.*//' /etc/httpd/conf/httpd.conf | grep -v "^$"
#示例九:使用sed取出ifconfig中的本机ip地址
[root@xuzhichao ~]# ifconfig eth0 | sed -r '2!d;s/.*inet (.*) netmask.*/\1/'
192.168.20.17
#示例十:对centos中光盘所有rpm包基于cpu架构(倒数第二个字段)统计并排序
[root@xuzhichao ~]# ls /misc/cd/Packages/*.rpm | tr -s ' ' '\n' | sed -r 's/^.+\.([^.]+)\.rpm$/\1/' | sort | uniq -c | sort -rn
[root@xuzhichao ~]# ls /misc/cd/Packages/*.rpm | tr -s ' ' '\n' | awk -F. '{print $(NF-1)}' | sort | uniq -c | sort -rn
[root@xuzhichao ~]# ls /misc/cd/Packages/*.rpm | tr -s ' ' '\n' | rev | cut -d. -f 2 | rev | sort | uniq -c | sort -rn
4649 x86_64
3154 noarch
2267 i686
#示例十一:统计/etc/init.d/functions中单词总数
#处理思路:单词只包括字符串中包含字母,数字,其他字符都是单词的分隔符
[root@xuzhichao ~]# cat /etc/init.d/functions | tr -s " " | sed -r 's/[^[:alnum:]]/\n/g' | wc -l
1.3 sed高级用法
sed命令在处理数据时的缓存区有模式空间和保持空间两个空间,利用这两个空间可以实现一些高级编辑功能。
sed命令的以下子命令意义如下:
命令 | 意义 |
---|---|
P | 同 d 和 D 之间的区别一样,P(大写)命令和单行打印命令 p(小写)不同,对于具有多行数据的模式空间来说,它只会打印模式空间中的第一行,也就是首个换行符之前的所有内容;p会打印模式空间的所有内容 |
h | 将模式空间中的内容复制到保持空间 |
H | 将模式空间中的内容附加到保持空间 |
g | 将保持空间中的内容复制到模式空间 |
G | 将保持空间中的内容附加到模式空间 |
x | 交换模式空间和保持空间中的内容 |
n | 读取匹配到的行的下一行覆盖至模式空间 |
N | 将匹配到的行的下一行文本内容添加到模式空间已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于模式空间中,sed 命令会将这两行数据当成一行来处理。 |
d | 删除模式空间的行,然后读取下一行继续删除 |
D | 其作用是只删除缓冲区中的第一行,即将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。 |
高级用法使用示例:
#示例一:使用sed匹配2,然后把2和2的下一行3读入模式空间中,把换行符替换为空格
[root@xuzhichao ~]# seq 5 | sed '/2/{N;s/\n/ /}'
1
2 3
4
5
[root@xuzhichao ~]# seq 5 | sed '{N;s/\n/ /}'
1 2
3 4
5
#示例二:
#查找字符串2,然后把2和2的下一行3读入模式空间,在模式空间中匹配2,匹配到后把第一个换行前的内容删除
[root@xuzhichao ~]# seq 5 | sed '/2/{N;/2/D}'
1
3
4
5
#示例三:查找字符串2,然后把2和2的下一行3读入模式空间,在模式空间中匹配2,匹配到后把模式空间所有内容删除
[root@xuzhichao ~]# seq 5 | sed '/2/{N;/2/d}'
1
4
5
[root@xuzhichao ~]# seq 5 | sed '/2/{N;d}'
1
4
5
#示例四:一次读取两行到模式空间,第一读取前两行,匹配到2,删除1;第二次读取第2行和第3行,匹配到2,把2删除。
[root@xuzhichao ~]# seq 5 | sed 'N;/2/D'
3
4
5
[root@xuzhichao ~]# seq 5 | sed 'N;/3/D'
1
2
4
5
#示例五:sed命令一次读取两行,第一次读取前两行,输出换行符之前的内容,即1,然后sed自动把模式空间内容输出,接着读取第3行和第4行,依次类推。
[root@xuzhichao ~]# seq 5 | sed 'N;P'
1
1
2
3
3
4
5
[root@xuzhichao ~]# seq 5 | sed 'N;p'
1
2
1
2
3
4
3
4
5
#示例六:打印奇数行和偶数行
[root@xuzhichao ~]# seq 5 | sed 'n;d'
1
3
5
[root@xuzhichao ~]# seq 5 | sed -n 'n;p'
2
4
#示例七:倒序显示tac,实现步骤如下
#1、读取第1行内容1,1!G不匹配第一行,h把1放入保持空间,$!d把不是最后一行的模式空间内容清空,此时保持空间为1;
#2、读取第2行内容2,1!G把1追加到模式空间,h把2\n1放入保持空间,$!d把不是最后一行的模式空间内容清空,此时保持空间为2\n1;
#3、依次类推,当最后一行读入时,模式空间不会清空,直接打印出来即为倒序显示;
[root@xuzhichao ~]# seq 5 | sed '1!G;h;$!d'
5
4
3
2
1
[root@xuzhichao ~]# seq 5 | sed -n '1!G;h;$p'
5
4
3
2
1
#示例八:取最后一行
[root@xuzhichao ~]# seq 5 | sed 'N;D'
5
[root@xuzhichao ~]# seq 5 | sed '$!d'
5
#示例九:取最后两行
[root@xuzhichao ~]# seq 5 | sed '$!N;$!D'
4
5
#示例十:每行后追加空行
[root@xuzhichao ~]# seq 5 | sed 'G'
1
2
3
4
5
linux文本三剑客之sed命令详解的更多相关文章
- linux每天一小步---sed命令详解
1 命令功能 sed是一个相当强大的文件处理编辑工具,sed用来替换,删除,更新文件中的内容.sed以文本行为单位进行处理,一次处理一行内容.首先sed吧当前处理的行存储在临时的缓冲区中(称为模式空间 ...
- shell 三剑客之 sed 命令详解
sed 编辑命令 sed 编辑命令对照表 把 /etc/passwd 文件赋值到当前路径下,进行操作 cp /etc/passwd ./ cat -n passwd sed 删除操作 删除 passw ...
- 转 linux之sed命令详解
http://jingyan.baidu.com/article/fec4bce2228f60f2618d8bb0.html sed 编辑裁剪文件命令 sed -i "s/\/db\/te ...
- Linux shell sed 命令详解
详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761 sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在 ...
- Linux学习之sed命令详解
概述 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区 ...
- 【转】【Linux】sed命令详解
sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...
- linux sort,uniq,cut,wc命令详解
linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- (转)linux sort,uniq,cut,wc命令详解
linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...
- (转)Linux内核参数设置sysctl命令详解
Linux内核参数设置sysctl命令详解 原文:https://www.zhukun.net/archives/8064 sysctl是一个允许您改变正在运行中的Linux系统的接口. 它包含一些 ...
随机推荐
- C++设计模式 - 工厂方法(Factory Method)
对象创建模式 通过"对象创建"模式绕开new ,来避免对象创建( new )过程中所导致的紧耦合(依赖具体类) , 从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 ...
- docker运行javaWeb服务,操作文件异常
一.问题由来 部署一个测试服务在自己的服务器上面,然后运行其中的一个功能.然后报错,报错信息如下 二.问题分析 自己一开始也很疑惑,怎么会出现这个问题呢,自己明明把对应的文件放在对应的目录下面,并且已 ...
- 一文弄懂EnumMap和EnumSet
目录 简介 EnumMap 什么时候使用EnumMap EnumSet 总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑 ...
- OpenHarmony如何切换横竖屏?
前言 在日常开发中,大多APP可能根据实际情况直接将APP的界面方向固定,或竖屏或横屏.但在使用过程中,我们还是会遇到横竖屏切换的功能需求,可能是通过物理重力感应触发,也有可能是用户手动触发.所以本文 ...
- 遵循这些MySQL设计规范,再也没被组长喷过
分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 会议室里,小猫挠着头,心里暗暗叫苦着"哎,这代码都撸完了呀,改起来成本也太大了." 原来就 ...
- 重新整理 .net core 实践篇—————微服务的桥梁EventBus[三十一]
前言 简单介绍一下EventBus. 正文 EventBus 也就是集成事件,用于服务与服务之间的通信. 比如说我们的订单处理事件,当订单处理完毕后,我们如果通过api马上去调用后续接口. 比如说订单 ...
- 重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]
前言 迪杰斯特拉算法 是求最短路径方法的其中一种,这个有什么作用呢? 有一张图: 假设求G点到其他各点的最小路径. 是这样来的. 比如找到了和G点相连接所有点,ABED.这时候确定GA是一定是最短的, ...
- 布匹瑕疵检测数据集EDA分析
分析数据集中 train 集的每个类别的 bboxes 数量分布情况.因为训练集分了两个:train1,train2.先根据两个数据集的 anno_train.json 文件分析类别分布.数据集:布匹 ...
- Flutter笔记-基础组件
图片和Icon 加载网络图片以及本地图片 Image( image: NetworkImage( "https://img-s-msn-com.akamaized.net/tenant/am ...
- 大数据ETL开发之图解Kettle工具入门到精通(经典转载)
大数据ETL开发之图解Kettle工具(入门到精通) 置顶 袁袁袁袁满 文章目录 第0章 ETL简介 第1章 Kettle简介 1.1 Kettle是什么 1.2 Kettle的两种设计 1.3 Ke ...