18文本處理工具sed

18文本處理工具sed

    sed,全稱Stream EDitor,是一種流編輯器,它一次處理一行內容,但是它構思巧妙,功能強大,是運維工作中必不可少的文本處理工具,也是因為這樣,被稱作文本處理三劍客之一。

    sed在處理時,把當前處理的行李存儲在臨時緩沖區中,這個區域被稱作“模式空間pattern space”,接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾,文件內容并沒有改變,除非你使用重定向存儲輸出或用選項直接修改源文件。sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。除了pattern space,sed還有一個保持空間,叫做hold space,這個空間默認是空的,既不會自動清空也不會自動輸出,其功能是當我們處理一行內容的時候,可以將模式空間內的文本轉存至保持空間,通過兩個空間的轉換來實現更加強大的文本處理。

一、雜項知識整理

1、sed在使用的時候-i選項是非常危險的操作,但有些時候又必須修改原文件。這時為了避免錯誤修改了原文件,可以使用sed -i.bak(自定義后綴)‘’ file1此命令進行修改,.bak為自定義后綴名,命令會將原文件備份為file1.bak,然后再修改原文件。例如:

[root@localhost testdir]# sed -ri.bak  '/\/bin\/bash/d'  passwd 
[root@localhost testdir]# ls
a   aa   b         data        passwd      q   qqq        string.txt  user      userinfo
a~  abc  copytest  lost+found  passwd.bak  qq  shelltest  test    user.dir

2、nl命令:計算文件中的行號,將輸出的文件內容自動加上行號。

    -b 指定行號的方式:

        a 表示不論是否為空行,也同樣列出行號(類似cat -n)

        t 如果有空行,空的哪一行不列出行號

二、命令詳解及事例

1、用法:sed [option]… 'script' inputfile

    script:地址定界編輯密令(兩者沒有分隔,是連續的)

常用選項:

    -n 不輸出模式空間中的內容至屏幕(靜默模式)

    -e 多點編輯,在每個命令之前加-e,便可以結合多個sed命令一起處理文本,不需要管道

    -f 從指定文件中讀取編輯腳本,每行一個編輯命令

[root@localhost testdir]# sed -f aaa /etc/issue
CentOS 7.2 
Kernel \r on AAAAAAAAAn \m
[root@localhost testdir]# cat aaa 
s/a/AAAAAAAAA/

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

    -i 直接編輯原文件

地址定界:

    空地址:不給任何地址,對全文進行處理

    單地址:

        # 指定第#行

        /PATTERN/ 被此模式匹配到的每一行

[root@localhost testdir]# cat /etc/issue
CentOS 7.2 
Kernel \r on an \m
\d
\l
\n
\r
[root@localhost testdir]# sed -r '/\\/d' /etc/issue
CentOS 7.2

地址范圍:

    #,# 從多少行到多少行

    #,+# 從多少行到#+#行

    #,// 從第#行到被模式匹配到的第一行

    //,// 從被第一個模式匹配到的行到被第二個模式匹配到的行

[root@localhost testdir]# cat /etc/issue
CentOS 7.2 
Kernel \r on an \m
\d
\l
\n
\r
\s
\v
\t
\o
[root@localhost testdir]# sed -r '/\\d/,/\\n/d' /etc/issue
CentOS 7.2 
Kernel \r on an \m
\r
\s
\v
\t
\o

    $ 最后一行

步進:

    1~2 所有奇數行

[root@localhost testdir]# sed '1~2d' /etc/issue
Kernel \r on an \m
\l
\r
\v
\o

    2~2 所有偶數行

編輯命令:

    d 刪除pattern space中的內容

    p 顯示pattern space中的內容

    a\text 在行后面追加文本text,支持使用\n實現追加多行

[root@localhost testdir]# sed 'a\newline\nnewline' /etc/issue
CentOS 7.2 
newline
newline
Kernel \r on an \m
newline
newline

    i\text 在行前面追加文本,支持使用\n實現多行插入

    c\text 把匹配到的行替換為此處指定的文本text

    w/PATH/TO/SOMEFILE 保存模式空間中的內容至指定文件中

