linux sed命令详解

1、定位

定位一行

x:行号
sed -n '10p' passwd
nl passwd | sed -n '10p'
/pattern/:正则
sed -n '/abc/p' passwd

[root@idtp4 test]# nl -ba passwd |sed -n '/root/p'
     1  root:x:0:0:root:/root:/bin/bash
    11  operator:x:11:0:operator:/root:/sbin/nologin
[root@idtp4 test]#

定位几行

x,y:行号
nl passed | sed -n '10,20p'
/pattern/,x:正则
sed -n '/mail/,/abc/p' passwd
x,y!:不选择这一行
nl passwd |sed -n '10!p'
nl passwd | sed -n '10,20!p'

间隔几行

first~step
first:开始行
step:步进
nl passwd | sed -n '1~2p'

二、基本操作命令

-a(追加行)/i(插入行)
-c(替代行)
-d(删除行)

$a:在文件末尾追加内容

#在环境变量末尾追加内容
#
为换行
[root@idtp4 test]# sed -i '$a export LRX_HOME=
export path='  profile
[root@idtp4 test]# tail -5f profile
export PATH=$PATH:$ACCUMULO_HOME/bin
export ANT_HOME=/software/apache-ant-1.9.13/bootstrap
export PATH=$PATH:$ANT_HOME/bin
export LRX_HOME=
export path=

如果想在添加的内容开头加空格,就要在$a后加入转义符“”。

#添加空格对齐
[root@idtp4 test]# sed -i '$a  export LRX_HOME
export path' profile
[root@idtp4 test]# tail -5f profile
export PATH=$PATH:$ACCUMULO_HOME/bin
export ANT_HOME=/software/apache-ant-1.9.13/bootstrap
export PATH=$PATH:$ANT_HOME/bin
  export LRX_HOME
export path

三、常用命令

删除空行

sed '/^$/d'  filename

替换操作

 s

分隔符:/
全局替换:g

sed 's/nologin/login/' passwd
sed 's/:/%/g' passwd

打印时用-n 和p。

替换时用s 和g(全局)。

 转换大小写

u l:对首字母转大写、小写
U L:对一串字符转大写、小写

sed 's/^[a-z-_]+/u&/' passwd
#将文件夹下的.txt文件名转换为大写
ls *.txt | sed 's/^w+/U&/'

其中,&表示替换前的全部内容。

[root@idtp4 test]# ls |sed 's/.*/u&/'
123.txt
Abc.txt
Access_log
Passwd
Profile
Test.txt
[root@idtp4 test]# ls |sed 's/.*/U&/'
123.TXT
ABC.TXT
ACCESS_LOG
PASSWD
PROFILE
TEST.TXT
[root@idtp4 test]# ls |sed 's/.*/l&/'
123.txt
abc.txt
access_log
passwd
profile
test.txt

四、括号

()

  • 括号代表指代内容,可以用1,2指代括号里的内容。
  • 括号要转义,前面要加转义符。

文件里有:w1w2w3的内容,要取w2,可以写为:

sed  's/w1(w2)w3/1/'

结果为w2。

# 取到第一个ip
[root@idtp4 test]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.166.190  netmask 255.255.240.0  broadcast 172.17.175.255
        ether 00:16:3e:0e:a4:48  txqueuelen 1000  (Ethernet)
[root@idtp4 test]# ifconfig|sed -n '/inet.*bro/p' |sed 's/inet+s([0-9.]+).snet.*$/1/'
        172.17.166.190

也可以写成:

# 取到第一个ip
[root@idtp4 test]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.166.190  netmask 255.255.240.0  broadcast 172.17.175.255
        ether 00:16:3e:0e:a4:48  txqueuelen 1000  (Ethernet)
[root@idtp4 test]# ifconfig|sed -n '/inet.*bro/p'|sed 's/inet.*s([0-9.]+).*netmask.*s([0-9.]+).*broadcast.*s([0-9.])/3/'
        172.17.175.255

[ ]

  • 表示从里面取任意值。
#0到9中任意的值,包含点,点需要转义
[0-9.]
#a到z的任意值,包含-,以括号里面的值开头,a到z是连续的,连续的用短线连接,结束连续后面要先接下划线,再接短线
^[a-z_-]

+:表示1个以上。

^:表示开头。

$:表示结束。

&:表示替换前的全部内容。

{}:同时执行多个sed命令。

#取passwd里的用户名,uid,gid
[root@idtp4 test]# sed 's/([a-z_-]+):x:([0-9]+):([0-9]+):.*$/1,2,3/' passwd
root,0,0
bin,1,1
daemon,2,2

五、r和w

r:读,不会改变文件内容

w:写,会改变文件内容,覆盖写

[root@idtp4 test]# cat 123.txt
123
456
789
[root@idtp4 test]# cat abc.txt
abc
qwe
sd
#将读取123.txt内容,并加入到abc.txt的第一行后面,不改变文件内容
[root@idtp4 test]# sed '1r 123.txt' abc.txt
abc
123
456
789
qwe
sd
[root@idtp4 test]# cat 123.txt
123
456
789
[root@idtp4 test]# cat abc.txt
abc
qwe
sd
[root@idtp4 test]# cat 123.txt
123
456
789
[root@idtp4 test]# cat abc.txt
abc
qwe
sd
#将abc.txt的第一行写入到123.txt里,覆盖写
[root@idtp4 test]# sed '1w 123.txt' abc.txt
abc
qwe
sd
[root@idtp4 test]# cat 123.txt
abc
[root@idtp4 test]# cat abc.txt
abc
qwe
sd

q:退出

#打印到第10行,退出
[root@idtp4 test]# nl -ba passwd |sed '10q'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6
     7  sync:x:5:0:sync:/sbin:/bin/sync
     8  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9  halt:x:7:0:halt:/sbin:/sbin/halt
    10  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@idtp4 test]#

六、命令行格式

-i:修改文件内容

-n:忽略默认输出

[root@idtp4 test]# nl -ba passwd|sed -n '10p' 
10 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@idtp4 test]#

-e:跟{}一样,可以同时写入多个命令

#删除2到3行,同时将冒号替换为%号
[root@idtp4 test]# nl -ba passwd |sed -e '10,20d' -e 's/:/%/g'
     1  root%x%0%0%root%/root%/bin/bash
     4  bin%x%1%1%bin%/bin%/sbin/nologin
     5  daemon%x%2%2%daemon%/sbin%/sbin/nologin
     6  adm%x%3%4%adm%/var/adm%/sbin/nologin
     7  lp%x%4%7%lp%/var/spool/lpd%/sbin/nologin
[root@idtp4 test]#

七、脚本格式

sed -f scriptfile file

每天进步一点点,快乐生活多一点。
原文地址:https://www.cnblogs.com/yiruliu/p/10003956.html