鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語(yǔ)句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問(wèn)題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對(duì)上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號(hào) trap

shell 學(xué)習(xí)第十三天----sed 案例分析

sed 的使用案例

使用 sed 操作 /etc/passwd,最好復(fù)制一份 (cp /etc/passwd /tmp),操作 tmp 下的 passwd(其實(shí)不用,因?yàn)樵谝话闱闆r下 sed 只是修改了輸出結(jié)果,不會(huì)改變文件本身,除非要求這么做)。

以行為單位的新增/刪除

  • 要求: 將 /etc/passwd 的內(nèi)容列出并且列印行號(hào),同時(shí)刪除 2~5 行。
  • 做法:cat /etc/passwd | sed '2,5d'

sed 的動(dòng)作是'2,5d'(動(dòng)作需要放在單引號(hào)之間)。nl 命令在 linux 系統(tǒng)中用來(lái)計(jì)算文件中行號(hào)。nl 可以將輸出的文件內(nèi)容自動(dòng)的加上行號(hào)!其默認(rèn)的結(jié)果與 cat -n 有點(diǎn)不太一樣,nl 可以將行號(hào)做比較多的顯示設(shè)計(jì),包括位數(shù)與是否自動(dòng)補(bǔ)齊 0 等等的功能。

只刪除第二行

nl /etc/passwd | sed '2d'

刪除第 3 行到最后一行

cat -n /etc/passwd | sed '3,$d'

在第二行后 (就是在第三行) 加上"i am fine" 字樣

cat -n /etc/passwd | sed '2a i am fine'

如果要在第二行前面

nl /etc/passwd | sed '2i i am fine'

如果是要增加兩行以上,在第二行后面加入兩行字,例如[hello]與[how are you]

nl /etc/passwd | sed '2a hello\
\>how are you’

每一行之間都必須要以反斜杠 () 來(lái)進(jìn)行新行的添加,所以上面的例子,我們可以發(fā)現(xiàn)在第一行的最后面就有 \ 存在。(再輸入的是會(huì)需要注意,單引號(hào)不要一起輸完)。

以行為單位的替換與現(xiàn)實(shí)

將第 2-5 行的內(nèi)容替換成"hahaha" nl /etc/passwd | sed '2,5c hahaha',通過(guò)這個(gè)方法,我們就可以替換整行數(shù)據(jù)了。

僅列出 /etc/passwd 文件的 5-7 行 cat -n /etc/passwd | sed -n '5,7p',可以透過(guò)這個(gè) sed 的以行為單位的顯示功能, 就能夠?qū)⒛骋粋€(gè)文件內(nèi)的某些行號(hào)選擇出來(lái)顯示。

數(shù)據(jù)的搜尋與顯示

搜索 /etc/passwd 中有關(guān) /root 關(guān)鍵字的行
nl /etc/passwd | sed '/root/p'

思考: 為什么會(huì)輸出所有行的情況?

使用 -n 的時(shí)候?qū)⒅淮蛴“0宓男小?/p>

nl /etc/passwd | sed -n '/root/p'

數(shù)據(jù)的搜索與刪除

刪除 /etc/passwd 所有包含 root 的行,其他行輸出

nl /etc/passwd | sed '/root/d'

數(shù)據(jù)的搜索并執(zhí)行命令

搜索 /etc/passwd,找到 root 對(duì)應(yīng)的行,執(zhí)行后面花括號(hào)中的一組命令,每個(gè)命令之間用分號(hào)分隔,這里把 bash 替換為 blueshell,再輸出這行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'

如果只替換 /etc/passwd 的第一個(gè) bash 關(guān)鍵字為 blueshell,就退出

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1

最后的 q 是退出。

數(shù)據(jù)的搜索并替換

除了整行的處理模式之外,sed 還可以用行為單位進(jìn)行部分?jǐn)?shù)據(jù)的搜尋并替換。 基本上 sed 的搜尋與替換與 vi 相當(dāng)?shù)念?lèi)似。 sed 's/ 要被取代的字符串 / 新的字符串 /g'

先通過(guò) /sbin/ifconfig eth0 查看本機(jī)的 IP 地址,我的是 (192.168.199.5)

將 IP 前面部分予以刪除

/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g'

將 IP 后面部分予以刪除

/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

即可得到 IP

多點(diǎn)編輯

一條 sed 命令,刪除 /etc/passwd 第三行到末尾的數(shù)據(jù),并把 bash 替換成 hahaha。

nl /etc/passwd | sed -e '3,$d' -e 's/bash/hahaha/g'

注意: 每天命令前面都加入了 -e 選項(xiàng)

直接修改文件內(nèi)容

最好別使用,如果使用需要加入一個(gè) -i 選項(xiàng)
例如在最后一行插入 hahaha,nl /etc/passwd | sed -i '$i hahaha'