sed命令详解+示例,Linux运维面试知识点

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

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

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

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

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

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

正文

以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

echo -e “\e[32;1m[OK]\e[0m”

#virsh dumpxml ${BASEVM} > /tmp/myvm.xml

cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml

sed -i “/ B A S E V M / s / {BASEVM}/s/ BASEVM/s/{BASEVM}/${NEWVM}/” /tmp/myvm.xml

sed -i “/uuid/s/.*</uuid>/$(uuidgen)</uuid>/” /tmp/myvm.xml

sed -i “/ B A S E V M i ˙ m g / s / {BASEVM}\.img/s/ BASEVMi˙mg/s/{BASEVM}/${NEWVM}/” /tmp/myvm.xml

sed -i “/mac /s/a1/${ROOM}/” /tmp/myvm.xml

sed -i “/mac /s/a2/${IP}/” /tmp/myvm.xml

sed -i “/mac /s/a3/${VMNUM}/” /tmp/myvm.xml

sed -i “/mac /s/b1/${ROOM}/” /tmp/myvm.xml

sed -i “/mac /s/b2/${IP}/” /tmp/myvm.xml

sed -i “/mac /s/b3/${VMNUM}/” /tmp/myvm.xml

sed -i “/mac /s/c1/${ROOM}/” /tmp/myvm.xml

sed -i “/mac /s/c2/${IP}/” /tmp/myvm.xml

sed -i “/mac /s/c3/${VMNUM}/” /tmp/myvm.xml

sed -i “/mac /s/d1/${ROOM}/” /tmp/myvm.xml

sed -i “/mac /s/d2/${IP}/” /tmp/myvm.xml

sed -i “/mac /s/d3/${VMNUM}/” /tmp/myvm.xml

echo -en “Defining new virtual machine…\t\t”

virsh define /tmp/myvm.xml &> /dev/null

echo -e “\e[32;1m[OK]\e[0m”

文件导入导出操作

基本动作:r动作应结合-i选项才会存入,否则只输出

W动作以覆盖的方式另存为新文件

操作符用途指令示例指令解析
r读取文件3r b.txt在第3行下方插入文件b.txt
4,7r b.txt在第4~7每一行后插入文件b.txt
w保存到文件3w c.txt将第3行另存为文件c.txt
4,7w c.txt将第4~7行另存为文件c.txt

sed -n ‘/^XX/w d.txt’ reg.txt 与sed -n ‘/^XX/p d.txt’ reg.txt > d.txt操作效果相同

sed复制剪切

模式空间:存放当前处理的行,将处理结果输出

若当前行不符合处理条件,则原样输出

处理完当前行再读入下一行来处理

保持空间:作用类似于“剪贴板”

默认存放一个空行(换行符\n)

基本动作:

复制:H:模式空间—[追加]—>保持空间

h:模式空间—[覆盖]—>保持空间

粘贴:G:保持空间—[追加]—>模式空间

g:保持空间—[覆盖]—>模式空间

示例:把第1-3行复制到文件末尾:sed ‘1,3H;$G’a.txt

改用’1h;2,3H;$G’可避免出现空行  (出现空行的原因是保持空间内默认已有一个空行)

示例:把第2行复制第4行:# sed ‘2H;4G’ a.txt 追加出现空行

# sed ‘2h;4G’ a.txt 不要空行

示例:把第1行剪切到文件末尾:sed ‘1h,1d;$G’a.txt

把第1-2行剪切到文件末尾:sed ‘1h;2H;1,2d;$G’a.txt

sed流控制

!取反操作 ——根据定址条件取反

示例:把/etc/passwd中能登录的用户及其密码(/etc/shadow)提取出来

找到使用bash作登录Shell的本地用户;列出这些用户的shadow密码记录

按每行“用户名 --> 密码记录”保存到getupwd.log

基本思路如下:

1.先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量

2.再结合while循环遍历取得的账号记录,逐行进行处理

3.针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串

4.按照指定格式追加到/tmp/getuupwd.log文件

5.结束循环后删除临时文件,报告分析结果

示例:列出不使用bash的用户帐号记录

# sed -n ‘/bash$/!p’ /etc/passwd

# sed -n ‘/bash$/s/:.*//p’ /etc/passwd

# sed -n ‘/:/bin/bash$/w /tmp/urec.tmp’ /etc/passwd

方法一:

#/bin/bash

/tmp/getupwd.log                                     ## 创建空文件

sed -n ‘/:/bin/bash$/w /tmp/urec.tmp’ /etc/passwd   ## 提取符合条件的账号记录

UNUM=$(egrep -c ‘.’ /tmp/urec.tmp)                   ## 取得记录个数

while [  i : = 1   − l e   {i:=1} -le  i:=1 le UNUM ]                     ## 从第1行开始,遍历账号记录

do

UREC= ( s e d   − n   " (sed -n " (sed n "{i}p" /tmp/urec.tmp)              ## 取指定行数的记录

NAME=${UREC%%😗}                                 ## 截取用户名(记录去尾)

PREC=KaTeX parse error: Expected group after '^' at position 11: (sed -n "/^̲NAME:/p" /etc/shadow)      ## 查找与用户名对应的密码记录

PASS=${PREC#*:}                                  ## 掐头

PASS=${PASS%%😗}                                ## 去尾,只留下密码记录

echo “ N A M E   − − >   NAME -->  NAME > PASS” >> /tmp/getupwd.log         ## 保存结果

let i++                                           ## 自增1,转下一次循环

done

/bin/rm -rf /tmp/urec.tmp                           ## 删除临时文件

echo “用户分析完毕,请查阅文件 /tmp/getupwd.log”         ## 完成后提示

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

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

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

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

echo “用户分析完毕,请查阅文件 /tmp/getupwd.log”         ## 完成后提示

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

[外链图片转存中…(img-d7W3qaGI-1713401646236)]

给大家整理的电子书资料:

[外链图片转存中…(img-acvEFtew-1713401646237)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

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

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

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

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linuxsed命令是一个用于文本处理的强大工具。它可以根据指定的编辑命令对输入文件进行操作,并输出结果。sed命令的基本语法如下: sed [选项] sed编辑命令 输入文件 其中,选项是可选的,用于控制sed命令的行为。sed编辑命令是指对文本进行操作的具体命令,可以是单个命令,也可以是多个命令组合在一起。输入文件是要进行处理的文本文件。 sed命令还支持通过管道将shell命令的输出作为输入进行处理,具体语法如下: shell命令 | sed [选项] sed编辑命令 此外,sed命令还可以通过-f选项指定一个sed脚本文件来进行处理,具体语法如下: sed [选项] -f sed脚本文件 输入文件 在使用sed命令时,还可以通过使用一些小技巧来实现特定的功能。例如,可以使用命令连接符";"来输出多行不连续的内容。例如,以下命令会输出passwd文件中的第1行、第3行和第5行: sed -n '1p;3p;5p' passwd 这样,你就能够根据需要使用sed命令来处理文本文件,并实现各种需要的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Linux篇】sed命令详解](https://blog.csdn.net/weixin_45842494/article/details/124699219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux - sed命令详解](https://blog.csdn.net/qq_48391148/article/details/125711532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值