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