sed 強大的流文本編輯器淺析及示例演示
sed 流(行)編輯器
著有文本處理三劍客之稱:grep , sed , awk
sed作為其中之一對於文本處理可謂是異常強大,能夠大批量處理文本復雜繁瑣的修改,添加,刪除等操作,並能夠完美的與正則表達式相結合使用.
處理文本時按數據流進行處理,每次讀取文本的一行,將其放入緩沖區中稱之為模式空間(pattern space),也可類比理解為工作臺,然後根據地址定界或是正則表達式進行匹配,如果被匹配則執行其後的命令作出相應處理動作,而後讀取下一行處理,不斷重復.
值得註意的是sed默認會將讀取到模式空間中的行輸出到標準輸出(一般是屏幕),並將處理完成後的行輸出至標準輸出.默認對文件本身不處理,僅處理模式空間中被模式匹配的行.
sed 命令使用格式:
sed [option] ‘AddressCommand‘ input-file...
sed 可選項 ‘地址定界命令‘ 處理文本(可以是多個文件的列表處理)
option選項:
-n:只顯示符合條件的行,靜默模式關閉上面提到的默認打印模式空間至標準輸出 -i:直接修改源文件(做任何修改操作之前先備份.bak) -f:從文件讀取編輯腳本(符合sed語法的腳本並非bash腳本) -e:指定多個sed語法腳本,類似grep -e用法多點處理 -r:支持擴展的正則表達式
Address地址定界:
1. startline,endline 從第幾行到幾行
sed -n ‘1,100p‘ /var/log/yum.log /var/log/messages
$:最後一行
sed -n ‘$p‘ /var/log/yum.log
$-1:最後第二2行
1,+2d:刪除第一行和緊跟其後的後兩行(註意刪除操作不加-n才可看到效果)
sed ‘1,+2d‘ /etc/fstab
~:步進
1~2p 從第一行開始,每次跳兩行,也即奇數行
1~2p 偶數行
2. /regexp/ 正則表達式匹配
/^root/
3./patternl/,/pattern2/ 第一次匹配到pattern1的行開始到第一次被pattern2匹配的行為止(註意並不是僅匹配一次,如果處理的文本中存在多個符合條件的組合將處理每個分組)
Command命令(觸發動作):
d:刪除匹配的行,沒被匹配的反而顯示 p:顯示匹配的行 a \string:在匹配到行後面追加顯示stringa \n 換行 i \string:在匹配到行前面追加顯示string c \string :替換,將string覆蓋匹配的行 r file:將指定文件添加到匹配的行處 w file:將匹配到的內容另存至文件中 = 匹配的行加行號 ! 取反,沒有被匹配的行做處理動作
替換和查找:
s/pattern/string/: 將pattern中匹配的字符串替換成string字符串,默認只處理模式空間中第一次被模式匹配的塊,可通過其後的修飾符進行調整作用範圍
sed ‘s/fstab/testFSTAB/p‘ /etc/fstab #將fstab替換為testFSTAB
標記符:
g:全局 i:忽略大小寫
s/ / /
的形式也可是s@ @ @
或s# # #
甚至一些其他的字符作為分界,可自行測試
匹配表達式和要替換的字符串之間可支持後向引用
s/()/\1/
:將第一個匹配的模式括號的內容引用到後面的\1處替換字符串
&:對string字段引用,pattern中匹配的整個字符串
sed實例演示:
1.地址定界
顯示/etc/fstab的9-12行
[root ~]# sed -n ‘9,12p‘ /etc/fstab /dev/mapper/vg_root-lv_root / ext4 defaults 1 1 /dev/mapper/vg_root-lv_app /app ext4 defaults 1 2 UUID=9a92c305-beee-467f-9fe4-fd90b2e49743 /boot ext4 defaults 1 2 /dev/mapper/vg_root-lv_home /home ext4 defaults 1 2
2.步進及刪除
查找/etc/fstab中除前7行後的奇數行(多種不同形式達到相同效果)
[root ~]# cat -n /etc/fstab|sed -n -e ‘1,7d‘ -e ‘1~2p‘(註兩個-e的內容不可反寫) 9 /dev/mapper/vg_root-lv_root / ext4 defaults 1 1 11 UUID=9a92c305-beee-467f-9fe4-fd90b2e49743 /boot ext4 defaults 1 2 13 tmpfs /dev/shm tmpfs defaults 0 0 15 sysfs /sys sysfs defaults 0 0 等價於: [root ~]# cat -n /etc/fstab|sed -n ‘1,7d;1~2p‘ 等價於: [root ~]# cat -n /etc/fstab|sed ‘1,7d‘ | sed -n ‘1~2p‘
3.a \在匹配的行後添加內容
實現將root用戶的命令歷史添加執行時間
[root ~]# sed -i ‘$a \export HISTTIMEFORMAT="`date "+%T"`"‘ /root/.bashrc #在/root/.bashrc的最後一行添加一條變量
4.正則匹配
關閉第3步的命令歷史時間功能
[root ~]# sed -i ‘/.*HISTTIMEFORMAT.*/d‘ /root/.bashrc # 註意-i 會直接修改源文件,事先備份
5.s///查找替換
實現將文本的4,8行加註釋#
root ~]# sed -i.bak ‘2,5s/.*/#&/g‘ /etc/fstab #註意這裏的&是後向引用的用法
6.讀入文件並追加
將創建好的hosts文件內容,追加到/etc/hosts文件後 [root ~]# sed ‘$r hosts‘ /etc/hosts
7.匹配的信息另存為,也即寫入文件
實現將/var/log/messages中關於網卡信息的分離至eth.log中 [root ~]# sed -n -r ‘/eth[0-9]?/w eth.log‘ /var/log/messages
8.!取反
實現清除所有的#註釋信息行
[root ~]# sed -n ‘/^#/!p‘ /etc/fstab 等價於 [root ~]# sed ‘/^#/d‘ /etc/fstab
本文出自 “老城小敘” 博客,請務必保留此出處http://cityx.blog.51cto.com/9857477/1922794
sed 強大的流文本編輯器淺析及示例演示