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 13:58
下一篇 2016-08-10 13:58

相關推薦

  • 初學Linux之文本處理sed

    Sed介紹;Sed用法;Sed高級用法

    2018-01-21
  • Linux進程及作業控制

    inux進程 進程的概念 當一個系統啟動時,剛開機是第一個運行的是內核代碼!先把內核放到cpu上運行,等內核控制和掌管了一切,有內核啟動進程!然后創建第一個進程 init進程  內核空間 用戶空間也都已被創建成功!后期的一切管理工作都由init來負責 init不能代表系統完成一些內核特權的執行!但由他負責向內核提交 他…

    Linux干貨 2016-09-10
  • 1、安裝配置介紹

    http://note.youdao.com/yws/public/redirect/share?id=b90faa657ee452edb27ab1a13fc7b0bc&type=false

    Linux干貨 2016-08-08
  • keepalived高可用

    keepalived實現wrrp熱網關備份:keepalived配置文件如下主:! Configuration File for keepalived global_defs {  notification_email {    acassen@firewall.loc    failover@firewal…

    Linux干貨 2017-05-16
  • 網絡管理3

    一、知識整理 1、跨網絡通信:路由 路由的分類:主機路由;網絡路由;默認路由。 將主機接入網絡,需要配置網絡相關設置。一般包括如下內容:主機名;IP/MASK;路由:默認網關;DNS服務器:主、次、第三DNS服務器。 2、網絡配置文件:IP、MASK、GW、DNS相關配置文件 /etc/sysconfig/network-scripts/ifcfg-IFAC…

    Linux干貨 2016-09-10
  • 正則表達式之一grep

    grep :文本過濾( 模式:pattern) 工具 包括:grep, egrep, fgrep (不 支持正則表達式 搜索) 用法格式: grep [OPTIONS] PATTERN [FILE…]            &n…

    2017-02-27
欧美性久久久久