sed基本用法

Stream EDitor, 行編輯器 

sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),

接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。然后讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,

那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。 

功能:主要用來自動編輯一個或多個文件,簡化對文件的反復 操作,編寫轉換程序等 
    用法: 
        sed [option]…  ‘script’  inputfile… (順序一定要注意)

常用選項:

-n:不輸出模式空間內容到屏幕,即不自動打印 (如果沒有-n,原來的內容也會輸入,{一行,(處理結果)依次下去})
-e:  多點編輯 (多個處理,用e來連接)
-f:/PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本 
-r:  支持使用擴展正則表達式 
-i.bak: 備份文件并原處編輯 
   注:-i 是直接對原文件進行修改
-i.bak 
   對原來的文件進行修改,但會備份一份以*.bak的原文件

script: ‘地址命令’
地址定界: 
(1) 不給地址:對全文進行處理 
(2) 單地址: 
    # :  指定的行 
     /pattern/:被此處模式所能夠匹配到的每一行 
(3) 地址范圍: 
   #,# 
   #,+# 
   /pat1/,/pat2/ 
     注:多段匹配的
        比如 /^b/,/^f/p 會找到以b開頭到f結尾的字段,如果中間沒有會略掉
        如果在下面繼續找到了以b開頭的字段,但沒有找到以f結尾的字段,會把以f以開頭到結尾全部顯示出來
   #,/pat1/ 
      注:比如 /^b/,10p  以b開頭的到第10行打印出來
         如果在后面還有以b開頭的還是能打印出來(雖然已經超過第10行了)
         但是滿足了^b開頭的條件,后而以^b開頭還是能正常打印出來的
      注:比如 /^b/,+10p 
         以^b開頭的行到后面的加10行一起打印出來
(4) ~:步進 
   1~2 奇數行 1開始跳過2行
   2~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:將替換成功的行保存至文件中
      注:跟使用分組相似,用\1 也可以用 & 代替\1的表示方法
      sed –n ‘s/root/&superman/p’  

高級編輯命令

P:打印模式空間開端至\n內容,并追加到默認輸出之前在輸出前再追加一行輸出
h: 把模式空間中的內容覆蓋至保持空間中 

H:把模式空間中的內容追加至保持空間中 
g: 從保持空間取出數據覆蓋至模式空間 
G:從保持空間取出內容追加至模式空間 
x: 把模式空間中的內容與保持空間中的內容進行互換 
n: 讀取匹配到的行的下一行覆蓋至模式空間 
N:讀取匹配到的行的下一行追加至模式空間 
d: 刪除模式空間中的行 

D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。

如果模式空間不包含換行符,則會像發出d命令那樣啟動正常的新循環

   注:D –>刪除模式空間的第一行   循環

注:下列格式可能不對(引號)
sed ‘2p’  /etc/passwd      顯示第二行,還有原來的內容
sed –n ‘2p’ /etc/passwd    只顯示第二行的內容
sed –n ‘1,4p’ /etc/passwd  顯示第1-4行的內容
sed –n ‘/root/p’  /etc/passwd 顯示帶有root字符的行
sed –n ‘2,/root/p’ /etc/passwd     從第2行開始,顯示帶有root字符的行
sed -n ‘/^$/=’  file 顯示空行行號
sed –n –e ‘/^$/p’ –e ‘/^$/=’  file 顯示空行行號 并在下一行顯示其行號
sed ‘/root/a\superman’  /etc/passwd 把root用superman代替 行后 
sed ‘/root/i\superman’ /etc/passwd 把root用superman代替 行前 
sed ‘/root/c\superman’ /etc/passwd 把帶有root的行用superman代替該行 
sed ‘/^$/d’ file 把空行刪除
sed ‘1,10d’   file   把1-10行刪除
nl /etc/passwd | sed ‘2,5d’    顯示行號并刪除2-5行
nl /etc/passwd | sed ‘2a tea’  顯示行號并把第2行用tea代替
sed ‘s/test/mytest/g’          全局查找test用mytest代替
sed –n ‘s/root/&superman/p’ /etc/passwd   找出root在 單詞后 添加superman 
sed –n ‘s/root/superman&/p’ /etc/passwd   找出root在 單詞前 添加superman
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’         
sed –i.bak  ‘s/dog/cat/g’ 保存原文件以.bak格式保存,并修改原文件中全局的dog替換成cat              

sed -n ‘n;p’ FILE   打印偶數行
sed ‘1!G;h;$!d’ FILE  倒序打印
    1!G 不是第一行執行G操作
    h操作
    $!d 不是最后一行執行d操作
sed ‘N;D’  FILE     打印最后一行 
sed ‘$!N;$!D’ FILE  打印最后二行
sed ‘$!d’ FILE     打印最后一行
sed ‘G’ FILE        原來打印一邊。每打印一遍,空一行
讀取到模式空間打印原來的第一行
G 讀取模式空間追加到保持空間
輸出模式空間 –> 現在為空
sed ‘g’ FILE        有多少行,打印多少空行
讀取一個到模式空間刪除,現在模式空間中沒有數據為空  打印空
sed ‘/^$/d;G’ FILE  每打印一遍,空一行
sed ‘n;d’ FILE      打印奇數行
sed -n ‘1!G;h;$p’ FILE  倒序打印