[root@localhost testdir]# sed -r '/\\/w/testdir/functions' /etc/issue
CentOS 7.2 
Kernel \r on an \m
\d
\l
[root@localhost testdir]# ls
aaa       data       lost+found  passwd.bak  string.txt  user      userinfo
copytest  functions  passwd      shelltest   test        user.dir  userpasswd
[root@localhost testdir]# cat functions 
Kernel \r on an \m
\d
\l

    r/PATH/TO/SOMEFILE 讀取指定文件中的內容至當前文件被模式匹配到的行后面,實現文件合并

    = 每個被模式匹配到的行在其上一行添加一新行,內容是行號(是匹配到的行在原文中的第幾行的行號)

[root@localhost testdir]# sed -r '/\\/=' /etc/issue
CentOS 7.2 
2
Kernel \r on an \m
3
\d
4
\l

    !條件取反,寫在模式后面,命令之前;地址定界!編輯命令

[root@localhost testdir]# sed -r '/\\/!=' /etc/issue
1
CentOS 7.2 
Kernel \r on an \m
\d
\l

    s///或者@@@或者### 查找替換

        g 全局替換

        w /PATH/TO/SOMEFILE 將替換成功的結果保存至指定文件中

        p 顯示替換成功的行

2、高級編輯命令

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

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

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

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

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

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

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

    d 刪除模式空間中的行

    D 刪除多行模式空間中的所有行,追加之后的也會刪除

3、高級編輯命令典例:

    sed -n 'n:p' /FILE 顯示偶數行

    sed '1!G;h;$!d' FILE 逆序顯示文件內容

    sed '$!d' FILE 顯示最后一行

    sed '$!N;$!D' FILE 顯示最后兩行

    sed '/^$/d;G' FILE 刪除原有所有空白行,而后在所有非空白行后面添加一個空白行

    sed 'n;d' FILE 顯示奇數行

    sed 'G' FILE 在原有的每行后面添加一個空白行

三、練習及作業

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

[root@localhost ~]# sed -r 's@^[[:space:]]+@@' /etc/grub2.cfg

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

[root@localhost ~]# sed  -r  's@^#[[:space:]]+@@g' /etc/fstab 
                    sed -n   's@^#[[:space:]]+@@p' /etc/fstab

3、在/etc/fstab每一行行首增加#號

[root@localhost ~]# sed 's@^@#@' /etc/fstab 
#
##
## /etc/fstab
## Created by anaconda on Tue Jul 19 04:56:39 2016
##
## 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
##
#/dev/mapper/centos-root /                       xfs     defaults        0 0
#UUID=595c35b0-15d0-46bb-a63a-b1b50f9202fd /boot                   xfs     defaults        0 0
#/dev/mapper/centos-var  /var                    xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
#/dev/sda5               swap             swap    defaults        0 0
#/dev/sda3               /testdir         ext3defaults0 0
#/dev/cdrom /media/cdromiso9660defaults0 0

4、在/etc/fstab文件中不以#開頭的行的行首增加#號。此處的&代表前面匹配到的內容,意思是在行首之前增加#號,若不使用&則會替換掉一個字符。例如

[root@localhost ~]# sed -r 's@root@&superman@g' /etc/passwd
rootsuperman:x:0:0:rootsuperman:/rootsuperman:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost ~]# sed -r 's@^[^#]@#&@' /etc/fstab

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

目錄名:錨定行尾,從后往前至第一個/為止替換為空

[root@localhost ~]# echo /etc/init.d/functions | sed -r 's@[^/]+/?$@@'
/etc/init.d/

基名:分組,.*貪婪模式匹配。 錨定行尾。

[root@localhost ~]# echo /etc/init.d/functions/ | sed -r 's@(.*/)([^/])@\2@'
functions/
[root@localhost ~]# echo /etc/init.d/functions | sed -r 's@(.*/)([^/])@\2@'
functions
[root@localhost ~]# echo /etc/init.d/aasdfasdg/functions/ | sed -r 's@(.*/)([^/]+/?$)@\2@'
functions/
[root@localhost ~]# echo /etc/init.d/aasdfasdg/functions | sed -r 's@(.*/)([^/]+/?$)@\2@'
functions

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

