Linux命令之sed

 

sed简介- sed - stream editor for filtering and transforming text

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

 

sed语法格式

sed
    语法格式
    sed  [选项]  '编辑指令' 文件
            [定址符]处理动作
                [地址1[,地址2]]
    
    # sed -n '2,4p' /etc/passwd    -n取消默认输出
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin

  # sed -i.bak 's#a#b#g' testfile -->testfile被修改,testfile.bak为源文件备份 

 

sed常见命令选项

坑: -n 和 -i不要一起使用,会将文件清空
-n 取消默认输出 -i 直接修改文件内容 [此参数写在其他参数后面] -f 使用sed脚本 -e 可指定多个处理动作(较少) -r 启用扩展正则,若与其他选项一起使用,应作为首选项
#echo gtms >test
#sed -r 's#(.*)#i am \1#g' test
i am gtms
{} 组合多个命令,分号分隔 定址符,即[地址1[,地址2]] 用来指定处理的起、止行数。省略时,默认全部行 地址可表示为文本的“行号”,或者 “
/正则表达式/”进行匹配

 

sed处理动作

p  打印行d
  2,4p
  2p;4p  分号
d  删除行   
2,4d
s字符串替换   s#
old#new#替换每行的第一个   s#old#new#3替换每行的第三个   s#old#new#g替换所有     替换分隔符“/”可使用如#,&等,便于修改文件路径

文本输出

    sed -n 'p' passwd      输出所有行
    sed -n '4p' passwd      输出第4行  #sed -n '4!p' passwd 不输出第4行
    sed -n '4,7p' passwd      输出第4-7行
sed -n '3p;5p' passwd    输出第3行和第5行
sed -n '4,+2p' passwd    输出第4行及其后2行 sed -n '/4/p' passwd     匹配有4的行
sed -n '/word1/p;/word2/p' passwd 多项匹配  #sed -ri '/word1|word2/p' passwd
sed -n 'p;n' passwd     输出奇数行 n即读入下一行 sed -n 'n;p' passwd     输出偶数行 sed -n '2,${n;p}' passwd 输出第2行开始的奇数行 sed -n '2,${p;n}' passwd 输出第2行开始的偶数行 sed -n '$=' passwd      输出文件总行数 $= 文件行数

删除文本 -i真修改

    sed '3d;5d' passwd         删除第3行,第5行
    sed '3,5d' passwd          删除3-5行
    sed '/root/d' passwd       删除包含root的行
    sed '/^root/d' passwd      删除以root开头的行
    sed '$d' passwd            删除最后1行
    sed '/^$/d' passwd         删除空行 # sed -n  '/./p' person.txt
    sed '/^$/n;{/^$/d}' passwd 出现连续两个空行,则删除一个空行

文本替换 -i真修改  sed -i.bak修改前备份

    sed 's#root#ROOT#' passwd      将每行中的第1个root替换成ROOT
    sed 's#/root#ROOT#3' passwd     将每行中的第3个root替换成ROOT
    sed 's#root#ROOT#g' passwd     将所有root替换成ROOT  #sed '3S#A#B#g' filename  将第3行中的A改成B
    sed 's#root##g' passwd         将所有root字串删除(置空)
    sed 's#root#&s#g' passwd        将所有root后加s,&代表查找串
    sed '4,7s/^/#/' passwd         将4-7行注释
    sed 's/^#//' passwd            将以#开头的#去除

sed文本块处理动作 -i真修改

i    行前插入
        2icontent        在第2行之前插入YY文本行
     #sed '1i xingming,nianling,xingbie'
4,7icontent  在4-7行每行前插入文本行
       a 行后插入 2acontent 在第2行后插入YY行
/^XX/aYY 在以XX开头的行之后插入YY行

   #sed -e '/keyw1/icontent' -e '/keyw2/acontent' file 关键字1前插content行,关键字2后插content行
