Linux三劍客之sed

    • sed 簡介

    • sed 工作原理

    • 命令格式

    • 常用選項:

    • 地址定界:

    • 編輯命令:

    • 替換標記:

    • sed元字符集(正則表達式)

    • 高級編輯命令:

    • sed用法實例

    • 作業:

      • 選定行的范圍:,(逗號)

      • 刪除操作:d命令

      • 顯示模式空間內容

      • 追加(行下):a\命令

      • 插入(行上):i\命令

      • 退出:q命令

      • 多點編輯:e命令

      • 從文件讀入:r命令

      • 寫入文件:w命令

      • 替換操作:s命令 替換文本中的字符串:

      • 全面替換標記g

      • 保持和獲取:h命令和G命令

      • 保持和互換:h命令和x命令

      作業:

sed命令

sed 簡介

Stream EDitor, 行編輯器 
sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。

sed 工作原理

處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。

QQ截圖20160810064434.png

命令格式

sed [options] 'command' file(s) 
sed [options] -f scriptfile file(s)

常用選項

-n :不輸出模式空間內容的自動打印
-e:  多點編輯
-f / PATH/TO/SCRIPT_FILE :  從指定文件中讀取編輯腳本
-r:  支持使用擴展正則表達式
-i:  原處編輯

地址定界:

(1)  不給地址:對全文進行處理
(2)  單地址:
   #:  指定的行
   /pattern/ :被此處模式所能夠匹配到的每一行
(3)  地址范圍:
   #,#  (3,4 表示3-4行)
   #,+#  (3,+4 表示3的基礎加4行,也就是3-7行)
   /pat1/,/pat2/  (從第一個指定的“定義”到指定的第二個“定義”)
   #,/pat1/    (從第N行到指定的“定義”)
(4) ~ :步進
   1~2  奇數行
   2~2  偶數行

編輯命令:

d: 刪除模式空間匹配的行 
p: 顯示模式空間中的內容 
a \text :在行后面追加文本;支持使用\n 實現多行追加 
i \text :在行前面插入文本;支持使用\n 實現多行插入 
c \text :替換行為單行或多行文本 
w /path/to/somefile: 保存模式匹配的行至指定文件 
r /path/from/somefile :讀取指定文件的文本至模式空間中匹配到的行后 
=: 為模式空間中的行打印行號 
!: 模式空間中匹配行取反處理 
s///:查找替換, 支持使用其它分隔符,s@@@ ,s###

替換標記:

g: 行內全局替換 
p: 顯示替換成功的行 
w /PATH/TO/SOMEFILE :將替換成功的 行 保存至文件中 
x 表示互換模板塊中的文本和緩沖區中的文本。 
y 表示把一個字符翻譯為另外的字符(但是不用于正則表達式) 
\1 子串匹配標記 
& 已匹配字符串標記

sed元字符集(正則表達式)