[root@localhost Packages]# ifconfig | sed -n  -r '/(\b([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\b)\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/p'
         inet 172.18.16.49  netmask 255.255.255.0  broadcast 172.18.16.255
        inet 127.0.0.1  netmask 255.0.0.0

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

[root@localhost Packages]# ls | rev | cut -d. -f2 | rev | sort | uniq -c
   2000 i686
   2938 noarch
      1 TRANS
   4069 x86_6
[root@localhost Packages]# ls *.rpm | sed 's@.rpm$@@' | sed -r 's@(.*)(\..*$)@\2@' | sort | uniq -c
   2000 .i686
   2938 .noarch
   4069 .x86_64

8、用正則表達式表示如下內容:

IPv4地址:

ifconfig | sed -n  -r '/(\b([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\b)\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/p'

身份證號:

egrep "\<((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|(71|81|82))([0-9]){4}(19|20)([0-9]){2}((0[1-9])|(1[0-2]))(0[1-9]|([0-9])|(2[0-9])|(3[0-1]))([0-9]){3}([0-9]|X)\>"  filename

手機號:

grep -E -o "^\b1[3578][0-9]{9}\b"

郵箱:

egrep "\<([[:alnum:]]+(-|_)*[[:alnum:]]*)\>@([[:alnum:]]+\.)+[[:alnum:]]+" mail 

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

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

相關推薦

  • N24_jerry 第十二周作業

    1、請描述一次完整的http請求處理過程; 簡介 一次完整的HTTP請求過程從TCP三次握手建立連接成功后開始,客戶端按照指定的格式開始向服務端發送HTTP請求,服務端接收請求后,解析HTTP請求,處理完業務邏輯,最后返回一個HTTP的響應給客戶端,HTTP的響應內容同樣有標準的格式。無論是什么客戶端或者是什么服務端,大家只要按照HTTP的協議標準…

    Linux干貨 2017-03-22
  • 關于文件系統備份、交換分區掛載等–中

    dd命令:convert and copy a file 用法: dd if=/PATH/FROM/SRC of=/PATH/TO/DEST  bs=#:block size, 復制單元大小 count=#:復制多少個bs  of=file 寫到所命名的文件而不是到標準…

    Linux干貨 2016-08-29
  • 軟件包管理

    軟件運行與編譯過程:程序源代碼——預處理——-編譯——-匯編——-鏈接 靜態編譯:.a 動態編譯:.so 二進制程序的組成:二進制文件、庫文件、配置文件、幫助文件。 包的命名:1、源代碼:name -VERSION.tar.gz或bz2或xz   &nb…

    Linux干貨 2017-04-23
  • exit和退出碼

    用途說明 exit命令用于退出當前shell,在shell腳本中可以終止當前腳本執行。   常用參數 格式:exitn 退出。設置退出碼為n。(Causethe shell to exit with a status of n.)   格式:exit 退出。退出碼不變,即為最后一個命令的退出碼。(Ifn is omitted, the e…

    Linux干貨 2016-01-14
  • Shell腳本編程—函數

    函數:     把一段獨立功能的代碼當作一個整體,并命名一個名字;命名的代碼段,此即為函數     由若干條shell命令組成的語句塊,實現代碼重用和模式化編程 函數的作用:     在某些場景下,我們可以將獨立功能的一段代碼定義為一個函數…

    Linux干貨 2016-08-24
  • 計算機基礎知識

    命令總結 echo :回顯 echo $PATH:顯示命令定義的路徑變量 Init 3,5:關閉和打開圖形界面 chvt切換虛擬終端(此命令只能本機切換) startx從新打開圖形界面 powerr off關機 hostname 顯示當前主機名 lsb_release -a顯示操作系統版本 lscpu顯示cpu信息 cat查看 who am顯示當前用戶身份 …

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