sed

s下面说的是sed工具

sed本身也是一个管道命令,可以分享standard input 的,而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能呢,

          选项介绍

sed [-nefr] [动作]

-n:使用安静模式。在一般sed的用法中,所有来自stdin的数据一般都会列出屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来。

-e:直接在命令行模式上进行sed的动作编辑

-f:直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作

-r:sed的动作支持的是扩展正则表达式的语法(默认是基础正则表达式语法)

-i:直接修改读取的文件内容,而不是由屏幕输出。


动作说明: [n1[,n2]]function

n1,n2:不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则“10,20[动作行为]


a:新增,a的后面可以接字符串,而这些字符串在新的一行出现(目前的下一行)

c:替换,c后面的可以接字符串,这些字符串可以替换n1,n2之间的行!

d:删除,因为是删除,所以d后面通常不跟任何参数;

i:插入,i的后面可以接字符串,而这些字符串户在新的一行出现(目前的上一行)“

p:打印,也就是将某个选择的数据打印出来,通常p会与参数 sed -n 一起运行;

s:替换,可以直接进行替换的工作。通常这个s的动作可以搭配

正则表达式!例如 1,20s/old/new/g

         案例解说

以行为单位的新增、删除功能

  范例1,将/etc/passwd的内容列出并打印行号,同时,请将第2~5行删除。

[root@localhost ~]# nl /etc/passwd | sed '2,5d'

     1root:x:0:0:root:/root:/bin/bash

     6sync:x:5:0:sync:/sbin:/bin/sync

     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8halt:x:7:0:halt:/sbin:/sbin/halt

看到了吧?sed的动作为‘2,5d’,那个d就是删除。因为2~5都被删除了,显示的数据就没它们了,另外,原本应该执行sed -e 才对 没有 -e 也行,注意后面sed 格式 ‘ ’。

删除单行就sed ‘#d’ #号表示你删除的第几行,要是从第3行删除到行尾,就sed ‘3,$d'

$代表的是最后一行。


例2.我要在第2行后面加上,hello word,怎么办?

[root@localhost ~]# sed '2a hello word' < /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

hello word

daemon:x:2:2:daemon:/sbin:/sbin/nologin

标准输出给sed,2a就是要在第2行后面添加,hello word,把2a换成2i就表示在第二行的前面添加。

例3 。我们还可以添加多行在里面,请继续往下跟着我走,唐僧四人

[root@localhost ~]# nl /etc/passwd | sed '2a sunwukeng\nzhuba\ntangdoudou\nshasha'

     1root:x:0:0:root:/root:/bin/bash

     2bin:x:1:1:bin:/bin:/sbin/nologin

sunwukeng

zhuba

tangdoudou

shasha

要换行就\n;

以行为单位的替换与显示功能

例4.我想将2~5行的内容换成"four to kill"请看下面

[root@localhost ~]# nl /etc/passwd | sed '2,5c four to kill'

     1root:x:0:0:root:/root:/bin/bash

four to kill

     6sync:x:5:0:sync:/sbin:/bin/sync

看见吗?我来次4杀,2到5 c表示替换,后面的内容,,

例5.我们还可以打印想要的行,我想要第6行,

[root@localhost ~]# nl /etc/passwd | sed -n '6p'

     6sync:x:5:0:sync:/sbin:/bin/sync

这要加-n的,表示安静,不加-n,会打印全文,打印2次6行,,这样你就很闹腾,,

部分数据的查找并替换的功能,、

除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换功能,基本上sed的查找与替换与vi相类似,它像这样子滴:

sed  's/要被替换的字符/被替换的字符/g'

 ///或者###或者@@@  s是搜索, g在全文,

例6.取出ip地址,下面我用grep ,sed,

[root@localhost ~]# ifconfig | grep "netmask" | sed 's/^.*inet[[:space:]]*//g' | sed\ 's/[[:alpha:]].*//g'

127.0.0.1  

192.168.122.1  

找出带有ip地址的行,然后,就sed替换,这都是套路,把不用的通通替换没有,删除,

例7,直接修改文件内容;

你以为sed只会这样的功能吗?大声说no,sed可以直接修改文件的内容,而不必使用管道命令或数据流重定向。不过这个操作会直接修改文件,所有要慎重,不要拿系统配置文件搞,

[root@localhost ~]# sed -i 's@^@#&@g' /root/bin/4c.sh 

[root@localhost ~]# cat /root/bin/4c.sh

##!/bin/bash

#

#if [ $1 == '--add' ];then

#    for I in `echo $2 | sed 's/,/ /g'`;do

#        if id $I &> /dev/null;then

#        echo "existing"

#        else

#        useradd $I

#    echo "$I" | passwd --stdin $I &> /dev/null

#        echo "finished"

#      fi

#      done

#elif [ $1 == '--del' ];then

#    for I in `echo $2 | sed 's/,/ /g'`;do

#     if id $I &> /dev/null;then

#      userdel -r $I

#      echo "deleting completed"

#      fi

#     done

#else

#    echo "-NOT"

#fi

[root@localhost ~]# 


我一狠心把这脚本每行都注释了。。这就是改变了内容了。大家要慎独,慎之又慎;

^表示行首,&就是原来的量,#&就是在行首加#,我解释是不好,希望你能看明白就好,

tks byby

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章