本文小编为大家详细介绍“Linux sed工具的使用及工作原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux sed工具的使用及工作原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
- 行编辑工具: 一行一行处理文件内容,例如:sed - 全屏编辑工具:一次性将文件所有内容加载到内存中,例如:vi、vim、nano
逐行处理文件内容,一次读取一行内容到模式空间处理。由此反复,知道最后一行处理完成。
# 处理:可以是输出到屏幕,也可以是文本的修改替换等操作 # 模式空间:就是一块内存空间
sed [option] 'script' [inputfile] #script: sed自身的脚本,sed自身语法的一种脚本 #inputfile: 文件,如果不写文件就对标准输入的内容进行处理
sed '' filename #''里面的脚本内容不能省略 #不输入脚本就是读入什么就默认打印什么 --- sed内置了自动打印的功能
-n:关闭sed的自动打印 -e:多点编辑(一次更改多个内容) -r,-E:使用正则表达式 -i.bak 先把文件做个备份然后再改 -s:将多个文件视为单独的文件
sed脚本:由位置(地址)和指令组合而成
空地址
单地址
地址范围
步进
表示对全文进行处理
表示处理指定的行。
#指定的行可以通过数字直接指定,也支持正则表达式匹配。 #写正则表达式的格式:/pattern/
(n,m):表示从n行开始,到m行结束这个范围的内容。
#地址范围也可以使用正则表达式表示: /pat1/,/pat2/ (第一个正则表达式之后到下一个正则表达式中间的内容)
p --- 内容打印 Ip --- 忽略大小写输出 d --- 把模式空间内容删除掉,不再自动打印了 a --- 再某些行后面加内容 i --- 再某些行前面加内容 c --- 替换某一行的内容 w --- file 另存为指定文件 r --- 把一个文件内容读到当前匹配到的行中 = --- 某一行前面添加行号 ! --- 除了某一行的意思 q --- 结束或退出sed #搜索替代 s/pattern/string/修饰符 --- 查找替换,支持使用其它分隔符
#sed基本用法:自动打印 #查看某个文件的文本内容 sed '' dir.sh #打印指定行的内容 sed -n '3p' /etc/passwd #需要使用-n关闭自动打印,因为如果使用了自动打印会输出所有内容,-p:打印匹配到的内容 #打印出包含root的行 sed -n '/root/p' /etc/passwd #打印从第三行到第六行的内容: sed -n '3,6p' /etc/passwd #打印以r开头到以g开头的行的中间那些行 sed -n '/^r/,/^g/p' /etc/passwd #找到了第一个满足条件的范围后不会停止,还会继续往下面找。 #打印奇数行 sed -n '1~2p' /etc/passwd #从1开始,每次步进2
#搜索替代的格式: s/pattern/string/修饰符 #支持使用其它分隔符,可以是其它形式:s@@@,s### s/模式/替代的字符串/修饰符
g --- 行内全局替换 p --- 显示替换成功的行 w --- /PATH/FILE 将替换成功的行保存至文件中 I,i --- 忽略大小写 # &符号:待变前面搜索出来的内容。 相当于一个变量,保存搜索出来的内容
小括号实现分组,后面要表示第几个分组的内容就用 \num(第几个小括号里面的内容) #分组实现把一个文件的一行切成多块,保留其中之一
#sed分组的实现 --- 分组使用的是小括号(直接小括号是扩展正则表达式,不加r参数用的是基本正则表达式) echo abc123xyz | sed -r 's/(abc)(123)(xyz)/\1/' #输出abc 值留下了第一个分组 #搜索替换和& --给前面特定的内容后面加内容 sed -nr 's/r..t/&er/gp' /etc/passwd #给搜索到的内容加上er结尾 #获取分区利用率 #获取指定网卡的ip地址: ifconfig ens33 | sed -nr '2s/.*inet ([0-9.]+) .*/\1/p' #行首一直到inet 中间空格 #一个以上的数字或点 空格 一直到结尾 ifconfig ens33 | sed -rn '2s/(.*inet )([0-9].*)(netmask.*)/\2/p' #行首一直到inet,中间空格 #数字 #取基名和目录名 echo "/etc/netplan/01-netcfg" | sed -nr 's#.*\/([^/]+)#\1#p' #结果为 01-netcfg #从任意字符开始到以斜杠结尾,然后以非斜杠开头的内容 #使用sed将selinux改为disabled sed -r -i.bak '/^SELINUX=/s/(SELINUX=).*/\1disabled/' /etc/selinux/config # 取文件的前缀和后缀 echo a.b.c.tar | sed -nr 's/(.*)\.([^.]+)$/\2/p' #将非#开头的行加# sed -rn 's/^[^#]/#&/p' /etc/fstab 或 #sed -rn 's/^[^#](.*)/#\1/p' /etc/fstab #将#开头的行删除# #sed -ri.bak '/^#/s/^#//' /etc/fstab #删除指定的行 cat /etc/passwd | sed '/tom/d' #删除含有root的行 cat /etc/passwd | sed '4-10d' #删除第四行到第十行的内容
模式空间:pattern space,存放sed需要处理哪一行数据(一个缓冲区) 保持空间:Hold Space,临时存放模式空间中的数据(一个临时空间)
#模式空间内容-->保持空间 小写覆盖,大写追加 h 模式空间的内容覆盖到保持空间 H 模式空间的内容追加到保持空间(内容追加) #保持空间内容--->模式空间 g 保持空间数据覆盖模式空间 G 保持空间内容追加模式空间 #内容互换 x 两者内容互换 #匹配到的下一行内容--->模式空间 n 匹配行的下一行覆盖至模式空间 N 匹配行的下一行追加至模式空间 #删除 d 清空模式空间 D 删除模式空间第一行
#因为sed的脚本使用单引号括起来的,单引号属于强引用。所见即所得。 #例如:打印含有root的行 name=root cat /etc/passwd | sed -nr "/$name/p" #如果里面的内容本来就带双引号的,所以就不能再在外面使用双引号。 解决方法;cat /etc/passwd | sed -nr '/'$name'/p' #再加一个单引号把变量括起来 把'/'和'/p'成对了,变量空出来了 #多点编辑并调用变量 #使用变量的方式修改httpd的配置文件 servername和port cat /etc/httpd/conf/httpd.conf | sed -nr -e 's/^(Listen) 80/\1 '$port'/p' -re "/#ServerName /c ServerName= `hostname`:$port/p" #或者: cat /etc/httpd/conf/httpd.conf | sed -nr -e 's/^(Listen) 80/\1 '$port'/p' -re '/#ServerName /c ServerName= '$(hostname)':'$port'/p' # $(command) #把包含ServerName的这一行替换成: ServerName: 主机名:端口
#sed实现修改默认的网卡名 cat /etc/default/grub | sed -nr 's/^(GRUB_CMDLINE_LINUX=.*)"$/\1 net.ifnames=0"/p' #打印偶数行 seq 10 | sed -n 'n;p' #n:读取到的行的下一行 #比如首先读取到的是第一行,因为有n,所以就以读到的内容的下一行内容覆盖当前读到的内容到模式空间,所以第一次输出2. seq 10 | sed -n '2~2p' #使用步进的方式实现 seq 10 | sed -n '1~2!p' #!表示除了这些行,其他的都打印
读到这里,这篇“Linux sed工具的使用及工作原理是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。