sed文本处理

1.基本概述

sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称*
模式空间pattern space 接着用 sed 命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。
着处理下一行,这样不断重复,直到文件末尾。 文件内容并没有改变,除非你 使用重定向存储输出。 Sed 要用来自
动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2..sed基础语法

第一种形式:stdout | sed [option] "pattern command"
第二种形式: sed [option] "pattern command" file

3..sed常用选项 -i -r

    sed相关示例文件

    [root@web01 opt]# cat file.txt

    I love shell

    I love SHELL

    This is test file

1.sed-n-e选项示例

#取消默认输出

[root@web01 opt]# sed -n '/shell/p' file.txt

I love shell

#编辑多项

[root@web01 opt]# sed -n -e '/shell/p' -e '/SHELL/p' file.txt

I love shell

I love SHELL

2.sed -f 选项示例

#将pattern写入文件中

[root@web01 opt]# cat edit.sed

/shell/p

[root@web01 opt]# sed -n -f edit.sed file.txt

3.sed -r 选项示例

[root@web01 opt]# sed -n '/shell|SHELL/p' file.txt

#扩展正则表达式

[root@web01 opt]# sed -rn '/shell|SHELL/p' file.txt

I love shell

I love SHELL

4.sed -i 选项

[root@manager sed]# sed  -in '/shell/d'  file.txt

3.sed pattern

    sed -n '10p' passwd

    sed -n '10,20p' passwd

    sed -n '1,+5p' passwd

    sed -n '/^root/p' passwd

    sed -n '/^root/,/^ftp/p' passwd

    sed -n '/^\[mysql.*/,/^\[mysqld_safe\]/p' /etc/my.cnf|grep -v "^\[.*"

    sed -n '2,/\/bin\/sync/p' passwd

1) 打印/etc/passwd中第20

sed -n '20p' /etc/passwd

2)打印/etc/passwd中从第8行开始,到第15行结束的内容

    sed -n '8,15p' /etc/passwd

3)打印/etc/passwd中从第8行开始,然后+5行结束的内容

    sed -n '8,+5p' /etc/passwd

4)打印/etc/passwd中开头匹配bin字符串的内容

    sed -n '/^bin/p' /etc/passwd

5)打印/etc/passwd中开头为root的行开始,到开头为ftp的行结束的内容

    sed -n '/^root/,/^ftp/p' /etc/passwd

6)打印/etc/passwd中第8行开始,到含有/sbin/nologin的内容的行结束内容

    sed -n '8,/\/sbin\/nologin/p' /etc/passwd

4.sed追加命令

[root@manager sed]# sed -i '/^root/i server {\n\tlisten 80;\n\tserver_name oldxu.com;\n\tindex index.html;\n\troot /code;\n}' passwd

server {

    listen 80;

    server_name oldxu.com;

    index index.html;

    root /code;

}

本章练习示例:

1) passwd文件第10行后面追加“Add Line”

    sed -i '10a "Add Line"' passwd

2passwd文件第10行到第20行,没一行后面都追加 "Test Line"

sed -i '10,20a "Test Line"' passwd

3passwd文件匹配到/bin/bash的行后面追加 "Insert Line"

    sed -i '/\/bin\/bash/a "Insert Line"' passwd

4passwd文件匹配到以bin开头的行,在匹配的行前追加 "Add Line Before"

    sed -i '/^bin/i "Add Line Before"' passwd

5passwd文件每一行前面都追加 "Insert Line Before"

    sed -i 'i "Insert Line Before"' passwd

6)将/etc/fstab文件的内容追加到passwd文件的第10行后面

    sed -i '10r /etc/fstab' passwd

7)将/etc/inittab文件内容追加到passwd文件匹配/bin/sync行的后面

    sed -i '/\/bin\/sync/r /etc/inittab' passwd

8)将/etc/hosts文件内容追加到passwd文件中10行的后面

    sed -i '10r /etc/hosts' passwd

9)将passwd文件匹配到/bin/bash的行追加到/tmp/sed.txt文件中

    sed -i '/\/bin\/bash/w /tmp/sed.txt' passwd

10)将passwd文件丛第10行开始,到匹配到nfsnobody开头的所有行内容追加到/tmp/sed-1.txt

    sed -i '10,/^nfsnobody/w /tmp/sed-1.txt' passwd

5.sed删除命令

本章练习示例:

1)删除passwd中的第15

sed -i '15d' passwd

2)删除passwd中的第8行到第14行的所有内容

sed -i '8,14d' passwd

3)删除passwd中以/sbin/nologin结尾的行

    sed -i '/\/sbin\/nologin$/d' passwd

4)删除passwd中以bin开头的行,到以ntp开头的行的所有内容

    sed -i '/^bin/,/^ntp/d' passwd

5)删除passwd中第3行到以ftp开头的所有行内容

    sed '3,/^ftp/d' passwd

6)典型需求:删除Nginx配置文件中所有的注释以及空行

    sed -ri '/^#|^$| #/d' nginx.conf

