linux sed命令
簡介:
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern
space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有
改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。
補充:提取某一行中的內容而用sed 匹配時,一定要先匹配到那一行后然后用后向引用把那一行中的所去的內容用反向引用 \1 或者 & **把它提取出來
用法:
sed [option]… ' script ' inputfile…
常用選項:
-
-n:不輸出模式空間內容的自動打印
-
-e: 多點編輯
-
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-
-r: 支持使用擴展正則表達式
-
-i: 原處編輯
script:
' 地址命令 '
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:#: 指定的行 /pattern/:被此處模式所能夠匹配到的每一行(3) 地址范圍:
#,# #,+# /pat1/,/pat2/ #,/pat1/(4) ~:步進
1~2 奇數行(顯示奇數行) 2~2 偶數行(顯示偶數行)記?。簡我?#039; ' 里面的是地址命令,要加地址范圍 / /才能匹配
編輯命令:
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:將替換成功的行保存至文件中其中&表示 /1/&/ 這里的&就是1的內容
在aaa后面添加字段:sed -ne 's/aaa/HELLO&/p' test 輸出結果:HELLOaaa 在前后同時添加:sed -ne 's/aaa/&HELLO&/p' test 輸出結果:aaaHELLOaaa 以行為單位的新增/刪除這種只是行內操作
練習
1、將 /etc/passwd 的內容列出并且列印行號,同時,請將第 2~5 行刪除!
[root@www ~]# nl /etc/passwd | sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2、僅列出 /etc/passwd 文件內的第 5-7 行
[root@www ~]# nl /etc/passwd | sed -n '5,7p' 5 lop:x:4:7:lop:/var/spool/lopd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
3、多點編輯:一條sed命令,刪除/etc/passwd第三行到末尾的數據,并把bash替換為sheller
nl /etc/passwd | sed -e '3,$d' -e 's/bash/sheller/' 1 root:x:0:0:root:/root:/bin/sheller 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
4、從某行到某行的打印
sed -n '/^root/,/^s/p' /etc/passwd
*后向引用的用法,匹配等用法:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@qzx tmp]# sed 's@^[[:space:]]+@@' /etc/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@qzx tmp]# sed 's@^#[[:space:]]\+@@' /etc/fstab3、在/root/install.log每一行行首增加#號
#Installing ipw2200-firmware-3.1-4.el6.noarch #Installing rootfiles-8.1-6.1.el6.noarch #Installing man-pages-3.22-20.el6.noarch #Installing words-3.0-17.el6.noarch #*** FINISHED INSTALLING PACKAGES ***[root@qzx tmp]# ^C [root@qzx tmp]# sed 's$^$#$' /root/install.log4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@qzx tmp]# sed 's@^#[[:space:]]\+@@' /etc/fstab5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
基名:[root@qzx tmp]# echo /etc/init/rc.conf/ | sed -r 's@.*/([^/]+/?$)@\1@' rc.conf/ [root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@.*/([^/]+/?$)@\1@' rc.conf路徑名:
[root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@(.*/)[^/]+/?$@\1@' /etc/init/6、利用sed 取出ifconfig命令中本機的IPv4地址
[root@qzx tmp]# ifconfig |sed -n '2p' |sed -r 's@.*addr:(.*)B.*@\1@' 10.1.253.757、統計centos安裝光盤中Package目錄下的所有rpm文件的
以.分隔倒數第二個字段的重復次數[root@qzx Packages]# ls *.rpm |sed -r 's#.*\.(.*)\.rpm#\1#'|sort |uniq -c 4 i686 919 noarch 2283 x86_64
其他高級編輯命令:
-
h: 把模式空間中的內容覆蓋至保持空間中
-
H:把模式空間中的內容追加至保持空間中
-
g: 從保持空間取出數據覆蓋至模式空間
-
G:從保持空間取出內容追加至模式空間
-
x: 把模式空間中的內容與保持空間中的內容進行互換
-
n: 讀取匹配到的行的下一行覆蓋至模式空間
-
N:追加匹配到的行的下一行至模式空間
-
d: 刪除模式空間中的行
-
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
保持空間,一次處理不完保存的地方實例
sed -n 'n;p' FILE
打印偶數行sed '1!G;h;$!d' FILE
倒序排列行 想到于 tacsed '$!N;$!D' FILE
保留后兩行sed '$!d' FILE
只保留最后一行sed ‘G’ FILE
加空行sed ‘g’ FILE
顯示10個空行sed ‘/^$/d;G’ FILE
刪除多余的空行,并在每行后加一個空行sed 'n;d' FILE
[root@qzx ~]# sed 'n;d' qzx.txt
1
3
5
7
9
sed -n '1!G;h;$p' FILE
[root@qzx ~]# sed -n '1!G;h;$p' qzx.txt
10
9
8
7
6
4
5
3
2
1
原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/32322