linux cat命令详解_干货 | 名企高频考点Linux命令之sed详解

e1b8b1d69e9acad7f2cdea3fb4d46bbe.png

点击蓝字关注我哦

27985f7c7fe7bc916f82ae96340c8c25.png 以下是本期干货视频 视频后还附有文字版本哦 c818d698da1379b46cbbb74e0b44d563.png 6e6f8754d82237b8bea2b755ccbadc70.png ▼ 《名企高频考点-Linux命令之sed详解》 ▼ ps:请在WiFi环境下打开,如果有钱任性请随意 3c7b805b908ecb52e834364b5cd4ffee.png

1、sed详解

3c7b805b908ecb52e834364b5cd4ffee.png sed是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出。 sed的工作方式 逐行读取文件内容存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。原文件内容并没有改变。 语法格式
sed   [option]   "pattern command"   file
高频选项 选项可以用来控制sed的处理流程 。 

6360e3523cba9eb347576ea4c8fbf9f8.png

本文中所有测试都用如下内容:
[root@localhost ~]# cat passwd root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:ROOT:/sbin:/sbin/nologinadm:x:3:4:Root:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:
测试-n,只显示匹配的行:
[root@localhost ~]# sed -n '/root/p' passwd root:x:0:0:root:/root:/bin/bash
测试-e,多个匹配条件:
[root@localhost ~]# sed -n -e '/root/p' -e '/ROOT/p' passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:ROOT:/sbin:/sbin/nologin
测试-f,执行指定文件:
[root@localhost ~]# cat my.sed /root/p/Root/p[root@localhost ~]# sed -n -f my.sed passwdroot:x:0:0:root:/root:/bin/bashadm:x:3:4:Root:/var/adm:/sbin/nologin
测试-r,支持扩展正则:
[root@localhost ~]# sed -n -r '/root|ROOT/p' passwd # |是扩展正则root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:ROOT:/sbin:/sbin/nologin
前面的修改都是显示到屏幕,不会修改源文件,我们现在用-i,修改源文件:
[root@localhost ~]# sed -i 's/bin/BBB/g' passwd[root@localhost ~]# cat passwdroot:x:0:0:root:/root:/BBB/bashBBB:x:1:1:BBB:/BBB:/sBBB/nologindaemon:x:2:2:ROOT:/sBBB:/sBBB/nologinadm:x:3:4:Root:/var/adm:/sBBB/nologinlp:x:4:7:lp:/var/spool/lpd:
3c7b805b908ecb52e834364b5cd4ffee.png

2、pattern详解

3c7b805b908ecb52e834364b5cd4ffee.png sed是逐行处理文本,拿到一行内容,先进行匹配,如果满足,才执行命令,如果匹配不上,是不会对该行进行处理。

8384913d5e8b03c282523c68dd774554.png

这里面第4种和第5种是我们实际工作中用的最多的,当然,一般这里都是很复杂的正则,这里我就以这两种来演示。 打印所有不能登录的用户:
[root@localhost ~]# sed -n '/\/sbin\/nologin/p' passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:ROOT:/sbin:/sbin/nologinadm:x:3:4:Root:/var/adm:/sbin/nologin
寻找以bin开始到以adm结束的行:
[root@localhost ~]# sed -n '/^bin/,/^adm/p' passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:ROOT:/sbin:/sbin/nologinadm:x:3:4:Root:/var/adm:/sbin/nologin
3c7b805b908ecb52e834364b5cd4ffee.png

3、编辑命令详解

3c7b805b908ecb52e834364b5cd4ffee.png

c866e5df72a0820ace1d0e915ef9bf9b.png

