文本處理三劍客之sed命令

第十八章、文本處理三劍客之sed命令

目錄

  • sed介紹
  • sed命令經常使用選項
  • sed經常使用編輯命令
  • sed使用示例
  • sed高級語法

18.一、sed簡介

sed全名stream editor,流編輯器,sed一次處理一行內容,處理時把當前處理的行存儲在臨時緩衝區中,稱爲"模式空間",而後根據指定的模式去處理模式空間中的內容,處理完成後,把緩衝區中的內容輸出到標準輸出,接着處理下一行,不斷執行,知道文件末尾,默認不修改原文件。linux

18.二、經常使用選項

-n:不輸出模式空間中內容至屏幕;
-e:多點編輯,能同時使用多個-e
-f /PATH/TO/SED_SCRIPT_FILE:從指定的文件中讀取sed命令,每行一個編輯命令
-r:支持使用擴展正則表達式;
-i:直接編輯原文件;

18.三、地址定界

一、空地址:對全文進行處理;nginx

二、單地址:正則表達式

#:指定行,#表示數字;
/pattern/:被此模式所匹配到的每一行;

三、地址範圍ssh

#,#:#表示數字,例如:sed -n '1,3p'表示第一行到第三行;
#,+#:#表示數字,例如:sed -n '3,+3p'表示從第3行向下加3行不包括第三行;
#,/pattern/:表示從#開始的行開始向下匹配,可以被pattern所匹配到的內容;
/pattern/,/pattern/:表示第一個被pattern匹配到的內容到第二個被pattern匹配到的內容之間的全部內容;
$:表示最後一行;

四、步近curl

1~2:表示全部奇數行;
2~2:表示全部偶數行;

示例編輯器

[root@www tmp]# sed -n '1~2p' test.txt
1
3
5
7
9
[root@www tmp]# sed -n '2~2p' test.txt
2
4
6
8
10

18.四、經常使用編輯命令

d:刪除
p:顯示模式空間中的內容;
a \text:在被pattern匹配到的行後面追加文本"text";
i \text:在被pattern匹配到的行前面追加文本"text";
c \text:把匹配到的行替換爲此處指定的文本"text";
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:讀取指定的文件內容至當前文件被模式匹配到的行後面;文件合併;
=:爲模式匹配到的行打印行號;
!:條件取反;
s:查找替換,其分隔符可自定義,經常使用的有:s@@@, s###;
    替換標記:
        g:全局替換;
        w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
        p:顯示替換成功的行;

18.五、示例

練習1:刪除/boot/grub/grub2.cfg文件中全部以空白字符開頭的行的行首的空白字符;url

[root@www tmp]# sed 's/^[[:space:]]\+//g' /etc/grub2.cfg

練習2:刪除/etc/fstab文件中全部以#開頭的行的行首的#號及#後面的全部的空白字符;spa

[root@www tmp]# sed 's@^#[[:space:]]*@@g' /etc/fstab

練習3:輸出一個絕對路徑給sed命令,取出其目錄,其行爲相似dirname;日誌

[root@www tmp]# echo "/var/log/messages" | sed 's@[^/]\+/\?$@@g'
/var/log/

練習四、找出/etc/passwd文件中daemon用戶所在行的行號;code

[root@www tmp]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@www tmp]# sed -n '/^daemon/=' /etc/passwd
3

練習5:找出nginx訪問日誌中20:35到21點之間的全部日誌;

[root@www nginx]# sed -n "/\[29\/Dec\/2016:20:35:.* +0800\]/,/\[29\/Dec\/2016:21:.*:.* +0800\]/"p  access.log
192.168.1.160 - - [29/Dec/2016:20:35:28 +0800] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"
192.168.1.106 - - [29/Dec/2016:21:12:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36" "-"

18.六、sed高級編輯命令

h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的全部行;

示例

sed -n 'n;p' FILE:顯示偶數行;
sed '1!G;h;$!d' FILE:逆序顯示文件的內容
sed '$!d' FILE:取出最後一行
sed 'n;d' /etc/fstab:顯示奇數行;
sed 'G' FILE:在原有的每行後面添加一個空白行;
相關文章
相關標籤/搜索