zoukankan      html  css  js  c++  java
  • linux基础学习-17.1-sed介绍及增删改查

    一、sed基础

    1、sed简介

    sed是stream editor(字符流编辑器)的缩写,简称流编辑器。什么是流呢?大家可以想象一下流水线,sed就像一个车间一样,文件中的每行字符都是原料,运到sed车间,然后经过一系列的加工处理,最后从流水线下来就变成货物了

    2、sed功能

    sed命令是操作、过滤和转换文本内容的强大工具。常用功能有增删改查(增加、删除、修改、查询),其中查询的功能中最常用的两大功能是过滤(过滤指定字符串),取行(取出指定行)

    我们现在准备学习的sed版本是GNU开源版本的,我的实验环境是Centos6.7系统,内核版本是 2.6.32-573.el6.x86_64

    [root@oldboy ~]# cat /etc/redhat-release

    CentOS release 6.7 (Final)

    [root@oldboy ~]# uname -r

    2.6.32-573.el6.x86_64

    [root@oldboy ~]# sed --version

    GNU sed version 4.2.1

    3、语法格式

    sed [option] '[sed-commands]' [input-file]

    sed [选项] '[sed命令]' [输入文件]

    说明:

    1)注意sed软件以及后面选项、sed命令和输入文件,每个元素之间都至少有一个空格

    2)为了避免混淆,sed 称为 sed软件 ,sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令

    3)sed-commands既可以是单个sed命令,也可以是多个sed命令组合

    4)input-file(输入文件)是可选的,sed还能够从标准输入如管道获取输入

    4、命令执行流程

    sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行 ......

    小知识:一次一行的设计使得sed软件性能很高,sed在读取非常庞大的文件时不会出现卡顿的现象。大家都用过vi命令,用vi命令打开几十M或更大的文件,会发现卡顿现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后在打开,因此卡顿的时间长短就取决于从磁盘到内存的读取速度。而且如果文件过大的话还会造成内存溢出现象。sed软件就很好的避免了这种情况,打开速度非常快,执行速度也很快

    5、sed命令

    6、sed特殊符号

    二、sed增删改查

    1、创建环境

    cat >person.txt<<EOF

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    EOF

    2、增

    a 追加文本到指定行后; apend 追加 {#a--追加文本到指定行后;--apend--追加}
    i 插入文本到指定行前; insert 插入 {#i--插入文本到指定行前;---insert--插入}

    [root@oldboy ~]# cat person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed '2a 106,dandan,CSO' person.txt {#rootoldboy--sed-2a-106dandancso-persontxt}

    101,oldboy,CEO

    102,zhangyao,CTO

    106,dandan,CSO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed '2i 106,dandan,CSO' person.txt {#rootoldboy--sed-2i-106dandancso-persontxt}

    101,oldboy,CEO

    106,dandan,CSO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed '2a 106,dandan,CSO 107,bingbing,CCO' person.txt {#rootoldboy--sed-2a-106dandancson107bingbingcco-persontxt}

    101,oldboy,CEO

    102,zhangyao,CTO

    106,dandan,CSO

    107,bingbing,CCO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    sed '2a 106,dandan,CSO

    107,bingbing,CCO' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    106,dandan,CSO

    107,bingbing,CCO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    多行增

    [root@oldboy ~]# echo -e "oldboy oldboy"

    oldboy

    oldboy

    企业案例1:优化SSH配置(一键完成增加若干参数)

    在我们学习CentOS6系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。(下面参数的具体含义见其他课程。)

    Port 52113

    PermitRootLogin no

    PermitEmptyPasswords no

    UseDNS no

    GSSAPIAuthentication no

    当然我们可以使用vi/vim命令编辑这个文本,但这样就比较麻烦,现在想一条命令增加5行文本到第13行前?

    解答:

    sed -i '13i Port 52113 PermitRootLogin no PermitEmptyPasswords no UseDNS no GSSAPIAuthentication no' sshd_config

    [root@oldboy ~]# echo A{,.ori}

    A A.ori

    { } 作用

    调试工具sedsed命令

    安装sedsed命令

    wgethttp://sedsed.sourceforge.net/sedsed-1.0-O /bin/sedsed

    PATT是pattern模式的缩写,即模式空间

    HOLD是保持空间

    COMM是command的缩写,即sed命令

    sedsed -d --hide=hold "2i 106,dandan,CSO" person.txt

    3、删

    d 删除行 delete

    [root@oldboy ~]# sed '3d' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed '1,3d' person.txt

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed '1,+3d' person.txt

    105,feixue,CIO

    [root@oldboy ]# sed '13d' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    105,feixue,CIO

    [root@oldboy ~]# sed '3,$d' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    [root@oldboy ~]# sed '/oldboy/d' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    地址范围

    sed软件可以对单行或多行文本进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行

    用法: n1[,n2]{sed-commands}

    地址用逗号分隔,n1,n2 可以用数字、正则表达式、或者二者的组合表示

    4、改

    1)按行替换

    c 用新行取代旧行 c change

    [root@oldboy ~]# sed '2c 106,dandan,CSO' person.txt

    101,oldboy,CEO

    106,dandan,CSO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    2)字符串替换

    s:单独使用→将每一行中第一处匹配的字符串进行替换 ==>sed命令

    g:每一行进行全部替换 ==>sed命令s的替换标志之一,非sed命令

    -i:修改文件内容 ==>sed软件的选项

    sed软件替换模型(方框▇被替换成三角▲)

    sed 's/▇/▲/g' oldboy.log

    sed 's#▇#▲#g' oldboy.log

    观察特点

    1两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。#能在替换内容包含/有助于区别。定界符可以是任意符号如:或|等,但当替换内容包含定界符时,需转义即: |。经过长期实践,建议大家使用#作为定界符。

    2、定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。

    3、 s#▇#▲#g,▇能用正则表达式,但▲不能用,必须是具体的。

    4、默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

    [root@oldboy ~]# sed '2s@^#@@' /var/spool/cron/root 开头的#去掉 {#rootoldboy--sed-2s-varspoolcronroot-------开头的去掉}

    #print my name

    * * * * * /bin/echo dongzhi >>/server/log/dongzhi

    [root@oldboy ~]# sed -i '2s@^#@@' /var/spool/cron/root

    [root@oldboy ~]# cat /var/spool/cron/root

    #print my name

    * * * * * /bin/echo dongzhi >>/server/log/dongzhi

    [root@oldboy ~]# sed 's@^@#@' /var/spool/cron/root 开头添加 {#rootoldboy--sed-s-varspoolcronroot--------开头添加}

    ##print my name

    #* * * * * /bin/echo dongzhi >>/server/log/dongzhi

    [root@oldboy ~]# sed -i 's@^@#@' /var/spool/cron/root

    [root@oldboy ~]# cat /var/spool/cron/root

    ##print my name

    #* * * * * /bin/echo dongzhi >>/server/log/dongzhi

    [root@oldboy ~]# sed '3s#0#9#' person.txt {#rootoldboy--sed-3s09-persontxt}

    101,oldboy,CEO

    102,zhangyao,CTO

    193,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    3)使用s命令替换为空

    [root@iZ25hfz3698Z ~]# stat /etc/hosts

    File: `/etc/hosts'

    Size: 125 Blocks: 8 IO Block: 4096 regular file

    Device: ca01h/51713d Inode: 918496 Links: 1

    Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

    Access: 2016-11-22 17:54:13.536012781 +0800

    Modify: 2015-03-30 09:10:50.982117786 +0800

    Change: 2015-03-30 09:10:50.982117786 +0800

    [root@iZ25hfz3698Z ~]# stat /etc/hosts|sed -nr '$s#^.*ge: | [0-9]{2}.*$##gp'

    2015-03-30

    4)变量替换

    [root@oldboy ~]# cat test.txt

    a

    b

    a

    [root@oldboy ~]# x=a;y=b

    [root@oldboy ~]# sed "s#$y#$x#" test.txt

    a

    a

    a

    5)特殊命令 eval

    [root@oldboy ~]# eval sed 's#$y#$x#' test.txt

    a

    a

    a

    6)分组替换

    sed软件的()的功能可以记住正则表达式的一部分,其中, 1为第一个记住的模式

    即第一个小括号中匹配的内容, 2为第二个记住的模式,即第二个小括号中匹配的内容,

    sed最多可以记住9个

    关闭开机自启动的服务

    chkconfig --list |grep "3:on"|egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'|sed -r 's#(^.*)#chkconfig 1 off#g'|bash

    7)sed软件s命令中的特殊符号&

    &代表s###g 中前两个# 之间的全部内容

    8)批量修改文件名

    touch stu_102999_{1..5}_finished.jpg

    [root@oldboy test]# ls|xargs -n1 |sed -r 's#(^.*)_finished(.*)#mv & 12#g'

    mv stu_102999_1_finished.jpg stu_102999_1.jpg

    mv stu_102999_2_finished.jpg stu_102999_2.jpg

    mv stu_102999_3_finished.jpg stu_102999_3.jpg

    mv stu_102999_4_finished.jpg stu_102999_4.jpg

    mv stu_102999_5_finished.jpg stu_102999_5.jpg

    [root@oldboy36 test]# ls |sed -r 's#(^.*_[0-9])(_.*d)(.*$)#mv & 13#'

    mv stu_102999_1_finished.jpg stu_102999_1.jpg

    mv stu_102999_2_finished.jpg stu_102999_2.jpg

    mv stu_102999_3_finished.jpg stu_102999_3.jpg

    mv stu_102999_4_finished.jpg stu_102999_4.jpg

    mv stu_102999_5_finished.jpg stu_102999_5.jpg

    在linux中有专门重命名的命令 rename {#在linux中有专门重命名的命令--rename}
    rename 被替换的内容 替换的内容 替换的文件(可以使用通配符) {#rename--被替换的内容--替换的内容--替换的文件(可以使用通配符)}

    [root@oldboy tmp]# rename "_finished" "" *

    [root@oldboy tmp]# ls

    stu_102999_1.jpg stu_102999_3.jpg stu_102999_5.jpg

    stu_102999_2.jpg stu_102999_4.jpg

    [root@oldboy test]# ll

    total 0

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_1.jpg

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_2.jpg

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_3.jpg

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_4.jpg

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_5.jpg

    [root@oldboy test]# rename jpg JPG *

    [root@oldboy test]# ll

    total 0

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_1.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_2.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_3.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_4.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 stu_102999_5.JPG

    [root@oldboy test]# rename stu oldboy *

    [root@oldboy test]# ll

    total 0

    -rw-r--r-- 1 root root 0 Sep 2 16:05 oldboy_102999_1.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 oldboy_102999_2.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 oldboy_102999_3.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 oldboy_102999_4.JPG

    -rw-r--r-- 1 root root 0 Sep 2 16:05 oldboy_102999_5.JPG

    9)大小写字母相互转换

    [root@iZ25hfz3698Z ~]# cat a.txt

    a1233#%bcdefghijklmnopqrstuvwxyz

    [root@iZ25hfz3698Z ~]# sed 's#[a-z]#u&#g' a.txt

    A1233#%BCDEFGHIJKLMNOPQRSTUVWXYZ

    [root@iZ25hfz3698Z ~]# sed -i 's#[a-z]#u&#g' a.txt

    [root@iZ25hfz3698Z ~]# cat a.txt

    A1233#%BCDEFGHIJKLMNOPQRSTUVWXYZ

    [root@iZ25hfz3698Z ~]# sed 's#[A-Z]#l&#g' a.txt

    a1233#%bcdefghijklmnopqrstuvwxyz

    [root@oldboy36 ~]# tr '[a-z]' '[A-Z]' < a.txt

    A1233#%BCDEFGHIJKLMNOPQRSTUVWXYZ

    echo abcASD |sed 's#.#u&#g'

    ABCASD

    10)一对一字符替换

    sed y###

    cat person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    sed 'y#123#789#' person.txt

    707,oldboy,CEO

    708,zhangyao,CTO

    709,Alex,COO

    704,yy,CFO

    705,feixue,CIO

    5、查

    p命令

    [root@oldboy ~]# cat person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed -n '1,3p' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    6、修改文件

    -i 修改文件内容

    -i[备份文件后缀]

    7、Ms # # # Ng 的使用

    语法说明:

    Ms 第M行处理,无g标志,只处理第一处,有g标志则处理全部

    Ng 从第N处开始处理到结尾

    Ms 、 Ng 合用 表示 只对第M行从第N处开始处理到结尾

    8、数字标志

    s # # # N 这种表示替换每行中第N次出现的内容,属于一种精确匹配。

    N的取值范围: 1<N<512

    cat >num.txt <<EOF

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    EOF

    [root@oldboy ~]# cat num.txt

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    [root@oldboy ~]# sed '1s#1#0#1' num.txt

    0 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    [root@oldboy ~]# sed '1s#1#0#2' num.txt

    1 0 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    [root@oldboy ~]# sed '1s#1#0#2g' num.txt

    1 0 0 0 0

    1 1 1 1 1

    1 1 1 1 1

    1 1 1 1 1

    9、顺序执行多个命令

    [root@oldboy ~]# sed -n '3p;5p;10p' /etc/inittab

    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

    # System initialization is started by /etc/init/rcS.conf

    10、sed参数及符号集合

    1)选项 -e

    每个 -e 选项后可接一个命令

    [root@oldboy ~]# sed -n -e '3p' -e '5p' /etc/inittab

    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

    # System initialization is started by /etc/init/rcS.conf

    2)选项 -f

    [root@oldboyedu37-nb ~]# cat linux36sed.sed

    5p

    35p

    70p

    sed -n -f linux36sed.sed linux36sed.txt

    3)= 打印行号

    [root@oldboy36 ~]# sed -n '$=' person.txt

    5

    [root@oldboy32-vm1 ~]# sed = nginx.conf |xargs -n2

    1 stu1

    2 stu2

    3 stu3

    4 stu4

    5 stu5

    6 stu6

    7 stu7

    8 stu8

    9 stu9

    10 stu10

    4){ } 里面可以写多个命令

    [root@oldboy ~]# sed -n '2,4{=;p}' person.txt

    2

    102,zhangyao,CTO

    3

    103,Alex,COO

    4

    104,yy,CFO

    11、模式空间 N

    [root@oldboy ~]# cat person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@oldboy36 ~]# sed 'N;s# # #;' person.txt

    101,oldboy,CEO 102,zhangyao,CTO

    103,Alex,COO 104,yy,CFO

    105,feixue,CIO

    [root@oldboy ~]# sed "=" person.txt|sed 'N;s# # #g'

    1 101,oldboy,CEO

    2 102,zhangyao,CTO

    3 103,Alex,COO

    4 104,yy,CFO

    5 105,feixue,CIO

    练习题:

    1、sed命令执行流程

    2、sed的增加:文件的第二行插入一条数据(列要保持对应)

    3、sed的删除:删除文件中第三行的数据

    4、sed的修改:定位到第四行,将行号109改为193

    5、sed的查询:显示第1行到第三行的数据

  • 相关阅读:
    springmvc两种非注解的处理器适配器
    springmvc两种非注解的处理器映射器
    java线程数据交换Exchanger
    java计数器CountDownLatch
    java路障CyclicBarrier
    java线程condition
    java模拟数据库缓存
    java中的递归
    面向对象
    全概率公式和贝叶斯准则
  • 原文地址:https://www.cnblogs.com/Klanti/p/9143599.html
Copyright © 2011-2022 走看看