文本處理三劍客–sed使用詳解

處理文本的工具sed

Stream EDitor     行編輯器

sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。sed 主要用來自動編輯一個或多個文件, 簡化對文件的反復操作,編寫轉換程序等。

 

sed 工具

用法:

sed [option]… ‘script’ inputfile…

常用選項:

   -n:不輸出模式空間內容到屏幕,即不自動打印

   -e:多點編輯

   -f/ PATH/SCRIPT_FILE : 從指定文件中讀取編輯腳本

   -r:支持使用擴展正則表達式

   -i.bak:備份文件并原處編輯

script:

地址命令

 

地址定界:

(1)不給地址:對全文進行處理

(2)單地址:

#:指定的行

/pattern/:被此處模式所能夠匹配到的每一行

(3)地址范圍:

#,#

#,+#

/pat1/,/pat2/

#,/pat1/

(4) ~ :步進

1~2  奇數行

2~2  偶數行

 

編輯命令:

d:刪除模式空間匹配的行

p:顯示模式空間中的內容

a [\]text:在指定行后面追加文本

支持使用\n實現多行追加

i [\]text:在行前面插入文本

c [\]text:替換行為單行或多行文本

w /path/somefile:保存模式匹配的行至指定文件

r /path/somefile:讀取指定文件的文本至模式空間中

匹配到的行后

=:為模式空間中的行打印行號

!:模式空間中匹配取反處理

s/// :查找替換, 支持使用其它分隔符,s@@@ ,s###

替換標記:

g:  行內全局替換

p:  顯示替換成功的行

w /PATH/TO/SOMEFILE :將替換成功的行保存至文件中

實例:

顯示/etc/passwd中的內容

[root@localhost ~]#sed 'p' /etc/issue
CentOS release 6.8 (Final)
CentOS release 6.8 (Final)
Kernel \r on an \m
Kernel \r on an \m
 
[root@localhost ~]#sed -n 'p' /etc/issue
CentOS release 6.8 (Final)
Kernel \r on an \m

打印出第五行

[root@localhost ~]#sed -n '5p' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

在輸入第二行時,會再打印一遍

[root@localhost ~]#sed -n '2p' 
a
b
b
c

可配合管道及重定向使用

[root@localhost ~]#sed -n '2p' < /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#sed -n '2p'  /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | sed -n '2p'
bin:x:1:1:bin:/bin:/sbin/nologin

sed可處理前面命令的輸出

[root@localhost ~]#seq 10 | sed -n '9p'
9

打印/etc/passwdroot開頭的行

[root@localhost ~]#sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

打印出/etc/passwd中的1020

[root@localhost ~]#sed -n '10,20p' /etc/passwd
10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11  operator:x:11:0:operator:/root:/sbin/nologin
12  games:x:12:100:games:/usr/games:/sbin/nologin
13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15  nobody:x:99:99:Nobody:/:/sbin/nologin
16  dbus:x:81:81:System message bus:/:/sbin/nologin
17  usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
18  rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
19  rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
20  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

打印以h開頭的行到以n開頭的行的所有內容

[root@localhost ~]#sed -n '/^h/,/^n/p' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

奇數或偶數步進

[root@localhost ~]#seq 10 | sed -n '1~2p'
1
3
5
7
9
[root@localhost ~]#seq 10 | sed -n '2~2p'
2
4
6
8
10

刪除/etc/passwd偶數行

[root@localhost ~]#cat -n /etc/passwd | sed '2~2d'
     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
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11  operator:x:11:0:operator:/root:/sbin/nologin

/etc/passwd 一至三行后追加文本

[root@localhost ~]#cat /etc/passwd | sed '1,3a------Rookie'
root:x:0:0:root:/root:/bin/bash
------Rookie
bin:x:1:1:bin:/bin:/sbin/nologin
------Rookie
daemon:x:2:2:daemon:/sbin:/sbin/nologin
------Rookie
adm:x:3:4:adm:/var/adm:/sbin/nologin
 