^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。 
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。 
.匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d。 
* 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行。 
[] 匹配一個指定范圍內的字符,如/[ss]ed/匹配sed和Sed。 
[^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。 
\(..\) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替換成lovers。 
& 保存搜索字符用來替換其他字符,如s/love/&/,love這成love。 
\< 匹配單詞的開始,如:/\ 匹配單詞的結束,如/love>/匹配包含以love結尾的單詞的行。 
x\{m\} 重復字符x,m次,如:/0{5}/匹配包含5個0的行。 
x\{m,\} 重復字符x,至少m次,如:/0{5,}/匹配至少有5個0的行。 
x\{m,n\} 重復字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10個0的行。

高級編輯命令:

h: 把模式空間中的內容覆蓋至保持空間中 
H:把模式空間中的內容追加至保持空間中 
g: 從保持空間取出數據覆蓋至模式空間 
G :從保持空間取出內容追加至模式空間 
x: 把模式空間中的內容與保持空間中的內容進行互換 
n: 讀取匹配到的行的下一行 覆蓋 至模式空間 
N:追加匹配到的行的下一行至模式空間 
d: 刪除模式空間中的行 
D :刪除 當前模式空間開端至\n 的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

sed用法實例

選定行的范圍:,(逗號)

所有在模板test和check所確定的范圍內的行都被打?。?/p>

sed -n '/root/,/mageedu/p' /etc/passwd

打印從第5行開始到第一個包含以test開始的行之間的所有行:

sed -n '5,/^mageedu/p' /etc/passwd

對于模板mage和zhanghe之間的行,每行的末尾用字符串/bin/bash改成/sbin/nologin:

[root@localhost ~]# sed -i '/mage/,/zhanghe/s@/bin/bash@/sbin/nologin@' pw

刪除操作:d命令

刪除文件的1-16行

[root@localhost ~]# sed "1,16d" /etc/fstab 
proc                    /proc                   proc    defaults        0 0

刪除開頭是以#開頭的行

[root@localhost ~]# sed '/^#/d' /etc/fstab

刪除文件的第2行到末尾所有行:

[root@localhost ~]# sed '4,$d' /etc/fstab 

#
# /etc/fstab

刪除所有以UUID開頭的行

[root@localhost ~]# sed '/^UUID/d' /etc/fstab 

顯示模式空間內容

[root@localhost ~]# sed -n '1,3p' /etc/fstab 

#
# /etc/fstab

追加(行下):a\命令

將 this is a test line 追加到 以UUID 開頭的行后面:

[root@localhost ~]# sed '/^UUID/a\this is a test line' /etc/fstab

在 test.conf 文件第2行之后插入 #mageedu:

[root@localhost ~]# sed -i '2a\#mageedu' /etc/fstab

插入(行上):i\命令

將 this is a test line 追加到以test開頭的行前面:

[root@localhost ~]# sed '/^test/i\this is a test line' file 

在test.conf文件第5行之前插入this is a test line:

[root@localhost ~]# sed -i '5i\this is a test line' test.conf

退出:q命令

打印完第10行后,退出sed

[root@localhost ~]# sed '10q' /etc/passwd

多點編輯:e命令

-e選項允許在同一行里執行多條命令:

sed -e '1,5d' -e 's/test/check/' file 

上面sed表達式的第一條命令刪除1至5行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結果。

從文件讀入:r命令

將/etc/issue里面的內容在/etc/fstab第二行后面插入

[root@localhost ~]# sed -r '2r /etc/issue' /etc/fstab

寫入文件:w命令

將/etc/fstab里面開頭#除外的行寫入/tmp/fstab.new里面去

[root@localhost ~]# sed -n '/^[^#]/w /tmp/fstab.new' /etc/fstab 

替換操作:s命令 替換文本中的字符串:

[root@localhost ~]# sed 's/book/books/' file

-n選項和p命令一起使用表示只打印那些發生替換的行:

[root@localhost ~]# sed -n 's/test/TEST/p' file 

直接編輯文件選項-i,會匹配file文件中每一行的第一個book替換為books:

[root@localhost ~]# sed -i 's/book/books/g' file

全面替換標記g

使用后綴 /g 標記會替換每一行中的所有匹配:

sed 's/book/books/g' file 

當需要從第N處匹配開始替換時,可以使用 /Ng:

echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK

保持和獲?。?code>h命令和G命令

在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。

sed -e '/test/h' -e '$G' file 

在這個例子里,匹配test的行被找到后,將存入模式空間,h命令將其復制并存入一個稱為保持緩存區的特殊緩沖區內。第二條語句的意思是,當到達最后一行后,G命令取出保持緩沖區的行,然后把它放回模式空間中,且追加到現在已經存在于模式空間中的行的末尾。在這個例子中就是追加到最后一行。簡單來說,任何包含test的行都被復制并追加到該文件的末尾。

保持和互換:h命令和x命令

互換模式空間和保持緩沖區的內容。也就是把包含test與check的行互換:

sed -e '/test/h' -e '/check/x' file

作業:

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

[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub.conf

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

[root@localhost ~]# sed 's@^#[[:space:]]*@@' /etc/fstab

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

[root@localhost ~]# sed -i 's@^@#@g' install.log

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

[root@localhost ~]# sed 's@^[^#]@#@g' /etc/fstab

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

[root@localhost ~]# echo /etc/fstab | sed 's@[^/]\+/\?$@@'
/etc/
[root@localhost ~]# echo /etc/fstab | sed 's@[^/]+/\?$@@'
/etc/fstab

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

[root@localhost ~]# ifconfig | sed -n 2p | sed -e 's@.*inet addr:@@' -e 's@B.*@@'
10.1.252.97

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

[root@localhost Packages]# ls *.rpm | sed -r 's@.*\.(.*).rpm$@\1@' |sort |uniq -c
     4 i686
   919 noarch
  2283 x86_64

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

(0)
M20_heM20_he
上一篇 2016-08-11 09:38
下一篇 2016-08-11 09:38

相關推薦

  • Linux的發行版及哲學思想

    Linux是一套免費使用和自由傳播的類Unix系統,是一個基于Unix的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的工具軟件、應用程序和網絡協議。它支持32位和64位硬件,是一個性能穩定的多用戶網絡操作系統。嚴格來講,Linux這個詞本身只表示Linux內核,聯合GNU 組織里的各種強大的應用軟件而組成的操作系統。 從Linux的誕生至今,…

    Linux干貨 2016-10-30
  • linux密碼的破解與保護

    找回root口令:   遇到密碼丟失的情況,如果只是普通用戶的密碼丟失,那么可以讓管理員重新設定密碼。但是如果管理員用戶的密碼丟失,那該如何解決?   在 Linux環境中root 密碼忘記還是可以救回來的!只要能夠進入并且掛載 / , 然后重新設定一下root的密碼,就救回來啦!這是因為開機流程中,若強制進入runlevel 1 時, …

    Linux干貨 2016-09-22
  • 8.5-文本處理工具(作業篇)

     1、統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序 [root@localhost ~]# netstat -nt Active Internet connections (w/o servers) Proto Recv-Q Send-Q&nb…

    Linux干貨 2016-08-07
  • 第一周作業

    1、描述計算機的組成及其功能。     運算器,控制器,存儲器,輸入設備,輸出設備     CPU:運算器+控制器     內存,硬盤:存儲器     輸入設備:鍵盤鼠標   &n…

    Linux干貨 2016-06-26
  • sed命令及vim編輯器

    sed[option]… 'script' inputfile…選項:-n:不輸出模式空間內容的自動打印-e: 多點編輯-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本-r: 支持使用擴展正則表達式-i: 原處編輯script:'地址命令' 1.地址定界:(1) 不給地…

    Linux干貨 2016-08-11
  • 94-HAProxy

    一. HAProxy簡介 1. LB CLuster:

    2016-11-18
欧美性久久久久