Linux sed

2019-03-28  本文已影响0人  歌哥居士

语法

$ sed [options] 'command' file(s)
$ sed -f command文件 file(s)

示例

-n 打印相关的行,与p配合使用

选择一行

$ sed  -n '10p' passwd
_scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false

$ sed  -n '/root/p' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false

选择多行

$ nl passwd | sed  -n '10,20p'
    10  _scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false
    11  _ces:*:32:32:Certificate Enrollment Service:/var/empty:/usr/bin/false
    12  _appstore:*:33:33:Mac App Store Service:/var/empty:/usr/bin/false
    13  _mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false
    14  _appleevents:*:55:55:AppleEvents Daemon:/var/empty:/usr/bin/false
    15  _geod:*:56:56:Geo Services Daemon:/var/db/geod:/usr/bin/false
    16  _serialnumberd:*:58:58:Serial Number Daemon:/var/empty:/usr/bin/false
    17  _devdocs:*:59:59:Developer Documentation:/var/empty:/usr/bin/false
    18  _sandbox:*:60:60:Seatbelt:/var/empty:/usr/bin/false
    19  _mdnsresponder:*:65:65:mDNSResponder:/var/empty:/usr/bin/false
    20  _ard:*:67:67:Apple Remote Desktop:/var/empty:/usr/bin/false


$ nl passwd | sed  -n '/root/,/Root/p'
     2  root:*:0:0:System Administrator:/var/root:/bin/sh
     ......
    53  _cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false


$ nl passwd | sed  -n '/root/,2p'
     2  root:*:0:0:System Administrator:/var/root:/bin/sh
     3  daemon:*:1:1:System Services:/var/root:/usr/bin/false
    53  _cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false

取反!

$ nl passwd | sed  -n '2!p'
     1  nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
     3  daemon:*:1:1:System Services:/var/root:/usr/bin/false

间隔

$ nl passwd | sed -n '1~2p'
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     ......

a 追加到末尾

$ nl passwd | sed '$a  ======================='
    ......
    41  user000:x:1000:1000:user000:/home/user000:/bin/bash
    42  mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
=======================


#第一行加空格需要加‘\’
$ nl passwd | sed '$a \    =======================\n    ======================='
    41  user000:x:1000:1000:user000:/home/user000:/bin/bash
    42  mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
    =======================
    =======================

i 从末尾插入

$ nl passwd | sed '$i \     ======================='
 =======================
    42  mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

c 替代行,删掉原本的

$ nl passwd | sed '40,42c \    ======================='
39  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
=======================

d 删除行

$ cat tempFile
1


4

6
$ sed '/^$/d' tempFile
1
4
6

s 替换成新的,g全局

$ sed 's/false/true/g' passwd
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/true


#截取IP
$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.147.133  netmask 255.255.255.0  broadcast 192.168.147.255
        inet6 fe80::99e5:a90b:2e67:92fb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:2a:d0:a6  txqueuelen 1000  (Ethernet)
        RX packets 2961  bytes 264382 (258.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1746  bytes 265407 (259.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
$ ifconfig ens33 | sed -n '/inet /p'
        inet 192.168.147.133  netmask 255.255.255.0  broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p'| sed  -e 's/inet//'
         192.168.147.133  netmask 255.255.255.0  broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p'| sed  -e 's/inet//' -e 's/netmask*.*$//'
         192.168.147.133

n 用下一个命令处理,{多个sed命令用;分隔}

$ nl passwd | sed -n '{n;p}'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     ....


$ nl passwd | sed -n '{p;n}'
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

& 代表前面替换的字符串
给用户名加空格:sed 's/^[a-z_-]+/& /' passwd 等同于 sed 's/[a-z_-]+/[a-z_-]+ /' passwd
\u:首字母大写
\U:转换为大写
\l:首字母小写
\L:转换为小写

$ sed 's/^[a-z_-]\+/&    /' passwd
root    :x:0:0:root:/root:/bin/bash
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
lp    :x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync    :x:5:0:sync:/sbin:/bin/sync

$ sed 's/^[a-z_-]\+/\u&/' passwd
......
User000:x:1000:1000:user000:/home/user000:/bin/bash
Mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

\( \) 与&不同的是可以只代表部分,/w1(w2)(w3)/\1\2/ :/ w1 (w2) (w3) / \1 \2 / ,\1取的是w2,\2取得是w3

$ ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.147.133  netmask 255.255.255.0  broadcast 192.168.147.255
        inet6 fe80::99e5:a90b:2e67:92fb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:2a:d0:a6  txqueuelen 1000  (Ethernet)
        RX packets 1891  bytes 166947 (163.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1140  bytes 157797 (154.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ ifconfig ens33 | sed -n '/inet /p'
        inet 192.168.147.133  netmask 255.255.255.0  broadcast 192.168.147.255
$ ifconfig ens33 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\) .*$/\1/'
        192.168.147.133

r 读取指定数据插入到匹配行
sed '<放到第几行>r <从哪个文件读数据>' 数据放到哪个文件

$ cat 123.txt
1343536346
12412415
12e412125125

$ cat abc.txt
asdasdasd
asdasdasdasd
asdasdas

#读文件,原文件都没有改变
$ sed '1r 123.txt' abc.txt
asdasdasd
1343536346
12412415
12e412125125
asdasdasdasd
asdasdas

$ cat 123.txt
1343536346
12412415
12e412125125

$ cat abc.txt
asdasdasd
asdasdasdasd
asdasdas

w 从源文件写数据到指定文件
sed '<第几行>w <写到哪个文件>' 源文件

#写文件,会改变被写的文件
$ sed 'w abc.txt' 123.txt
$ cat abc.txt
1343536346
12412415
12e412125125

$ cat 123.txt
1343536346
12412415
12e412125125

q 退出sed

#执行10次就退出
$ nl 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  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10 operator:x:11:0:operator:/root:/sbin/nologin

#找到nologin的一行后就退出
$ sed '/nologin/q' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
上一篇 下一篇

猜你喜欢

热点阅读