[root@localhost ~]#cat /etc/passwd | sed '1,3a\   ------Rookie'
root:x:0:0:root:/root:/bin/bash
   ------Rookie
bin:x:1:1:bin:/bin:/sbin/nologin
   ------Rookie
daemon:x:2:2:daemon:/sbin:/sbin/nologin
   ------Rookie
adm:x:3:4:adm:/var/adm:/sbin/nologin

在二至四行前面追加文本,相當于在一至三行后

[root@localhost ~]#cat -n /etc/passwd | sed '2,4i\   ------Rookie'
     1  root:x:0:0:root:/root:/bin/bash
   ------Rookie
     2  bin:x:1:1:bin:/bin:/sbin/nologin
   ------Rookie
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
   ------Rookie
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin

替換二至四行為——Rookie

[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie'
     1  root:x:0:0:root:/root:/bin/bash
------Rookie
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync

可用\n實現多行追加

[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie \n======'
     1  root:x:0:0:root:/root:/bin/bash
------Rookie
======
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

/etc/passwd的三至六行保存至指定文件

[root@localhost ~]#cat /etc/passwd | sed -n '3,6w shiyan'
[root@localhost ~]#cat shiyan
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

為匹配的行打印行號

[root@localhost ~]#cat /etc/passwd | sed '1,10='
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

將文件中的二至五行刪除

[root@localhost ~]#seq 10 > shiyan
[root@localhost ~]#sed -i '2,5d' shiyan
[root@localhost ~]#cat shiyan
1
7
8
9
10

[root@localhost ~]#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#sed 's/root/ROOT/g' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
 
[root@localhost ~]#sed -n 's/root/ROOT/gp' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
[root@localhost ~]#sed -n 's@root@ROOT@gp' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

sed  -n  '2p'  /etc/passwd
只打印第二行
sed  -n  '1,4p'  /etc/passwd
打印一至四行
sed  -n  '/root/p'  /etc/passwd
打印包含root的行
sed  -n  '2,/root/p'  /etc/passwd  
sed  -n  '/^$/='  /etc/fstab
顯示空行行號
sed  -n  -e  '/^$/='  -e  '/^U/=' /etc/fstab
打印空行行號和U開頭行的行號
sed -n '/^$/=' -e '/^U/p' /etc/fstab
打印空行行號和U開頭的行
sed -n -e '/^U/=' -e '/^U/p' /etc/fstab
打印行號并打印行內容
sed  '/root/a\Rookie'  /etc/passwd 行后
在符合條件的行后添加Rookie
sed  '/root/i\Rookie'  /etc/passwd  行前
在符合條件的行前添加Rookie
sed  '/root/c\Rookie'  /etc/passwd  代替行
用Rookie代替符合條件的行

高級編輯命令:

   h:把模式空間中的內容覆蓋至保持空間中

   H:把模式空間中的內容追加至保持空間中

   g:從保持空間取出數據覆蓋至模式空間

   G:從保持空間取出內容追加至模式空間

   x:把模式空間中的內容與保持空間中的內容進行互換

   n:讀取匹配到的行的下一行覆蓋至模式空間

   N:讀取匹配到的行的下一行追加至模式空間

   d:刪除模式空間中的行

   D:刪除當前模式空間開端至\n的內容(不再傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

 

取奇偶數

[root@localhost ~]#seq 10 | sed 'n;d'
1
3
5
7
9
[root@localhost ~]#seq 10 | sed -n 'n;p'
2
4
6
8
10

倒序顯示

[root@localhost ~]#seq 10 | sed '1!G;h;$!d' 或者seq 10 | sed -n '1!G;h;$p'
10
9
8
7
6
5
4
3
2
1

最后兩行

[root@localhost ~]#seq 10 |  sed '$!N;$!D'
9
10

最后一行

[root@localhost ~]#seq 10 | sed '$!d'
10

每行后加空行

[root@localhost ~]#seq 10 | sed '/^$/d;G'
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10


使用技巧:

取IP地址

[root@localhost ~]#ifconfig eth0 | sed -n 2p | sed -e 's/.*r://' -e 's/B.*//'
192.168.101.128
[root@localhost ~]#ifconfig eth0 | sed '2!d;s/^.*r://;s/ .*//'
192.168.101.128

取文件名

[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\1@'
/etc/sysconfig/

取基名

[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\2@'
network-scripts/

對/etc/fstab中非#號開頭的行加注釋符

[root@localhost ~]#sed -r 's/(^[^#])/#\1/' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Mar 24 05:37:40 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#UUID=1fd1710f-ff1a-4eba-94f8-c57ecc05d6c6 /              ext4    defaults        1 1
#UUID=34e5ffbe-c2b3-4745-89bc-1811245ae758 /boot         ext4    defaults       1 2
#UUID=abf30893-850f-4a50-9a0c-e5e153873eb4 /data         ext4    defaults       1 2
#UUID=53e082c2-f1fc-4b96-aa31-d9071dc6355c /home         ext4    defaults      1 2
#UUID=7a8216c5-6781-4494-b2da-fda672f117ad swap          swap    defaults        0 0
#tmpfs                   /dev/shm                tmpfs   defaults        0 0
#devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
#sysfs                   /sys                    sysfs   defaults        0 0
#proc                    /proc                   proc    defaults        0 0

 刪除/etc/inittab文件中的空行    

 [root@localhost ~]#cat /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

[root@localhost ~]#sed '/^$/d' /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

 

 

原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/76601

(0)
Linux.rookieLinux.rookie
上一篇 2017-05-21
下一篇 2017-05-21

相關推薦

  • 文件系統初步了解

    Linux文件系統的基礎特性: 1文件名嚴格區分大小寫 2所有文件都們于根目錄下,FHS 3路徑以/做為分隔符 4每個文件的名稱可使用除/以外任意字符,單個名稱最長不能超出255個字 FHS:Filesystem Hierarchy Standard(文件系統目錄標準)的縮寫 多數Linux版本采用這種文件組織形式,類似于Windows操作系統中c盤的文件目…

    Linux干貨 2015-04-27
  • bash 循環語句while、until練習

    bash 循環語句while、until while練習題          1、求100以內所有正整數之和     2、通過ping命令探測172.16.250.1 – 254范圍內的所有主機的在線狀態,統計在線主機和…

    Linux干貨 2016-08-19
  • 設計模式(十)享元模式Flyweight(結構型)

    相對于其它模式,Flyweight模式在PHP實現似乎沒有太大的意義,因為PHP的生命周期就在一個請求,請求執行完了,php占用的資源都被釋放。我們只是為了學習而簡單做了介紹。 1. 概述 面向對象技術可以很好地解決系統一些靈活性或可擴展性或抽象性的問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題?!?/p>

    Linux干貨 2015-07-08
  • Linux基礎知識(四)

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限 [root@bogon ~]# cp -r /etc/skel/ /home/tuser1 [root@bogon ~]# chmod -R 700 /home/tuser1 2、編輯/etc/group文件,添加組hadoo…

    Linux干貨 2016-10-17
  • RHCE基礎實驗

    實驗:配額實現 1. 啟用配額功能 vim /etc/fstab defaults usrquota,grpquota mount -o remount /home 2. 創建配額數據庫 quotacheck -cug /home 3. 啟用數據庫 quotaon /home quotaon -p /home 查看 4. edquota wang setqu…

    Linux干貨 2017-05-02
  • N22第八周作業

    1. 請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 網橋從一個局域網接收MAC幀,拆封、校對、校驗之后,按另一個局域網的格式重新組裝,發往它的物理層。由于網橋是鏈路層設備,因此不處理數據鏈路層以上層次協議所加的報頭。   集線器的主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離,同時把…

    Linux干貨 2016-12-26
欧美性久久久久