Shell脚本攻略:文本三剑客之sed

目录

一、理论

1.sed

二、实验

1.sed命令的寻址打印

2.显示奇偶

 3.查找替换

4.后向引用

5.截取版本号

 6.替换IP地址


一、理论

1.sed

(1) 概念

sed 英文全称为stream editor流式编辑器,sed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,所以效率很高。 但是, sed 能够管道过滤文本,特别区别于其他类型的编辑器。

sed 可以在命令行或 shel l脚本中使用,以非交互方式编辑文件。 也许最有用的功能是对一个字符串进行 “搜索和替换” 到另一个字符串。

sed最为核心的功能是增删改查。

(2)sed语法格式和工作流程

语法格式:

sed 选项 ’定位 操作符’ 文件路径

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

# 注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才不是0

工作流程:

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在
临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完
成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出,或者使用sed -i选项
-i选项就是将本该输出到屏幕上的内容输出/流入文件中

(3)sed命令的常用选项

表1 sed命令的常用选项

选项功能
-e表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 表示用指定的脚本文件来处理输入的文本文件
-h 显示帮助
-i直接修改目标文本文件 慎用
-i.bak修改文件时会创建备份文件,防止手误
-n仅显示script处理后的结果

(4)sed命令的操作符 

表2 sed命令的操作符 

操作符功能
s///替换,替换指定字符。
d删除,删除选定的行。
aappend增加,在当前行下面增加一行指定内容。
iinsert插入,在选定行上面插入一行指定内容。
c替换,将选定行清除后替换为c后面指定内容。
y字符转换,转换前后的字符长度必须相同。
p打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,
则以 ASCII 码输出。其通常与“-n”选项一起使用。
=打印行号。
l(小写L)打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
r扩展正则表达式

        ①查操作

          根据内容筛选文件信息
          根据行号筛查文件信息

       ② 删除指定内容

表3 删操作

编辑命令含义
1d删除第1行的内容
1,5d删除1行到5行的内容
2,+5d删除第2行以及往下的5行的内容
5,$d删除5到最后一行行
4,6!d除了4-6行,其他的全部删除
/pattern1/d删除每行中匹配到pattern1的行内容
/pattern1/,/pattern2/d删除匹配到pattern1的行直到匹配到pattern2的所有行内容
/pattern1/,/pattern2/!d除了pattern1-pattern2的行,其余的全部删除,反向删除
/pattern1/,10d删除匹配到pattern1的行到10行的所有行内容
/pattern1/!d除了pattern1的行,其余的全部删除,反向删除
 
10,/pattern1/d删除第10行直到匹配到pattern1的所有内容
/^$/d通过^$,来删除空行

         ③ 修改文件信息

             格式:
             行范围 s/旧字符串/新字符串/替换标记  ​

表4 改操作

命令含义
1s/old/new/替换第1行内容old为new
1,10s/old/new/替换1行到10行的内容old为new
1,+5s/old/new/替换1行到6行的内容old为new
/pattern1/s/old/new/替换匹配pattern1的内容old为new
/pattern1/,/pattern2/s/old/new/替换匹配到pattern1的行直到
匹配到pattern2的所有行内容old为new
/pattern1/,/pattern2/s/old/new/替换匹配到pattern1的行直到
匹配到pattern2的所有行内容old为new

                   字母字符进行大小写的替换:

                   1)  将大写全部转换为小写:

                     sed 's/[A-Z]/\l&/g' test1.txt

                   2)把首字母替换成大写

                     sed 's/[a-z]/\u&/' test1.txt

                   3)将小写全部转换为大写(末尾加上了一个g)

                     sed 's/[a-z]/\U&/g' test1.txt

                    替换指定内容

                  后向引用

                 ( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。

                .*表示任意长度字符不管是什么字符

                 's///'查找替换标准格式。

         ④  增加内容

表4 增加操作

命令含义
a行后追加内容 append
i行前追加内容 insert
r读入外部文件,行后追加
w将匹配行写入外部文件

            在当前行下面增加一行指定内容

(5)sed命令的打印功能

       ①查看文件内容

    ② 支持重定向输入

        sed '' < /etc/fstab

    ③ 支持管道符

        cat /etc/passwd |sed ''

    ④ 默认打印方式

       1)  sed有一个默认输出,加上P,会打印两行:

               sed -e 'p' test.txt

       2)-n禁止了默认输出,就只有一行:

               sed -n 'p' test.txt 

