處理文本工具sed
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
用法:
sed[option]... 'script' inputfile...
常用選項:
-n:不輸出模式空間內容的自動打印 -e:多點編輯 -f /PATH/TO/SCRIPT_FILE:從指定文件中讀取編輯腳本 -r:支持使用擴展正則表達式 -i:原處編輯
地址命令:
地址定界:
(1)不給地址:對全文進行處理 (2)單地址: #:指定的行 /pattern/:被此模式所能匹配到的每一行 (3)地址范圍: #,# #,+# /pat1/,/pat2/ #,/pat1/ (4)~:步進 1~2 奇數行 2~2 偶數行
編輯命令:
d:刪除模式空間匹配的行 p:顯示模式空間中的內容 a \text:在行后面追加文本;指出使用\n實現多行追加 i \text:在行后前面追加文本;指出使用\n實現多行插入 c \text:替換行為單行或多行文本 w /path/to/somefile:保存模式空間的行至指定文件 r /path/to/somefile:讀取指定文件的文本至模式空間中匹配到的行后 =:為模式空間中的行打印行號 !:模式空間中匹配行取反處理
替換命令:
s///:查找替換,支持使用其他分隔符,s@@@,s### sed 's/要被替換的字符串/新的字符串' 替換標記: g:行內全部替換 p:顯示替換成功的行 w /PATH/TO/DOMEFILE:將替換成功的行保存至文件中
sed示例:
使用-n的時候將只打印包含模板的行
[root@centos7 ~]# sed -n '2p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
把/etc/passwd下1到4行取出
[root@centos7 ~]# sed -n '2,4p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
先取空白行再取空白行的行號,-e是多點編輯
[root@centos7 ~]# sed -n -e '/^$/p' -e '/^$/=' /etc/rc.d/init.d/functions 6 8 11 15
在匹配到root字符行的下方添加superman
[root@centos7 ~]# sed '/root/a\superman' /etc/passwd root:x:0:0:root:/root:/bin/bash superman bin:x:1:1:bin:/bin:/sbin/nologin
匹配到的root字符的行被superman替代
[root@centos7 ~]# sed '/root/c\superman' /etc/passwd superman bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
把/etc/passwd中的2到5行刪除
[root@centos7 ~]# 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 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
“&”引用前面查找時查找到的整個內容
[root@centos7 ~]# sed -n 's/root/&superman/p' /etc/passwd rootsuperman:x:0:0:root:/root:/bin/bash
[root@centos7 ~]# sed -n 's/root/superman&/p' /etc/passwd supermanroot:x:0:0:root:/root:/bin/bash
-i可以直接修改文件的內容(危險操作)
[root@centos7 ~]# nl /etc/passwd > f1 [root@centos7 ~]# sed -i '2d' f1 [root@centos7 ~]# cat f1 1root:x:0:0:root:/root:/bin/bash 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
刪除f1第二行之前先做個備份命名為f1.bak
[root@centos7 ~]# sed -i.bak '2d' f1
sed練習:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
cat /etc/grub2.cfg| sed 's@^[[:space:]]\+@@g'
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
cat /etc/fstab | sed 's@^#[[:space:]]\+@@g'
3、在/root/install.log每一行行首增加#號
sed 's@^@#@g' /root/install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed 's@^[^#]@#&@' /etc/fstab
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
echo /etc/fstab/abc/ |sed -r 's@(.*/)([^/]+/?$)@\1@'
echo /etc/fstab/abc/ |sed -r 's@(.*/)([^/]+/?$)@\2@'
6、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig | sed -n '2p' | sed -r 's@.*addr:(.*) B.*@\1@'
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
ls *.rpm |sed -r 's@.*\.(.*)\.rpm$@\1@' | sort|uniq -c
原創文章,作者:xiaoqing,如若轉載,請注明出處:http://www.www58058.com/34595