linux基础——sed
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
sed
- 一、sed語法格式
- 1、sed [-nefr] [動作]
- 1.2 sed參數使用說明_示例
- 1.2.1 以行為單位的新增/刪除
- 1.2.1.1 將第2~6行刪除【sed '2,6d'】
- 1.2.1.2 只刪除第2行【sed '2d'】
- 1.2.1.3 刪除第3行至最后一行【sed '3,$d'】
- 1.2.1.4 在第二行后加上一句話【sed '2a zpzp'】
- 1.2.1.5 在第二行的前面加上一句話【sed '2i zpzp'】
- 1.2.1.6 增加兩行以上【sed '2a xxx\yyy'】
- 1.2.2 以行為單位的替換與顯示
- 1.2.2.1 將第2行替換為指定句子【sed '2c zzzpp'】
- 1.2.2.2 將2~5行替換為指定句子【sed '2,5c zzzpp'】
- 1.2.2.3 僅列出第2~5行【sed -n'2,5p'】
- 1.2.3 數據的搜尋并顯示
- 1.2.3.1 搜索有關鍵字root的行【sed '/root/p'】
- 1.2.3.2 搜索包含root的行,且只打印關鍵字所在行【sed -n '/root/p'】
- 1.2.4數據搜索并刪除【sed '/root/d'】
- 1.2.5 數據的搜尋并執行命令【sed -n '/root/{s/aaa/bbb/;p}'】
- 1.2.6 數據的搜尋并替換
- 1.2.6.1 將 IP 前面的部分予以刪除【sed 's/^.*inet //g'】
- 1.2.6.2 將 IP 后面的部分予以刪除【sed 's/netmask.*$//g'】
- 1.2.7 多點編輯【sed -e 'xxx' -e 'xxx'】
- 1.2.8 直接修改文件內容(危險動作)
- 1.2.8.1 直接修改文件【sed -i ''】
- 1.2.8.2 直接在文件末尾加上一行【sed -i '$a zz'】
一、sed語法格式
1、sed [-nefr] [動作]
| -n | 使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。 |
| -e | 直接在命令列模式上進行 sed 的動作編輯; |
| -f | 直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作; |
| -r | sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法) |
| -i | 直接修改讀取的文件內容,而不是輸出到終端。 |
| a | 新增,a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行) |
| c | 取代,c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行 |
| d | 刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚 |
| i | 插入,i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行) |
| p | 列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行 |
| s | 取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦 |
\s:表示空格
^:表示開頭
$:表示結尾
1.2 sed參數使用說明_示例
1.2.1 以行為單位的新增/刪除
1.2.1.1 將第2~6行刪除【sed ‘2,6d’】
sed '2,6d'
//將 /etc/passwd 的內容列出并且列印行號,同時,請將第 2~6 行刪除! [root@localhost sed_test]# nl passwd_bak.txt 1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin.....(后面省略).....[root@localhost sed_test]# nl passwd_bak.txt |sed '2,6d'1 root:x:0:0:root:/root:/bin/bash7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin.....(后面省略).....sed 的動作為 '2,6d' ,那個 d 就是刪除!因為 2-6 行給他刪除了,所以顯示的數據就沒有 2- 6行羅~ 另外,注意一下,原本應該是要下達 sed -e 才對,沒有 -e 也行哦~同時也要注意的是, sed 后面接的動作,請務必以 '' 兩個單引號括住喔!
1.2.1.2 只刪除第2行【sed ‘2d’】
sed '2d'
//只刪除第2行 [root@localhost sed_test]# nl passwd_bak.txt | sed '2d'1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin.....(后面省略).....1.2.1.3 刪除第3行至最后一行【sed ‘3,$d’】
sed '3,$d'
//要刪除第 3 到最后一行 [root@localhost sed_test]# nl passwd_bak.txt |sed '3,$d'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost sed_test]#1.2.1.4 在第二行后加上一句話【sed ‘2a zpzp’】
`sed ‘2a zpzp’
//在第二行后面加上一句話(也就是加在第三行) [root@localhost sed_test]# nl passwd_bak.txt 1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin.....(后面省略).....[root@localhost sed_test]# nl passwd_bak.txt | sed -e '2a zpzp '1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin zpzp 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin.....(后面省略).....[root@localhost sed_test]# cat passwd_bak.txt | sed '2a zpzp' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin zpzp daemon:x:2:2:daemon:/sbin:/sbin/nologin1.2.1.5 在第二行的前面加上一句話【sed ‘2i zpzp’】
sed '2i zpzp'
記得2i和zpzp間不用加標點,直接空格就行
1.2.1.6 增加兩行以上【sed ‘2a xxx\yyy’】
sed '2a xxx\
>yyy'
每一行之間都必須要以反斜杠『 \ 』來進行新行的添加喔!所以,上面的例子中,我們可以發現在第一行的最后面就有 \ 存在
1.2.2 以行為單位的替換與顯示
1.2.2.1 將第2行替換為指定句子【sed ‘2c zzzpp’】
sed '2c zzzpp'
//將第2行替換為指定句子【sed '2c zzzpp'】 [root@localhost sed_test]# nl passwd_bak.txt | sed '2c zzzpp'1 root:x:0:0:root:/root:/bin/bash zzzpp3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin.....(后面省略).....1.2.2.2 將2~5行替換為指定句子【sed ‘2,5c zzzpp’】
sed '2,5c zzzpp'
//將2~5行替換為指定句子【sed '2,5c zzzpp'】 [root@localhost sed_test]# nl passwd_bak.txt | sed '2,5c zzzpp'1 root:x:0:0:root:/root:/bin/bash zzzpp6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown.....(后面省略).....1.2.2.3 僅列出第2~5行【sed -n’2,5p’】
sed -n '2,5p'
記得-n和p一定要一起使用
可以透過這個 sed 的以行為單位的顯示功能, 就能夠將某一個文件內的某些行號選擇出來顯示。
1.2.3 數據的搜尋并顯示
1.2.3.1 搜索有關鍵字root的行【sed ‘/root/p’】
sed '/root/p'
記得關鍵字要用兩個/符號包圍
發現root找到了,除了輸出所有行,還會輸出匹配行,因此第1、10行都展示了2次
1.2.3.2 搜索包含root的行,且只打印關鍵字所在行【sed -n ‘/root/p’】
sed -n '/root/p'
//搜索包含root的行,且只打印關鍵字所在行【sed -n '/root/p'】 [root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/p'1 root:x:0:0:root:/root:/bin/bash10 operator:x:11:0:operator:/root:/sbin/nologin [root@localhost sed_test]#1.2.4數據搜索并刪除【sed ‘/root/d’】
sed '/root/d'
//數據搜索并刪除【sed '/root/d'】 [root@localhost sed_test]# nl passwd_bak.txt | sed '/root/d'2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin....下面忽略第1、10行已經被刪除了
1.2.5 數據的搜尋并執行命令【sed -n ‘/root/{s/aaa/bbb/;p}’】
sed -n '/root/{s/aaa/bbb/;p}'
/root/:是搜索root的動作,后面接的{}是下一個命令
注意:s是取代,找到第一個關鍵詞,用第二個來取代第一個
s///g:結尾有g,表示全文全部替換
s///;q:結尾沒有g,有一個 ;q 是退出,找到第一個替換后就退出
搜索passwd文件,找到root對應的行,執行后面花括號中的一組命令,每個命令之間用分號分隔,這里把root替換為zzzzppp,再輸出這行:
1.2.6 數據的搜尋并替換
1.2.6.1 將 IP 前面的部分予以刪除【sed ‘s/^.*inet //g’】
sed 's/^.*inet //g'
//將 IP 前面的部分予以刪除【sed 's/^.*inet //g'】 [root@localhost sed_test]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.255inet6 fe80::20c:29ff:fe90:d031 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:90:d0:31 txqueuelen 1000 (Ethernet)RX packets 2479 bytes 190645 (186.1 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 1139 bytes 161823 (158.0 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@localhost sed_test]# ifconfig ens33 | grep -w inetinet 192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.255[root@localhost sed_test]# ifconfig ens33 | grep -w inet |sed 's/^.inet //g'inet 192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.255[root@localhost sed_test]# ifconfig ens33 | grep -w inet |sed 's/^.*inet//g'192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.255[root@localhost sed_test]# ifconfig ens33 | grep -w inet |sed 's/^.*inet //g' 192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.2551.2.6.2 將 IP 后面的部分予以刪除【sed ‘s/netmask.*$//g’】
sed 's/netmask.*$//g'
//將 IP 后面的部分予以刪除【sed 's/netmask.*$//g'】 [root@localhost sed_test]# ifconfig ens33 | grep -w inet |sed 's/^.*inet //g' 192.168.153.128 netmask 255.255.255.0 broadcast 192.168.153.255[root@localhost sed_test]# ifconfig ens33 | grep -w inet |sed 's/^.*inet //g' | sed 's/netmask.*$//g' 192.168.153.128 [root@localhost sed_test]#1.2.7 多點編輯【sed -e ‘xxx’ -e ‘xxx’】
sed -e 'xxx' -e 'xxx'
//多點編輯【sed -e 'xxx' -e 'xxx'】 //一條sed命令,刪除/etc/passwd第三行到末尾的數據,并把bash替換為blueshell [root@localhost sed_test]# nl passwd_bak.txt | sed -e '3,$d'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost sed_test]#[root@localhost sed_test]# nl passwd_bak.txt | sed -e '3,$d' -e 's/bash/blueshell/'1 root:x:0:0:root:/root:/bin/blueshell2 bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost sed_test]#//這個時候末尾不用加;p [root@localhost sed_test]# nl passwd_bak.txt | sed -e '3,$d' -e 's/bash/blueshell/;p'1 root:x:0:0:root:/root:/bin/blueshell1 root:x:0:0:root:/root:/bin/blueshell2 bin:x:1:1:bin:/bin:/sbin/nologin2 bin:x:1:1:bin:/bin:/sbin/nologin1.2.8 直接修改文件內容(危險動作)
1.2.8.1 直接修改文件【sed -i ‘’】
sed -i ''
//查看文件中以h結尾的行有哪些 [root@localhost sed_test]# nl passwd_bak.txt | sed -n '/bas/p'1 root:x:0:0:root:/root:/bin/bash20 u1:x:1000:1001::/home/u1:/bin/bash21 u2:x:1001:1002::/home/u2:/bin/bash22 u3:x:1002:1003::/home/u3:/bin/bash23 u4:x:1003:1004::/home/u4:/bin/bash24 u5:x:1004:1005::/home/u5:/bin/bash//直接修改文件,將以h結尾的行,h替換為zz,全文中符合的都替換 [root@localhost sed_test]# sed -i 's/h$/zz/g' passwd_bak.txt//查看文件中包含bas的行,檢查是否真正替換完成 [root@localhost sed_test]# nl passwd_bak.txt | sed -n '/bas/p'1 root:x:0:0:root:/root:/bin/baszz20 u1:x:1000:1001::/home/u1:/bin/baszz21 u2:x:1001:1002::/home/u2:/bin/baszz22 u3:x:1002:1003::/home/u3:/bin/baszz23 u4:x:1003:1004::/home/u4:/bin/baszz24 u5:x:1004:1005::/home/u5:/bin/baszz [root@localhost sed_test]#1.2.8.2 直接在文件末尾加上一行【sed -i ‘$a zz’】
sed -i '$a zz'
其中$a:$表示最后一行,a表示添加,空格連接要添加的內容zz,-i表示直接在原文修改
總結
以上是生活随笔為你收集整理的linux基础——sed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019.08.17 Webpack4
- 下一篇: linux 其他常用命令