日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux基础——sed

發布時間:2023/12/20 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 動作;
-rsed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
-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/nologin

1.2.1.5 在第二行的前面加上一句話【sed ‘2i zpzp’】

sed '2i zpzp'
記得2i和zpzp間不用加標點,直接空格就行

//在第二行的前面加上一句話 [root@localhost sed_test]# nl passwd_bak.txt | sed -e '2i zpzp '1 root:x:0:0:root:/root:/bin/bash zpzp 2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin.....(后面省略).....

1.2.1.6 增加兩行以上【sed ‘2a xxx\yyy’】

sed '2a xxx\
>yyy'

//增加兩行以上【注意中間的\不能省去,是需要我們手敲上后執行回車的】 [root@localhost sed_test]# cat passwd_bak.txt | sed '2a zpzp\ > wwwzzz' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin zpzp wwwzzz daemon:x:2:2:daemon:/sbin:/sbin/nologin



每一行之間都必須要以反斜杠『 \ 』來進行新行的添加喔!所以,上面的例子中,我們可以發現在第一行的最后面就有 \ 存在

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一定要一起使用

//僅列出第2~5行【sed -n'2,5p'】 [root@localhost sed_test]# nl passwd_bak.txt | sed -n '2,5' sed: -e expression #1, char 3: missing command [root@localhost sed_test]# nl passwd_bak.txt | sed -n '2,5p'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/nologin

可以透過這個 sed 的以行為單位的顯示功能, 就能夠將某一個文件內的某些行號選擇出來顯示。

1.2.3 數據的搜尋并顯示

1.2.3.1 搜索有關鍵字root的行【sed ‘/root/p’】

sed '/root/p'
記得關鍵字要用兩個/符號包圍

//搜索有關鍵字root的行【sed '/root/p'】 //先查出來文件中哪行有root [root@localhost sed_test]# cat passwd_bak.txt | grep -in root 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [root@localhost sed_test]# //用sed命令搜索root [root@localhost sed_test]# nl passwd_bak.txt | sed '/root/p'1 root:x:0:0:root:/root:/bin/bash1 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/nologin10 operator:x:11:0:operator:/root:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin....下面忽略

發現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 是退出,找到第一個替換后就退出

//數據的搜尋并執行命令【sed -n '/root/{s/aaa/bbb/;p}'】 //查看當前文件中有幾個root [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]#[root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/{s/root/zzzzppp/;p}'1 zzzzppp:x:0:0:root:/root:/bin/bash10 operator:x:11:0:operator:/zzzzppp:/sbin/nologin[root@localhost sed_test]# [root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/{s/root/wwww/g;p}'1 wwww:x:0:0:wwww:/wwww:/bin/bash10 operator:x:11:0:operator:/wwww:/sbin/nologin[root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/{s/root/zzzzppp/;p;q}'1 zzzzppp:x:0:0:root:/root:/bin/bash [root@localhost sed_test]#[root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/{s/bash/wwww/g;p}'1 root:x:0:0:root:/root:/bin/wwww10 operator:x:11:0:operator:/root:/sbin/nologin[root@localhost sed_test]# nl passwd_bak.txt | sed -n '/root/{s/bash/wwww/g;p;q}'1 root:x:0:0:root:/root:/bin/wwww

搜索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.255

1.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/nologin

1.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表示直接在原文修改

//直接在文件末尾加上一行 [root@localhost sed_test]# sed -i '$a zz' passwd_bak.txt[root@localhost sed_test]# cat passwd_bak.txt root:x:0:0:root:/root:/bin/baszz bin:x:1:1:bin:/bin:/sbin/nologin ...中間省略....... home/u4:/bin/baszz u5:x:1004:1005::/home/u5:/bin/baszz zz [root@localhost sed_test]#

總結

以上是生活随笔為你收集整理的linux基础——sed的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。