1、刪除centos7系統/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符 ?
sed -r ‘s@^[[:space:]]+@@’ /etc/grub2.cfg

2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符 ?
sed -r ‘s@^#[[:space:]]+@@’ /etc/fstab

3、在centos6系統/root/install.log每一行行首增加#號 ?
sed -r ‘s@^@#@’ /root/install.log

4、在/etc/fstab文件中不以#開頭的行的行首增加#號 ?  
sed -n ‘/![#]/’ /etc/fastab | sed -r ‘s@^@@’
sed -r ‘s@!^#@@’

5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名 
[root@centos7 ~]# echo /etc/sysconfig/—network-scripts/ | sed  -r ‘s@(/./)(.)\>/?@\2@’
—network-scripts
[root@centos7 ~]# echo /etc/sysconfig/—network-scripts/ | sed  -r ‘s@(/./)(.)\>/?@\1@’
/etc/sysconfig/

echo  /etc/sysconfig/-network-scripts/ |sed -r ‘s@^(./)([^/]+/?)@\1@’  取目錄
echo  /etc/sysconfig/-network-scripts/ |sed -r ‘s@^(.
/)([^/]+/?)@\2@’ 取基名

6、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig | sed -n ‘2s/.r:(.) B./\1/p’
 
取IP
centos6
ifconfig eth0|sed  -n -e ‘2s/^.
r://’ -e ‘2s/ .$//p’ 
centos7
ifconfig ens33 |sed  -n  -e ‘2s/.
et //’ -e ‘2s/ .$//p’ 
ifconfig ens33 |sed  ‘2!d;s/.
et //;s/ .$//’?

7、統計centos安裝光盤中Package目錄下的所有rpm文件的 以.分隔倒數第二個字段的重復次數 ?
ls /mnt/cdrom/Packages/ | sed -r ‘s@.
.(.)..\>@\1@’| sort |  uniq -c
  4  i686
  925  noarch
  1  TRANS.TBL
  2311  x86_64

8、統計/etc/init.d/functions文件中每個單詞的出現次數,并排序(用grep和sed兩種方法分別實現) ?

答:sed  ‘s/[^[:alpha:]]/\n/g’ /etc/init.d/functions |sed ‘/^$/d’ |sort |uniq -c|sort -n
    grep -oE ‘[[:alpha:]]+’ /etc/init.d/functions |sort |uniq -c |sort -n

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

(0)
_xddggg_xddggg
上一篇 2017-08-20 22:24
下一篇 2017-08-20 23:54

相關推薦

  • N25-第七周作業

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;     ~]# fdisk /dev/sda  (n, +10G 創建10G分區,w保存退出)   &nbsp…

    Linux干貨 2017-01-22
  • Linux計劃任務

    Linux任務計劃 Linux任務計劃、周期性執行任務 未來某一時間點執行一次任務:at,batch 周期性計劃任務:crontab     默認執行結果會通過郵件形式發送給用戶 本地電子郵件服務 smtp:Simple Mail Transfer Protocol,既簡單郵件傳輸協議,主…

    Linux干貨 2016-09-14
  • 用戶和組管理類命令

    用戶和組管理類命令 useradd useradd命令用于Linux中創建的新的系統用戶 語法 useradd(選項)(參數) 選項 -c<備注>:加上備注文字。備注文字會保存在passwd的備注欄位中; -d<登入目錄>:指定用戶登入時的啟始目錄; -D:變更預設值; -e<有效期限>:指定帳號的有效期限; -f<…

    Linux干貨 2018-03-18
  • 磁盤配額、Raid及邏輯卷LVS

    磁盤配額、Raid及邏輯卷LVS 磁盤配額 Linux是多用戶的操作系統,同一時間可能有多個用戶登錄到系統上進行操作,某些用戶可能會寫入很多數據,占用大量磁盤空間,導致其他用戶沒有磁盤空間可用。如何限定某個用戶對磁盤的使用空間大小,以及可使用的inode多少,也就是限定可創建多少個文件,這就是磁盤配額管理的作用。 磁盤配額特點 在內核中執行; 以文件系統為單…

    Linux干貨 2016-09-19
  • day5作業

    軟硬鏈接區別: 1 硬鏈接會增加連接數,而軟鏈接不會。 2 硬鏈接始終表示的只是一個文件,只是名字不同而已,而軟鏈接本身就是一個獨立的文件,文件內容為指向的文件的路徑。 3 命令格式不同。 硬鏈接: ln filename linkname 軟鏈接: ln -s filename&nbsp…

    系統運維 2016-08-08
  • DNS基礎及使用BIND搭建域名服務器

        本文主線是DNS服務相關概念和服務器搭建,在此之前了解一下域名這個東東很有其必要性,因為DNS服務就是應域名而生的。那么域名是什么哪?     域名     域名是用一串用點分開的字符串來表示的internet上的某一臺或者一組計算機的名稱,用于在數據傳輸時標識計算機的電子方位。舉…

    Linux干貨 2015-06-11
欧美性久久久久