我在sed命令基礎裏面說了一下sed的基礎用法,sed還有一些高級用法,由於我也是在學習中,寫的博客可能會有想不到的地方,有問題希望大家指出。
sed的高級用法主要在於兩個空間的使用,模式空間和保持空間,模式空間就是我們對於進入其中的語句進行處理的空間,保持空間就像是一個臨時的交換swap,我們可以將模式空間裏面的東西放到保持空間中,或者將保持空間裏面的東西取出追加到模式空間,通過一定的命令,將兩個空間裏面的東西進行處理,能解決很多文本處理問題。
高級編輯命令
P:打印模式空間開端至\n內容,並追加到默認輸出之前
x:把模式空間中的內容與保持空間中的內容進行互換
h:把模式空間中的內容覆蓋到保持空間中
H:把模式空間中的內容追加到保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出數據追加至模式空間
n:讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加到模式空間
d:刪除模式空間中的行
D:刪除模式空間中從開始到第一個\n
一些示例
sed -n 'n;p' FILE 顯示偶數行
sed '1!G;h;$!d' FILE 倒序顯示
sed -n '1!G;h;$p' FILE 倒序顯示
sed 'N;D' FILE 顯示最後一行
sed '$!N;$!D' FILE顯示最後兩行
sed '$!d' FILE 顯示最後一行
sed 'G' FILE 給每一行後面加一空行
sed 'g' FILE 所有行替換成空行
sed '/^$/d;G' FILE 保證讓每一行非空行後面都有一個空行
sed 'n;d' FILE 顯示奇數行
相關的練習(基礎部分的多)
1、刪除centos7系統/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符
cat grub2.cfg |sed -r 's/^[[:space:]]+//'
2、刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符
sed -r "/^#[[:space:]]/s/^#[[:space:]]+([^[:space:]])/\1/" fstab
sed -r 's/^#[[:space:]]+//' fstab
3、在centos6系統/root/install.log每一行行首增加#號
sed 's/^/#/g' /root/install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
cat /etc/fstab |sed 's/^[^#]/#&/'
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
echo /etc/sysconfig/network-scripts/ |sed -r 's#(^/.*/)([^/].*/?$)#a:\1\nb:\2#'
6、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig eth0 |sed -n '2p' |sed 's#^.*addr:##g' |sed 's# Bcas.*$##g'
ifconfig eth0 |sed -n -e '2s#^.*addr:##g' -e 's# Bcas.*$##gp'
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重複次數
ls /mnt/cdrom/Packages/ | sed -r -e "s/(.*\.)([^\.].*$)/\1/" -e "s/(.*\.)([^.].*\.)/\2/" | sort | uniq -c | sort -n
8、統計/etc/init.d/functions文件中每個單詞的出現次數,並排序(用grep和sed兩種方法分別實現)
cat /etc/init.d/functions | sed -r "s/[^[:alpha:]]/\n/g" | sort | uniq -c | sort -n
cat /etc/init.d/functions | egrep -o "[[:alpha:]]+" | sort | uniq -c | sort -n
9、將文本文件的n和n+1行合併爲一行,n爲奇數行
seq 10 | sed "1~2N;s/\n/ /"