6.sed修改命令 s///g <--替换 c 修改

sed '/^SELINUX=/c SELINUX=disabled'

1.修改passwd文件第1行中第一个rootROOT

    sed -i  '1s/root/ROOT/' passwd

2.修改passwd文件中第5行到第10行中所有的/sbin/nologin/bin/bash

    sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/' passwd

   sed -i '5,10s#/sbin/nologin#/bin/bash#' passwd

3.修改passwd文件中匹配到/sbin/nologin的行,将匹配到行中的login

为该大写的LOGIN

    sed -i '/\/sbin\/nologin/s#login#LOGIN#g' passwd

    sed -i '/\/sbin\/nologin/s/login/LOGIN#g' passwd

4.修改passwd文件中从匹配到以root开头的行,到匹配到以bin开头行,修改binBIN

sed -i '/^root/,/^bin/s/bin/BIN/g' passwd

5.修改SELINUX=enforcing修改为SELINUX=disabled。(可以使用c替换方式)

sed -i '/^SELINUX=/c SELINUX=disabled' selinux

6.nginx.conf配置文件添加注释。 ^ $

sed -i 's/^/# /' nginx.conf

7.使用sed提取eth0网卡的IP地址

    ifconfig eth0 | sed -rn '2s/^.*et //p' | sed -rn 's/ ne.*//p'

    ifconfig eth0 |sed -nr '2s/(^.*et) (.*) (net.*)/\2/p'

7.sed脚本练习

需求描述:处理一个类似MySQL配置文件的my.cnf文件。

​ 1.输文件中有几个段,一对 [ ] 为一段。
​ 2.针对每个段配置文件参数,统计总个数。

[root@web01 opt]# sh example.sh

    1: client 2

    2: server 12

    3: mysqld 12

    4: mysqld_safe 7

    5: embedded 8

    6: mysqld-5.5 10

1.打印每段的内容

    sed -n -e '/^\[.*\]/p' sed.txt | sed 's/\[//' | sed 's/\]//'

2.统计每段参数的总参个数

    sed -n '/^\[server\]/,/^\[.*\]/p' sed.txt | sed -r '/^\[|^#|^$/d'|wc -l

脚本为

[root@web01 sed]# cat sed.sh

#!/bin/bash

#Author:               rzq

#QQ:                  0123456789

#Date:                2019-11-06

#FileName:            sed.sh

#URL:                 https://www.jianshu.com

#Description:         The test script

#Copyright (C):      2019 All rights reserved

 

HS () {

 

    num=$(sed -n '/^\[.*]/p' kl.txt|sed 's/\[//'|sed 's/\]//')

 

}

 

GS () {

 

gs=$(sed -n '/^\['$i']/,/^\[.*]/p' kl.txt|sed -r '/^\[|^#|^$/d'|wc -l)

 

}

 

HS

b=0

for i in $num

do

    let b++

    GS

    echo "$b  $i  $gs"

done

 

需求描述: 处理一个ansibleinvtory主机清单。

​ 1.输出主机组,一对 [ ] 为一个主机组。
​ 2.输出每个主机组下的主机总个数。

[root@web01 opt]# sh example.sh

    1: web01: 有 2  台主机

    2: web02: 有 12 台主机

[root@web01 sed]# cat ansible.sh

#!/bin/bash

#Author:               rzq

#QQ:                  0123456789

#Date:                2019-11-07

#FileName:            ansible.sh

#URL:                 https://www.jianshu.com

#Description:         The test script

#Copyright (C):      2019 All rights reserved

 

fu () {

    FW=$(sed -n '/^\[.*]/p' lp.txt|sed  's/\[//' | sed 's/\]//')

}

 

ip () {

    IP=$(sed -n '/^\['$i'/,/^\[.*]/p' lp.txt|sed -r '/^\[|^$/d'|wc -l)

}

 

fu

num=0

for i in $FW

do 

    let num++

    ip

    echo "$num $i $IP"

done


sed

    两种语法:

        sed options '/pattern1/command' file

 

1、选项options:

    -i      直接变更文件

    -r      支持扩展正则表达式

    -f      将处理命令写入文件中,然后进行调用

    -e      可以多项编辑操作

    -n      取消默认文本的输出

 

2.模式匹配

    字符串匹配

    正则表达式匹配

    从哪里-> 到哪里     '/pattern1/,/pattern2/'

 

3.命令command

   

        a           #在匹配的行后添加

        i           #在匹配的行前添加

        r           #读取某个文件的内容,添加至/pattern1/行的后面

        w           #将文件的内容写入到某个文件中。  >

   

        d           #对匹配的内容进行删除,但需要配合-i选项才能操作文件。

   

        s///        #替换,将什么替换成什么,需要配合-i选项才能操作文件

        s///g       #替换,全局替换(替换一个行中所有满足条件的内容)

        c           #修改,可以使用正则表达式匹配,然后修改  需要配合-i选项才能操作文件

   

        p           #打印输出的效果。默认的动作,必须要添加。通常配合-n一起使用

 

__EOF__

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值