(6)sed命令的寻址打印

  方式一:按照行号寻求内容

表3 按照行号寻求内容

命令功能
sed -n '1p' test.txt打印第一行
sed -n '4p' test.txt打印第四行
sed -n '$p' test.txt打印最后一行

  方式二:进行行号范围区间的打印

表4 进行行号范围区间的打印

命令功能
sed -n '1,3p' test.txt打印1-3行
sed -n '5,$p' test.txt打印第五行到最后一行
sed -n '2,+2p' test.txt打印第二行+两行的内容,相当于2,4p
sed -n '3p;5p' test.txt输出第三行和第五行

  方式三:指定间隔打印

表5 指定间隔打印

命令功能
sed -n -e '2p' -e'$p' test.txt打印第二行和最后一行
sed -n -e '2p' -e'3p' test.txt打印第二行和第三行

  方式四:对奇数行和偶数行的打印

n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行:

表6 对奇数行和偶数行的打印

命令功能
sed -n 'n;p' test.txt打印偶数的行
sed -n 'p;n' test.txt 打印奇数的行

(7)文本模式过滤行内容

方式一:对包含的字符串进行过滤打印

表7 对包含的字符串进行过滤打印

命令功能
sed -n '/o/p' test.txt包含o的所有行
sed -n '/th/p' test.txt包含th的所有行

方式二:应用基础正则表达式进行打印

表8 应用基础正则表达式进行打印

命令功能
sed -n  '/^root/p' /etc/passwd以root为开头的所有内容,全文本搜索
sed -n  '/bash$/p' /etc/passwd以bash结尾的所有内容,全文本搜索
sed -n  '4,/bash$/p' /etc/passwd从第四行开始,一直打印到第一个以bash为结尾的所在行

方式三:使用扩展正则表达式进行打印

注意: 
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。

表9 使用扩展正则表达式进行打印

命令功能
sed -r -n  '/(99:){2,}/p' /etc/passwd包含有两个99:的内容所在行
sed -r -n  '/^root|bash$/p' /etc/passwd 包换以root开头,或者以bsah结尾的内容所在行

(8)sed的查找替换使用

格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换

注意:查找内容可使用正则表达式,替换内容不可使用正则表达式

二、实验

1.sed命令的寻址打印

(1)查看文件

(2) 显示默认输出(输出2遍)

sed有一个默认输出,加上P,会打印两行。

    (3) 不显示默认输出

            -n禁止了默认输出,就只有一行

       (4) 打印第二行

       (5) 打印最后一行

       (6) 只显示行号

      (7)  显示行号和每行的内容

          ;表示和    

 (8)  显示1到3行  

           ,表示到

 (9)  显示区间

 

(10)  分开显示

(11)  显示第2-4行

2.显示奇偶

(1)显示奇数(每间隔1个打印一次)

   ~ 步进,1~2,1个间隔

(2)显示偶数(每间隔2个打印一次)

   ~ 步进,0~2,2个间隔

(3)显示奇数行

先跳行next ;输出行

(4)显示偶数行

先输出首行;下一行跳

 3.查找替换

(1)以root为开头的所有内容,全文本搜索

(2)以bash结尾的所有内容,全文本搜索

(3)从第30行开始,一直打印到第一个以bash为结尾的所在行

(4)使用扩展正则表达式进行打印

 包含有两个99:的内容所在行

 包换以root开头,或者以bsah结尾的内容所在行

4.后向引用

(1)取IP地址

(2)反向输出

(3)批量修改扩展名

① 将1行多列内容显示为多行1列

② 将文件后缀名.txt批量 修改为.jpg

③ 批量生成用户

 ④ 备份文件

备份

cp /etc/yum.repos.d/CentOS-Base.repo{,.bak}

还原

 cp /etc/yum.repos.d/CentOS-Base.repo{.bak,}

5.截取版本号(笔试题)

(1)截取每行版本号

(2)脚本截图

 6.替换IP地址

(1)替换IP地址

(2)替换网关

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值