Linux三劍客之sed

 Sed簡介  

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

 定址  

    可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的范圍(包括行數表示的那兩行)。如1,3表示1,2,3行 ,美元符號($)表示最后一行 ,1~2表示奇數行,1~2表示偶數行。范圍可以通過數據,正則表達式或者二者結合的方式確定 。  


sed命令

利用script處理文本文件

語法

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

常用選項

-n:不輸出模式空間內容的自動打印

-e: 多點編輯

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

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

-i: 原處編輯(慎用)

script

調用sed命令有兩種形式:  

a\  在當前行后面加入一行文本。

d   從模板塊(Pattern space)位置刪除行。

i\  在當前行上面插入文本。

c\  用新的文本改變本行的文本。 

p   打印模板塊的行。

r   file 從file中讀行

w   file 寫并追加模板塊到file末尾。

!   表示后面的命令對所有沒有被選定的行發生作用。(取反)

=   打印當前行號碼。

s/re/string 用string替換正則表達式re。

g   表示行內全面替換。

p   表示打印行。

w   表示把行寫入一個文件。

&   保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。


示例

sed '2d' test #刪除test文件的第二行

sed '2,$d'test #刪除文件的第二行到末尾所有行

sed '$d' file #刪除文件file的最后一行

sed '/text/d' text #刪除帶有text的行

sed -n 's/system/config/gp' test #把system替換為config,只顯示被匹配到的行,g使行內多個符合匹配都能匹配(默認匹配沒行的第一個)

sed -n 's/\(love\)ly/\1er/pg' test  #把所有的lovely替換為loveer,且打印出來 

sed -n 's@192.168.1.1@myipis&@p' test #把192.168.1.1都會替換成為myipis192.168.1.1。緊隨s的符號都被認為是分隔符,所以@在這里就是分隔符

sed -e '1,2d' -e 's#haha#laugh#' test #允許在同一行里執行多條命令。如例子里第一條命令刪除1至2行,第二條命令用laugh替換haha。

1、刪除/etc/grub.conf文件中所有以空白開頭的行行首的空白字符

 sed 's#^[[:space:]]\+##' /etc/grub.conf

2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符

 sed  's@^#[[:space:]]\+@@' /etc/fstab

3、在/root/install.log每一行行首增加#號

  sed 's@^@&#@' /root/install.log

4、在/etc/fstab文件中不以#開頭的行的行首增加#號

  sed 's@[^#]@#@' /etc/fstab

5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

  echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\1#'

  echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\2#'

6、利用sed 取出ifconfig命令中本機的IPv4地址

  ifconfig|sed  -n '/inet addr/p' |tr  -s ':' ' '|cut -d' ' -f4

7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數

  ls /media/Package |sed -r 's@.*\.(.*)\.rpm$@\1@'|sort|uniq -c


sed命令的高級用法

高級編輯命令:

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

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

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

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

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

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

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

d: 刪除模式空間中的行

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

示例

[root@localhost /]# cat passwd #測試文件
     1wang:x:507:507::/home/wang:/bin/bash
     2mage:x:508:508::/home/mage:/bin/bash
     3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     5user1:x:511:511::/home/user1:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     7499:x:495:1101::/home/499:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     91820:x:1500:1500::/home/1820:/bin/bash
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed -n 'n;p' passwd #僅顯示偶數行
     2mage:x:508:508::/home/mage:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed '1!G;h;$!d' passwd #倒序顯示
     10GLLL:x:2000:2000::/home/GLLL:/bin/bash
     91820:x:1500:1500::/home/1820:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     7499:x:495:1101::/home/499:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     5user1:x:511:511::/home/user1:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash
     2mage:x:508:508::/home/mage:/bin/bash
     1wang:x:507:507::/home/wang:/bin/bash
[root@localhost /]# sed '$!N;$!D' passwd #僅顯示最后兩行
     91820:x:1500:1500::/home/1820:/bin/bash
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed '$!d' passwd #顯示最后一行
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash

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

(0)
ladsdmladsdm
上一篇 2016-08-12
下一篇 2016-08-12

相關推薦

  • 第二周 博客作業

    1、linux上的文件管理類命令有哪些,其常用的使用方法及其相關示例。 文件管理命令:rm  mv cp       cp 復制命令       cp   源文件   目標文件           工作機制:如…

    Linux干貨 2016-11-03
  • 馬哥網絡教育班第21期+第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@localhost ~]# cp /etc/rc.d/rc.sysinit /tmp/ [root@localho…

    Linux干貨 2016-08-02
  • Linux中正則表達式及find指令的使用

    1、顯示當前系統上root、Fedora或user1用戶的默認shell [root@centos6 ~]# grep -E "^\<(root|fedora|user1)\>" /etc/passwd root:x:0:0:root:/root:/bin/bash fedor…

    Linux干貨 2016-10-24
  • 通用二進制安裝MySQL(MariaDB)

    一、前言     MySQL是一個關系型數據庫管理系統,是最流行的關系型數據庫管理系統,由于其體積小、速度快、總體擁有成本低,并且之前是完全開源,所以大受歡迎。但由于后面MySQL賣給了SUN,隨后SUN被Oracle收購,雖然也有開源免費版本,但是很多功能都需要另外購買商業版本,導致現在MySQL使用份額逐漸減少。所…

    Linux干貨 2015-10-15
  • 輕松實現源碼打包安裝[原創]

    通常我們在Linux/Unix下安裝一平臺時往往需要十幾甚至更多安裝包,這些源碼包來源于網絡、本地硬盤、移動設備。有時碰到網絡不暢通或下載地址失效會帶來很多麻煩,一個好方法便是將常用的軟件包下載到本地硬盤存放。問題是久而久之連自己都不曉得哪些包才是適用的。現用makeself來實現自解壓倒安裝倒是一個很好的解決方案,下面以制作Func客戶端安裝包為例。 一、…

    Linux干貨 2015-03-27
  • 8月9日vim作業

    復制/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init為/var/log; :%s@/etc/sysconfig@/var/log@ 刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行的行首的#號 :%s@^#\([[:spac…

    Linux干貨 2016-08-10
欧美性久久久久