sed命令详解+示例(1),开发8年的老Linux运维才知道

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改。若希望直接修改文件内容,应添加选项 -i 。为了避免生产环境中因误操作导致系统故障,使用时要谨慎。

sed 主要用来编辑一个或多个文件,简化对文件的反复操作(如:输出、删除、替换、复制、剪切、导入、导出等各种操作)或者用来编写转换程序等。

二、语法格式

格式1:前置命令 | sed  [选项]   '[定址符]处理动作’  [input-file]

格式2:sed [选项]   '[定址符]处理动作’文件  [input-file]

其中:处理动作可以由-e指定多个处理动作,input-file为输入文件,可指定多个。

三、语法说明

1、选项说明

-i:直接修改文件内容,而不是输出到终端。

-n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来。
-e :指定sed动作,可以由多个-e指定多个动作。

-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项

-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename 内的sed动作;

--help:显示帮助。

--version:显示版本。

-{}:可组合多个命令,以分号分隔

2、动作说明

[n1[,n2]] function 

其中[n1[,n2]]称为定址符,用来定义需要操作的文本,如指定处理的起、止行数。

n1, n2 不见得会存在,一般代表“选择进行动作的行数”,举例来说,如果我的动作是需要在 10 到 20 行之间进行,则写作“10,20动作行为”。

地址可表示为文本的“行号”,或者用来匹配的“/正则表达式/

省略定址符时,默认逐行处理全部文本。

fuction为编辑指令,可以为增删改查等指令

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何内容;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,通常这个s的动作可以搭配正规表示法!例如 1,20s/old/new/g。

四、典型示例

基本的处理动作

操作符用途指令示例解释
p打印行(print)2,4p输出第2-4行
2p,4p输出第2行、第4行
d删除行(delete)2,4d删除第2-4行
s字符串替换(substitution)s/old/new/将每行的第1 个old替换为new
s/old/new/3将每行的第3 个old替换为new
s/old/new/g将所有的old都替换为new

替换担任的分隔“/”,可改用其他字符,如#、&等,便于修改文件路径

示例:把/bin/bash替换为/sbin/sh (/etc/passwd)

# sed “s//bin/bash//sbin/sh/” /etc/passwd   也可写成

# sed “s#/bin/bash#/sbin/sh#” /etc/passwd

sed “s9\98\97\99\984\9\98\99g” 文件 :将98979---》9849989

在这里9是特殊符号,加\屏蔽特殊含义

sed文本块处理

操作符用途指令示例指令解析
i insert行前插入文本sed “2iYY” file在第2行之前添加文本行“YY”
sed “4,7iYY” file在第4~7行的第一行前添加文本行“YY”
a append行后插入文本sed “2aYY” file在第2行之后添加文本
sed “/^XX/aYY” file在以XX开头的行之后添加文本
c change替换当前行sed “2cYY” file将第2 行的内容修改为“YY”
在匹配行后面追加字符串sed “/string/s/.*/&ttt/” file

处理多行文本:修改后的文本有多行时,以换行符\n分隔,或使用\强制换行

示例:修改主机名配置文件

1)确认修改前的配置 # cat /etc/sysconfig/network

2)使用sed修改主机名配置所在行的内容(c整行替换)

# sed  ‘/^HOSTNAME/cHOSTNAME=mysvr.tarena.com’ /etc/sysconfig/network

示例:修改hosts文件,添加新的记录

1)确认修改前的配置 # cat /etc/hosts

2)使用sed修改hosts文件,添加两行新纪录(a追加)

# sed  -i  '$a192.168.4.5  svr5.tarena.com svr5\

119.75.217.56  www.baidu.com’ /etc/hosts

常见处理操作示例