c 替换当前行 2cYY 将第2行内容修改为YY
     #sed '/key1/ccontent' file 将匹配到的行替换
多行文本处理 #
sed -i '1iXX\nYY' /tmp/passwd # head -3 /tmppasswd XX YY root:x:0:0:root:/root:/bin/bash 或# sed -i '1iXX\(回车) > YY' /tmp/passwd

变量替换

# name=Admin                  
# sed "s#root#Admin#g" passwd 

变量解析需要改成双引号


后向引用

# cat sedtest 
I am gtms
# sed -nr '/gtms/s#(.*)gtms#\1root#gp' sedtest 
I am root
# sed -ri '/gtms/s#(.*)gtms#\1root#g' sedtest 

案例:批量改文件名

# touch gtms{1..100}.jpg
# ls gtms* | sed -r 's#(.*)jpg#mv \1jpg \1jpeg#g' | bash
或
# ls gtms* | sed -r 's#(.*)jpg#mv & \1jpeg#g' | bash

# rename jpg jpeg gtms*

 

 

 

案例

修改默认运行级别
    # grep ^id /etc/inittab 
    id:3:initdefault:
    #sed  '/^id/s#[0-6]#5#' /etc/inittab
    # grep ^id /etc/inittab 
    id:5:initdefault:

取IP
  # ip a s eth0 | sed  -rn '3s#^.*net (.*)/24.*#\1#gp' 修改网站根目录:将
/var/www/html修改为/opt/wwwroot # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/html" # sed -i 's#/var/www/html#/opt/wwwroot#' /etc/httpd/conf/httpd.conf # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/opt/wwwroot"

更改主机名配置
  # grep ^HOSTNAME /etc/sysconfig/network
  HOSTNAME=node90
  # sed -i '/^HOSTNAME/cHOSTNAME=linux server' /etc/sysconfig/network
  # grep ^HOSTNAME /etc/sysconfig/network
  HOSTNAME=linux server


 

 

sed复制剪切 -i真修改

    模式空间
        存放当前处理的行,将处理结果输出
        若当前不符合处理条件,则鸳鸯输出
        处理完当前行再读入下一行来处理
    保持空间
        作用类似于“剪贴板”
        默认存放一个空行(换行符\n)
    H    模式空间--追加-->保持空间      复制
    h    模式空间--覆盖-->保持空间    复制
    G    保持空间--追加-->模式空间    粘贴
    g    保持空间--覆盖--->模式空间    粘贴


    #sed '1,3H;$G' passwd         将第1到第3行复制到文件末尾
    #sed '1h;2,3H;$G' passwd      同上。避免出现空行
    #sed '1h;1d;$G' passwd        将第一行剪贴到文末尾
    #sed '1h;2H;1,2d;$G' passwd   将第1第2行剪贴到文末

应用案例(ifconfig取ip)

#ifconfig eth0 | sed -n '2p'|sed 's#^.*dr:##g' | sed 's#  B.*$##g' (把ip前后都sed掉)
#ifconfig eth0 | sed -n '2p'|sed -r 's#^.*dr:(.*)  Bc.*#\1#g'
#ifconfig eth0 | sed -nr '2s#^.*dr:(.*)  Bc.*$#\1#gp'
#ifconfig eth0 | awk -F"[: ]+" 'NR==2 {print $4}'
#ifconfig | grep " inet addr" | head -1 | cut -d ":" -f2 | awk '{print $1}'
#ifconfig eth0 | sed -n '2p' | sed 's#^.*dr:##g' | cut -d " " -f1

 

修改网站根目录:将/var/www/html修改为/opt/wwwroot

         # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf

         DocumentRoot "/var/www/html"

         # sed -i 's#/var/www/html#/opt/wwwroot#' /etc/httpd/conf/httpd.conf

         # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf

         DocumentRoot "/opt/wwwroot"

 

 

 

 

posted @ 2017-03-31 03:58  黑色月牙  阅读(461)  评论(0)    收藏  举报