sed對比grep之理解

sed對比grep之理解

很多時候回車按下,沒有結果,或是報錯。 檢查發現都是低級錯誤,關鍵是習慣剛學完grep,有寫習慣沒改過來。 sed語法很重要。script語法寫對了,就成功了一大半,剩下的就是正則表達式的問題了。

sed與grep的區別是

grep是個行過濾器,篩選符合條件的行。也可以只顯示每行匹配到的文本(-o選項),不對文本進行編輯,只是顯示查找結果。 可以高亮顯示查找結果。

sed是針對行的編輯器。根據地址界定(可是使用行號,正則表達式)對指定的進行編輯,編輯操作有刪除,增加新行可多行,插入新行可多行。替換行 為單行或多行。 針對行內的內容修改只能是查找替換。針對文本行進行編輯,編輯后使用p命令輸出至標準輸出。不能夠高亮顯示查找編輯結果。sed -i 原處編輯,改變文件內容,否則只是顯示出來原文件無變化。

語法:

地址界定時使用的正則表達式的兩邊必須是/ 如 /patter/

script中的動作命令例如d和p。需要同時都要執行時,命令之間要加分號 ;

編輯命令:

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:將替換成功的行保存至文件中

sed默認支持基本正則表達式,有時候寫表達式的時候經常忘記加上“\”,建議用到正則表達式的話在sed的【options】中加上-r

script語法格式:

先地址界定COMMAND;COMMAND
必須指定要界定的地址,即想好要處理那些的行,再指定要做哪些動作(干什么)。命令之間必須分號隔開;

運行原理

sed是一個非交互式的流編輯器。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出;而所謂流編輯器,是指sed每次只從文件(或輸入)讀入一行,然后對該行進行指定的處理,并將結果輸出到屏幕(除非取消了屏幕輸出又沒有顯式地使用打印命令),接著讀入下一行。整個文件像流水一樣被逐行處理然后逐行輸出。

每次讀取一個新行,執行一次script,循環執行直到最后一行。

sed顯示特性

一次處讀取一行,送到模式空間后沒有被script匹配到的行默認顯示 
    參數 -n 沒有匹配到的行 不顯示。

匹配到的且處理過的行  ‘script’中加入命令p 顯示匹配到且處理過的行

經過命令處理的行(包括p),默認不輸出,命令p是打印
w命令  w /path/to/somefile: 保存模式匹配的行至指定文件

查找替換的結果是默認顯示的。無需p命令

關于查找替換

是只是每行第一次被查找到的內容被替換,要想全文替換,或目標行替換,就得在script中加g命令。從行首匹配替換到行尾。

練習

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

    [root@yangyouwei ~]# sed 's@^[[:space:]]*@@' f5  
    abc
    bsdf
    
    
    ffsd
    f
    t

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

    [root@yangyouwei ~]# sed -n 's@^#[[:space:]]\+@@p' /etc/fstab
    /etc/fstab
    Created by anaconda on Wed Jul 20 16:58:24 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
    [root@yangyouwei ~]#

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

    [root@yangyouwei ~]# sed -rn 's@(^.*$)@#\1@p' /etc/fstab
    [root@yangyouwei ~]# sed -n 's@^@#@p' /etc/fstab

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

    [root@yangyouwei ~]# sed -rn 's@^[^#]@#@p' /etc/fstab

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

    [root@yangyouwei ~]# echo /etc/fstab |sed -nr 's@[^/]+/?$@@p'
    /etc/

    [root@yangyouwei ~]# echo /etc/fstab |rev | sed -nr 's@/[^/]*/$@@p' |rev
    fstab

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

    [root@yangyouwei ~]# ifconfig | sed -nr '/Bcast/p' | sed -nr 's@[[:alpha:]:]*@@g;p' | sed -nr 's@^[[:space:]]+@@p' | sed -nr 's@[[:space:]]+.*$@@p'
    192.168.226.128

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

    [root@yangyouwei ~]# ls /media/cdrom/Packages/ | sed -nr 's@.[^.]*$@@p' | rev | cut -d. -f1 |sort | uniq -c
       2283 46_68x
          4 686i
        919 hcraon
          1 SNART

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

(0)
yywyyw
上一篇 2016-08-10
下一篇 2016-08-10

相關推薦

  • Linux的哲學思想

    Linux的哲學思想 linux有個哲學的思想是一切皆文件 其中linux硬件設備也是通過文件來表示的 物理終端 物理終端指的是顯示器等硬件終端設備,文件存在于 /dev/console 這個路徑下 虛擬終端 虛擬終端指的是在linux命令行連接的終端,文件存在于 /dev/tty# [1,6] 這個路徑下 串行終端 指的是使用計算機串行端口連接的終端設備,…

    Linux干貨 2018-02-23
  • 馬哥教育網絡班22期+第13周課程練習

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)   1)共享名為shared,工作組為magedu;   2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名; &n…

    Linux干貨 2016-12-05
  • rsyslog+mariadb+loganalyzer實現日志采集分析

    一、總述   Linux的日志記錄了用戶在系統上一切操作,這些日志是使用者了解服務器的情況最好的資料。Rsyslog 是系統的一部分,能夠實時的寫日志,并且還可以將日志選擇性的發送到遠程日志服務器。   rsyslog日志服務器的優勢:     1、日志統一,集中式管理     &nbsp…

    Linux干貨 2017-01-10
  • 筆記

    命令 命令列表 alias 別名 bc 計算器 basename文件基本名 cp 復制 cd 進入文件夾 cat /proc/partition 查看硬盤的使用情況 cat /proc/meminfo 查看內存的使用情況 chvt 切換終端 chown改變文件的所屬組 edj:chown -R www /etc/host clock 查詢或設置硬件時間 ch…

    Linux干貨 2017-05-25
  • Linux發展與應用

                                                      &nbsp…

    2017-04-05
  • sed 高級用法(1) 之 n N

    前言 我在參考其它多個Blog中發現,有些Blog中sed的功能介紹和實際有出入,這可能和版本有關系,正如sed文檔中所說“might change in future versions”,所以本文sed是以4.2.1為例。如果以后sed更新版本了,有可能會不一樣。 好記性不如爛筆頭! sed的工作原理 sed維護著兩個數據的緩沖空間,一個是模式空間(pat…

    Linux干貨 2015-07-03
欧美性久久久久