操作示例含义解析
输出文本sed ‘1p’ a.txt   或 sed -n ‘p’ a.txt输出所有行,等同于cat a.txt
sed -n ‘1p’ a.txt输出第1行
sed -n ‘4p’ a.txt输出第4行
sed -n ‘$p’ a.txt输出最后一行
sed -n ‘5,$p’ a.txt从第5行输出到最后一行
sed -n ‘4,7p’ a.txt输出第4~7行
sed -n ‘4,+10p’ a.txt输出第4行及其后的10行内容,共11行
sed -n ‘2p**;5p;7p’ a.txt sed -n '{2p;5p;**7p}’ a.txt输出第2,5,7行       用分号来隔离多个操作(如果有定址条件,则应该使用{ }括起来)
sed -n ‘/a/p’ a.txt
sed -n ‘/A/p’ a.txt
sed -n ‘/^id/p’ a.txt列出以id开头的行:
sed -n ‘/a/p;/r/p’ a.txt
sed -n ‘/local$/p’ a.txt输出以local结尾的行
sed -n ‘p;n’ a.txt输出奇数行,n表示读入下一行文本(隔行)next
sed -n ‘n;p’ a.txt输出偶数行,n表示读入下一行文本(隔行)
sed -n ‘$=’ a.txt输出文件的行数,     wc -l返回行数及文件名
删除文本sed -i   ‘d’ a.txt删除所有
sed -i   ‘$d’ a.txt删除文件的最后一行
sed -i   ‘/^$/d’ a.txt删除所有空行
sed -i   ‘1d’ a.txt删除第1行
sed -i   ‘2,5d’ a.txt删除第2~5行
sed -i “ v a r 1 , {var1}, var1,{var2}d” filename # 这里引号必须为双引号删除shell变量表示的行号(配合for等语句使用)
sed -i   ‘5d;7d;9d’ a.txt删除第5、7、9行
sed -i  ‘/init/d;/bin/d’ a.txt删除所有包含“init”及“bin”的行
sed -i   ‘/[0-9]/d’ a.txt
sed -i   ‘/^#/d’ a.txt
sed -i   ‘/^s/d’ a.txt
sed -i  ‘/^s/d’ a.txt直接删除
sed -i   ‘/^install/d’ a.txt删除以install开头的行
sed  -i  ‘/xml/d’ a.txt删除所有包含xml的行,只作输出,不更改原文件,若需要更改,应添加选项-i
sed -i   ‘/xml/!d’ a.txt等效于 sed -n ‘/xml/p’ a.txt删除不包含xml的行,!符号表示取反
替换文本sed ‘s/xml/XML/’ a.txt将每行中第1个xml替换为XML
sed ‘4s/xml/XML/’ a.txt将第4行中的xml替换为XML
sed ‘s/xml/XML/3’ a.txt将每行中第3个xml替换为XML,只作输出,不更改原文件(若需要更改,应添加选项-i)
sed ‘2s/xml/XML/3’ a.txt将第2行中第3个xml替换为XML,只作输出,不更改原文件(若需要更改,应添加选项-i)
sed ‘s/xml/XML/g’ a.txt将所有的xml都替换为XML
sed ‘s/xml//g’ a.txt将所有的xml都删除(替换为空串)
sed ‘s/doc/&s/g’ a.txt将所有的doc都替换为docs,&代表查找串
sed -i ‘4,7s/^/#/’ a.txt将第4~7行注释掉**(行首加#号)**
sed  -i ‘3,5s/^#//’ a.txt解除文件第3~5行的注释**(去掉开头的 # )**
sed ‘s/**^#**an/an/’ a.txt解除以#an开头的行的注释(去除行首的#号)
sed ‘s/xml|XML|e//g’ a.txt删除所有的“xml”、所有的“XML”、所有的字母e,或者的关系用转义方式 | 来表示

五、综合运用

1)删除文件中每行的第二个、最后一个字符

分两次替换操作,第一次替换掉第2个字符,第二次替换掉最后一个字符:

# sed ‘s/.//2;s/.$//’ nssw.txt

2)将文件中每行的第一个、第二个字符互换

每行文本拆分为“第1个字符”、“第2个字符”、“剩下的所有字符”三个部分,然后通过替换操作重排顺序为“2-1-3”:# sed -r ‘s/^(.)(.)(.*)/\2\1\3/’ nssw.txt

3)将第一个字符与最后一字符对调:sed -r “s/^(.)( .*)(.)$/\3\2\1/” nssw.txt

将第一个字符与最后一字符对调:sed -r “s/^(.)(.)(.*)(.)(.)$/\1\4\3\2\5/” nssw.txt

4)删除文件中所有的数字、行首的空格

因原文件内没有数字,行首也没有空格,这里稍作做一点处理,生成一个新测试文件:

# sed ‘s/o/o7/;s/l/l4/;3,5s/^/  /’ nssw.txt > nssw2.txt

# cat nssw2.txt

以nssw2.txt文件为例,删除所有数字、行首空格的操作如下:

# sed -r ‘s/[0-9]//g;s/^( )+//’ nssw2.txt

5)为文件中每个大写字母添加括号:

# sed ‘s/[A-Z]/(&)/g’ nssw.txt        //使用“&”可调用s替换操作中的整个查找串

或者 # sed -r “s/([A-Z])/(\1)/g”  nssw.txt

示例:修改默认运行级别

# sed -i ‘/^id:/s/3/5/’ /etc/inittab            //将默认运行级别修改为5

# grep “^id:” /etc/inittab                      //确认修改结果

示例:修改IP地址(网段):修改IP地址的网段部分,主机地址不变。

直接修改网卡eth0的配置文件,检查原有的配置内容:

# cat /etc/sysconfig/network-scripts/ifcfg-eth0

IPADDR=192.168.4.4

若希望将IP地址192.168.4.4修改为172.16.16.4,则应该定位到“IPADDR”所在的行,执行相应的替换(仅测试,尚未修改):

# sed ‘/^IPADDR/s/192.168.4.4/172.16.16.4/’ \

/etc/sysconfig/network-scripts/ifcfg-eth0 | grep “^IPADDR”

要求只修改网段地址时,可以利用扩展正则表达式的 \1、\2、……等调用,分别对应此前第1个、第2个、…… 以 ()包围的表达式所匹配的内容。

所以上述操作可以改为如下(启用扩展匹配应添加 -r 选项):

# sed -r -i ‘/^IPADDR/s/192.168.4.(.*)/172.16.16.\1/’ \

/etc/sysconfig/network-scripts/ifcfg-eth0

确认修改结果:# grep “^IPADDR” /etc/sysconfig/network-scripts/ifcfg-eth0

示例:调整httpd服务配置,更改网站根目录

由于需要替换的字符串中有 / ,为了避免与sed替换操作的分隔混淆,可以使用其他字符作为替换分隔,比如可改用“s#old#new#”的方式实现替换:

# sed -i ‘s#/var/www/html#/opt/wwwroot#’ \

/etc/httpd/conf/httpd.conf

# grep “^DocumentRoot” /etc/httpd/conf/httpd.conf

DocumentRoot “/opt/wwwroot”

示例:修改/etc/hosts  :sed -i ‘1a 1.1.1.1 域名’ /etc/hosts

示例:装配匿名FTP服务

通过yum安装vsftpd软件包;修改vsftpd服务配置,开启匿名上传;调整/var/ftp/pub目录权限,允许ftp写入;启动vsftpd服务,并设置开机自运行

1)任务需求及思路分析

vsftpd服务的安装、改目录权限、起服务等操作可以直接写在脚本中。

修改vsftpd.conf配置的工作可以使用sed命令,根据默认配置,只需要定位到以#anon开头的行,去掉开头的注释即可。

2)根据实现思路编写脚本文件

#!/bin/bash

yum -y install vsftpd                             //安装vsftpd软件

cp /etc/vsftpd/vsftpd.conf{,.bak}                  //备份默认的配置文件

sed -i “/#anon/s/#//” /etc/vsftpd/vsftpd.conf      //修改服务配置

chown ftp /var/ftp/pub                              //调整目录权限

/etc/init.d/vsftpd restart                          //启动服务

chkconfig vsftpd on                                  //设为自动运行

# chmod +x anonftp.sh

3)验证、测试脚本

运行脚本anonftp.sh:

# ./anonftp.sh

使用ftp登录服务,测试是否可以上传:

# ftp localhost                          //本机访问测试

……

Name (localhost:root): ftp                          //匿名登录

……

ftp> cd pub                                          //切换到 pub/ 目录

……

ftp> put install.log                   //上传当前目录下的install.log 文件

……

ftp> quit                                          //断开FTP连接

查看/var/ftp/pub新上传的文件:# ls -lh /var/ftp/pub/

示例:clone-vm7脚本

#!/bin/bash

# exit code:

#    65 -> user input nothing

#    66 -> user input is not a number

#    67 -> user input out of range

#    68 -> vm disk image exists

IMG_DIR=/var/lib/libvirt/images

BASEVM=rh7_template

ROOM=sed  -n "1p" /etc/hostname |  sed -r 's/(room)([0-9]{1,})(.\*)/\2/'

if [ $ROOM -le 9 ];then

ROOM=0$ROOM

fi

IP=sed  -n "1p" /etc/hostname |   sed -r 's/(.\*)([0-9]+)(.\*)/\2/'

read -p "Enter VM number: " VMNUM

if [ $VMNUM -le 9 ];then

VMNUM=0$VMNUM

fi

if [ -z “${VMNUM}” ]; then

echo “You must input a number.”

exit 65

elif [  ( e c h o   (echo  (echo {VMNUM}*1 | bc) = 0 ]; then

echo “You must input a number.”

exit 66

elif [  V M N U M   − l t   1   − o   {VMNUM} -lt 1 -o  VMNUM lt 1 o {VMNUM} -gt 99 ]; then

echo “Input out of range”

exit 67

fi

NEWVM=rh7_node${VMNUM}

if [ -e  I M G _ D I R / IMG\_DIR/ IMG_DIR/{NEWVM}.img ]; then

echo “File exists.”

exit 68

fi

echo -en “Creating Virtual Machine disk image…\t”

qemu-img create -f qcow2 -b  I M G _ D I R / . IMG\_DIR/. IMG_DIR/.{BASEVM}.img  I M G _ D I R / IMG\_DIR/ IMG_DIR/{NEWVM}.img &> /dev/null

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-eawW94Yf-1713401589700)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值