1. 程式人生 > >sed工具與正則表達式的使用(shell第四天)

sed工具與正則表達式的使用(shell第四天)

sed工具正則表達式

sed工具 【流式編輯器】

—— 非交互,基於模式匹配過濾及修改文本
—— 逐行處理,並將結果輸出到屏幕
——可實現對文本的輸出,刪除,替換,復制,剪切,導入,導出等各種操作

命令格式:
1)前置命令 | sed [選項] ‘條件指令‘ 【利用管道】
2)sed [選項] ‘條件指令‘ 文件.. ..

常用選項:
-n 屏蔽默認輸出,默認sed會輸出讀取文檔的全部內容

-i sed直接修改源文件,默認sed只是通過內存臨時修改文件,源文件無影響
[正常情況下,sed命令所做的處理只是把操作結果(包括打印、刪除等)輸出到當前終端屏幕,而並不會對原始文件做任何更改]

-r (讓sed支持擴展正則)

例:
-n
查看文件/etc/hosts第1行
[root@server0 ~]# sed -n ‘1p‘ /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

查看/etc/passwd 3-6行
[root@server0 ~]# sed -n ‘3,6p‘ /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

查看文件/etc/passwd第3行和第6行
[root@server0 ~]# sed -n ‘3p;6p‘ /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

-i
刪除文件進行逐條刪除【實際未對文件進行修改】
[root@server0 ~]# sed ‘d‘ /wooo.txt
[root@server0 ~]# cat /wooo.txt
thekncxn;zcnk
dagahao the
wojiaozazahuithe koa
修改源文件【慎用】
[root@server0 ~]# sed -i ‘d‘ /wooo.txt

[root@server0 ~]# cat /wooo.txt

二) 認識sed工具的條件

sed [選項] ‘條件指令‘ 文件.. ..

1)sed命令可以使用行號或正則做為條件匹配:

sed -n ‘3p‘ /etc/passwd 打印第3行

sed -n ‘3,5p‘ /etc/passwd 打印第3到5行

sed -n ‘3p;5p‘ /etc/passwd 打印第3和5行

sed -n ‘3,+10p‘ /etc/passwd 打印第3以及後面的10行

sed -n ‘1~2p‘ /etc/passwd 打印奇數行

sed -n ‘2~2p‘ /etc/passwd 打印偶數行

2)正則案例

【采用//把需要搜索的內容查找出來】
sed -n ‘/root/p‘ /etc/passwd 打印包含root的行

sed -n ‘/bash$/p‘ /etc/passwd 打印bash結尾的行[可以登陸的用戶]

三)指令集合

【打印】p
sed -n ‘p‘ a.txt 輸出所有行,等同於cat a.txt
sed -n ‘4p‘ a.txt 輸出第4行
sed -n ‘4,7p‘ a.txt 輸出第4~7行
sed -n ‘4,+10p‘ a.txt 輸出第4行及其後的10行內容
sed -n ‘/^bin/p‘ a.txt 輸出以bin開頭的行
sed -n ‘$=‘ a.txt 輸出文件的行數

[root@server0 ~]# sed -n ‘$=‘ /etc/passwd
47 [後面無目錄顯示]

[root@server0 ~]# wc -l /etc/passwd
47 /etc/passwd

【刪除】d 註:練習時不需加 i ,防止文件誤刪!

sed ‘3,5d‘ a.txt 刪除第3~5行
sed ‘/xml/d‘ a.txt 刪除所有包含xml的行
sed ‘/xml/!d‘ a.txt 刪除不包含xml的行,!符號表示取反
sed ‘/^install/d‘ a.txt 刪除以install開頭的行
sed ‘$d‘ a.txt 刪除文件的最後一行
sed ‘/^$/d‘ a.txt 刪除所有空行

【替換】s (s/舊內容/新內容/選項)

vim test.txt 練習環境
2017 2011 2018
2017 2017 2024
2017 2017 2017

sed ‘s/2017/xxxx/‘ test.txt 替換所有行匹配的第一個2017
sed ‘s/2017/xxxx/g‘ test.txt 替換所有的2017
sed ‘s/2017/xxxx/2‘ test.txt 替換所有行匹配的第二個2017
sed ‘s/2017//2‘ test.txt 將所有行匹配的第二個2017刪除
sed ‘2s/2017/xxx/2‘ test.txt 將第二行匹配的第二個2017刪除
sed ‘2~2s/2017/xxx/g‘ test.txt 替換偶數行的2017
sed -n ‘s/2017/x[root@svr5 ~]# vim anonftp.shxxx/p‘ test.txt 打印
sed ‘4,7s/^/#/‘ a.txt //將第4~7行註釋掉(行首加#號)
sed ‘s/^#an/an/‘ a.txt //解除以#an開頭的行的註釋(去除行首的#號)

ifconfig | sed -n ‘2s/netm.//p‘ | sed ‘s/.t//‘ 查看ip
172.25.0.11

sed ‘s/\/bin\/bash/\sbin\/sh/‘ /etc/passwd

sed ‘s#/bin/bash#/sbin/sh/#‘ /etc/passwd

將首字母和尾字母調換
sed -r ‘s/^(.)(.*)(.)$/\3\2\1/‘ /wooo.txt
【每行文本拆分為“第1個字符”、“中間的所有字符”、“倒數第1個字符”三個部分,然後通過替換操作重排順序為“3-2-1”】

dello worlh
oa ga had
io xi za za huw

將所有大寫字母加大括號
sed -r ‘s/([A-Z])/[\1]/‘ /wooo.txt
hell[O] world
d[A] ga hao
[W]o xi za za hui

編寫腳本:【實現自動安裝ftp軟件包並配置他人可訪問和上傳】
通過yum安裝vsftpd軟件包
修改vsftpd服務配置,開啟匿名上傳
調整/var/ftp/pub目錄權限,允許ftp寫入
啟動vsftpd服務,並設置開機自運行

#!/bin/bash
yum -y install vsftpd
cp /etc/vsftpd/vsftpd.conf{,.back}
sed -i ‘s/^#an/an/‘ /etc/vsftpd/vsftpd.conf
chmod 777 /var/ftp/pub
systemctl restart vsftpd
systemctl enable vsftpd

無法訪問常見原因
1)防火墻未打開
2)selinux未打開
3)重啟服務

sed [選項] ‘條件指令‘ 文件.....
選項 :-n -i -r
條件:行號,/正則/
指令 :p,d,s,a,i,c

a,append追加,後
i,insert插入,前
c,把該行刪除並插入

:r 讀入
:w 另存為
sed ‘2r /etc/hosts‘ tmp.txt 將文件tmp.txt讀入到文件/etc/hosts的第二行
sed ‘w /root/b.txt‘ tmp.txt 將文件tmp.txt另存為文件root/b.txt內
sed ‘2w/root/b.txt‘ tmp.txt 將

腳本:篩選用戶並顯示密碼
#!/bin/bash
a=sed -n /bash$/s/:.*//p /etc/passwd
for i in $a
do
pass=grep $i /etc/shadow
pass1=${pass#:}
pass2=${pass1%%:
}
echo "$i ------>$pass2"
done

sed工具與正則表達式的使用(shell第四天)