文本處理三劍客–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 20:26
下一篇 2017-05-21 20:39

相關推薦

  • 分享 (History,Ls,感悟 )

    1.History 選項   -c: 清空命令歷史   -d offset: 刪除歷史中指定的第offset個命令    n: 顯示最近的n條歷史   -a: 追加本次會話新執行的命令歷史列表至歷史文件   -n: 讀歷史文件中未讀過的行到歷史列表   -r: 讀歷史文件附加到歷史列表 &…

    2017-07-15
  • 【知識點】NO.1—-關于刪除文件后未及時釋放磁盤空間問題

    刪除了某些占用大存儲的文件,發現占用的磁盤空間并沒有的到釋放。怎么解決呢?
    在工作中經常遇到服務器某個存放日志或者某些數據的磁盤(或者目錄),因為檢查不及時磁盤存儲滿了的狀況。釋放空間真的只是刪除文件這么簡單嗎?nonono…

    2017-11-18
  • 馬哥教育網絡班N22期+第6周課程練習

    一、總結vim編輯器的使用方法 vim文本編輯器 全屏編輯器,模式化編輯器 vim的教程文件命令:vimtutor vim /path/to/somefile vim模式: 編輯模式(命令模式),默認模式 輸入模式 末行模式 內置的命令行接口; 模式轉換: 編輯模式—>輸入模式: i:insert, 在光標所在處前方輸入,轉為輸入模式 a:append…

    Linux干貨 2016-10-09
  • 730作業

    1、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中 [root@local ~]# cat /etc/issue |tr "[[:lower:]]" "[[:upper:]]" > /tmp/i…

    Linux干貨 2016-08-02
  • 文件權限

           文件權限 一.文件屬性   如下圖所示:rw- 屬于所屬主root。中間r–屬于所屬組root的。r–屬于其他的(other)   文件屬性的操作: 1.chown 設置文件的所有者 例:chown  li(用戶)   f1(文件)…

    Linux干貨 2016-08-08
  • Hello World 集中營

    編程的人應該都知道什么是Hello World。這是一個最簡單的程序,其只在屏幕上輸出“Hello World”字樣,這通常是初學者的在學習編程時的第一個示例。把打印出 “Hello World” 作為第一個范例程序,現在已經成為編程語言學習的傳統?!癏ello World”起源于Brian Kernighan 和Dennis MacAlistair Rit…

    2016-05-17
欧美性久久久久