下面我们来演示上面的编辑命令。 删除所有不能登录的用户:
[root@localhost ~]# sed -i '/\/sbin\/nologin/d' passwd[root@localhost ~]# cat passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:
我们经常有一种需求,删除配置文件中的注释行和空行,注释行一般都是以#开头,命令如下:
sed -e '/[:blank:]*#/d' -e'/^$/d' /etc/my.cnf
在root用户后增加一行AAAAAAAAA:
[root@localhost ~]# sed '/^root/a AAAAAAAAA' passwdroot:x:0:0:root:/root:/bin/bashAAAAAAAAAbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:ROOT:/sbin:/sbin/nologinadm:x:3:4:Root:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:
将所有的root不区分大小写,全部替换成“管理员”:
[root@localhost ~]# sed 's/root/管理员/ig' passwd管理员:x:0:0:管理员:/管理员:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:管理员:/sbin:/sbin/nologinadm:x:3:4:管理员:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:
&用在替换字符串时,代表被替换的字符串。 我们想把所有的root,不论大小写,都改成原本的root后面追加上ing:
[root@localhost ~]# sed 's/root/&ing/ig' passwdrooting:x:0:0:rooting:/rooting:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:ROOTing:/sbin:/sbin/nologinadm:x:3:4:Rooting:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:
另外需要注意的是,如果匹配模式中使用了变量,建议用双引号。
OLD=rootNEW=123sed  "s/$OLD/$NEW/g" passwd
3c7b805b908ecb52e834364b5cd4ffee.png

4、综合实践

3c7b805b908ecb52e834364b5cd4ffee.png 实际项目基本都有配置文件,我们现在利用sed统计配置文件各个段有多少条记录。 测试文件内容如下:
[Log]#日志文件输出目录和文件名LogName=error.log#只打印日志等级<=LogLevel的日志到日志文件中LogLevel=8#进程相关[Proc]#worker进程个数WorkerProcesses=4#是否按守护进程方式运行Daemon=1#处理接收到的消息的线程池中线程数量,不建议超过300ProcMsgRecvWorkThreadCount=2[Net]#监听的端口数量ListenPortCount=2ListenPort0=80ListenPort1=443#每个worker进程允许的最大连接数worker_connections=1024#延迟回收的等待时间Sock_RecyConnectionWaitTime=80
我们的思路是:找出[]的行,查找出段。 根据给出的段名,找出该段的所有信息,然后过滤掉注释和空行
CONF_FILE_NAME=ngx.confget_segments() { # 这个函数的功能是找出以[开头,]结尾的行,通过echo返回出去。    # 取出[]的行,然后将删除[]  echo `sed -n '/\[.*\]/p' $CONF_FILE_NAME | sed -e 's/\[//' -e 's/\]//'`}get_count_in_segment() { # 这个函数根据段名统计当前段的配置项的数量  #  $1 是传递过来的段名  #  把从给定的段到下一个段之间的数据过滤出来。  #  将过滤出来的数据清除掉空行和注释行  items=`sed -n "/\[$1\]/,/\[.*\]/p" $CONF_FILE_NAME  | sed -e '/^#/d' -e '/^$/d' -e '/\[.*\]/d'`    # 统计数量  i=0  for item in $items  do    i=`expr $i + 1`  done  echo $i}num=0for seg in `get_segments` # get_segments得到所有的段do  num=`expr $num + 1` #有多少个段  cnt=`get_count_in_segment $seg` #统计当前段的配置项数量  echo "$num $seg : $cnt"done
执行结果:
[root@localhost ~]# ./my.sh 1 Log : 22 Proc : 33 Net : 5
3c7b805b908ecb52e834364b5cd4ffee.png

5、总结

3c7b805b908ecb52e834364b5cd4ffee.png sed主要用于文本行的处理。这里需要重点强调一下,sed中选项和命令不一样哦,大家可以回过去对比一下。

37c62f1ae6f446eb69d811f012ff1f93.png

作者:李涛 审稿:王海斌 编辑:啊琛琛

859bdef2fd3037466e90e284bf29d4da.png

好看,就要点个"在看"

8e3b6e9026cc150c0eeecb7ee9485ff1.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值