1. 程式人生 > 其它 >linux三劍客之sed

linux三劍客之sed

課前小練


1、grep忽略大小寫
-i
2、grep查詢/etc目錄下有多少個檔案包含root
[root@localhost ~]# grep -R -l "root" /etc/ | wc -l
145
3、將/etc目錄下所有的普通檔案打包壓縮至/tmp目錄
[root@localhost tmp]# tar -czPf /tmp/etc.tar.gz $(find /etc/ -type f | xargs )
4、將etc下包含root的檔案打包壓縮到/tmp目錄下
[root@localhost tmp]# tar -czPf /tmp/grep.tar.gz $(grep -R -l "root" /etc/ | xargs )
5、取反的正則表示式
[^]
6、或者的正則表示式
|
[]
7、匹配手機號的正則表示式
[root@localhost tmp]# echo "15517127878" | grep -E "(137|187|155)[0-9]{8}"
8、匹配IP的正則表示式
[root@localhost tmp]# ip a | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
9、將/etc/fstab檔案中所有的註釋行和空行過濾掉
[root@localhost tmp]# egrep -v "^$|^#" /etc/fstab
[root@localhost tmp]# egrep "^[^#]" /etc/fstab
[root@localhost ~]# grep -vE "^ *#|^$" /etc/fstab

linux三劍客之sed

1.sed

sed (流式編輯器):sed是操作、過濾和轉換文字內容的強大工具。常用功能有對檔案實現快速增刪改查,其中查詢的功能中最常用的2大功能是過濾(過濾指定字串)和取行(取出指定行)。
1.sed命令
sed [引數] "[定位][指令]" 處理的文字路徑
注:不指定定位,則預設處理全文
指令:
p:print,列印文字,通常與-n一起使用
d:delete,刪除文字
引數:
-e:允許多項編輯
-n:取消預設輸出,常與sed內建命令的p連用
-i:就地編輯文字,直接修改檔案內容,而不是輸出到終端,如果不適用-i選項,sed只是修改在記憶體中的資料,並不會影響磁碟上的檔案
-r:支援擴充套件正則表示式(sed中的正則表示式必須放在兩個//中間)
-f:指定定位規則的檔案0

案例

1、在文字中,列印第一行和第五行
[root@localhost ~]# sed -e "1p" -e "5p" 1.txt
2、在文字中,要求只打印第1,5,6三行
[root@localhost ~]# sed -n -e "1p" -e "5p" -e "6p" 1.txt
3、要求刪除檔案的第3行
[root@localhost ~]# sed -i "3d" 1.txt
4、刪除/etc/fstab檔案中所有的註釋的行
[root@localhost ~]# sed -i -r "/^ *#|^$/d" /etc/fstab
5、刪除1.txt的3行,列印第4行
[root@localhost ~]# sed -f 4.txt 1.txt
[root@localhost ~]# cat 4.txt
3d
4p

練習1:要求將/etc/passwd檔案複製到/root/1.txt中,然後刪除當中包含/sbin/nologin的行
cat /etc/passwd > /root/1.txt
sed -i -r "/\/sbin\/nologin/d" /root/1.txt
練習2:將/etc/nginx/nginx.conf檔案中所有的註釋的行(以#開頭的行) 全部刪除
sed -i -r "/^ *#/d" /etc/ngind/nginx.conf

2.sed+正則表示式(定位)

1.數字
1.固定定位
[root@localhost ~]# sed -n "2p" 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
2.範圍定位
[root@localhost ~]# sed -n "1,3p" 1.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
2.正則
正則表示式必須放在//之間
1.列印/etc/passwd檔案中包含root的行
[root@localhost ~]# sed -n "/root/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.將包含空格的行打印出來
[root@localhost ~]# sed -n -r "/ +/p" /etc/passwd
3.數字加正則
正則匹配是非貪婪性的匹配
貪婪性匹配是匹配到了之後,不停止繼續匹配,直到檔案所有的內容全部匹配完畢
非貪婪性匹配是一旦匹配到了就停止匹配
1、在/etc/passwd檔案中的第一行,到包含test的行,全部刪除
[root@localhost ~]# sed -r "1,/test/d" /etc/passwd
2、刪除從包含root的行到第5行的內容
[root@localhost ~]# sed -r "/root/,5d" /etc/passwd
3、從包含root的行刪除到包含ftp的行
[root@localhost ~]# sed -r "/root/,/ftp/d" /etc/passwd
4.\c與c分隔符
\c與c只是一個代表,其中c可以換成任意一個字元
[root@localhost ~]# sed -i -r "\#/sbin/nologin#d" 4.txt
[root@localhost ~]# sed -i -r "\A/sbin/nologinAd" 4.txt

sed的常用指令

p :print,列印文字,通常與-n一起使用
d :delete,刪除文字
a :append 表示追加文字,在指定行後新增一行或多行文字
c :用新檔案修改(替換)當前行中的文字
[root@localhost ~]# sed "6c dfhtgfbtrthytyjyughm" 1.txt #修改第6行的內容為 dfhtgfbtrthytyjyughm
i :insert 在當前行之前插入文字,在指定行之前新增一行或多行文字
[root@localhost ~]# sed "2i dfhtgfbtrthytyjyughm" 1.txt
練習1 : 在/etc/passwd檔案中1到3行之前插入HelloWorld
[root@localhost ~]# sed "1,3i HelloWorld" /etc/passwd
r: 從以外檔案中讀相關內容,寫到相關行之後
[root@localhost ~]# sed "1,3r 5.txt" /etc/passwd #讀取5.txt內容,寫 到/etc/passwd的1-3行之後
w : 匹配到的行寫入一個新的檔案之中
[root@localhost ~]# sed "1,5w 6.txt" /etc/passwd #讀取/etc/passwd中的1-5行寫入到6.txt中
y:將字元轉換成一個新的字元
[root@localhost ~]# sed "1,5y/sbin/1234/" /etc/passwd
sbin ---> 1234
s ---> 1
b ---> 2
i ---> 3
n ---> 4
s:用一個字元整體替換成另一個字元
[root@localhost ~]# sed "s/sbin/1234/" /etc/passwd
s指令替換對於行來說,是非貪婪性,如果需要全域性替換則需要使用 g 指令
g :全域性執行
[root@localhost ~]# sed "s/root/1234/g" /etc/passwd
i : 配合s指令配合一起使用時,則是忽略大小的作用
[root@localhost ~]# sed "s/ROOT/1234/i" /etc/passwd

練習

1:替換/etc/passwd中的root為ROOT
[root@localhost ~]# sed "s/root/ROOT/g" /etc/passwd
2:將模板機(192.168.15.200)中的ip替換成192.168.15.50
[root@localhost ~]# sed "s/\.200/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
3:刪除/etc/passwd中的所有偶數行
[root@localhost ~]# sed "1~2d" /etc/passwd
[root@localhost ~]# sed "1~3d" /etc/passwd (奇數行)

4:在每一行的行首增加#號
[root@localhost ~]# sed "s/^ */#/g" 2.txt
5:將Hello World替換成World Hello
[root@localhost ~]# sed -r "s/(Hello) (World)/\2 \1/g" 6.txt
6:將1.txt中的每一行都新增一個.bak的字尾
[root@localhost ~]# sed -r "s/(.*)/\1\.bak/g" 1.txt


.000