Shell中sed編輯器的具體使用
1.簡介
sed是一種流編輯器,流編輯器會在編輯器處理數據之前基于預先提供的一組規(guī)則來編輯數據流。
sed編輯器可以根據命令來處理數據流中的數據,這些命令要么從命令行中輸入,要么存儲在一個命令文本文件中。
2.sed編輯器的工作流程
sed 的工作流程主要包括讀取、執(zhí)行和顯示三個過程:
- 讀取: sed從輸入流(文件、管道、標準輸入)中讀取一行內容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space )。
- 執(zhí)行:默認情況下,所有的sed 命令都在模式空間中順序地執(zhí)行, 除非指定了行的地址,否則sed命令將會在所有的行上依次執(zhí)行。
- 顯示:發(fā)送修改后的內容到輸出流(屏幕)。在發(fā)送數據后,模式空間將會被清空。在所有的文件內容都被處理完成之前,上.述過程將重復執(zhí)行,直至所有內容被處理完。
在所有的文件內容都被處理完成之前,上述過程將重復執(zhí)行,直至所有內容被處理完。
注意:默認情況下所有的sed命令都是在模式空間內執(zhí)行的,因此輸入的文件并不會發(fā)生任何變化,除非是用重定向存儲輸出或者sed -i.
3.sed命令格式
sed -e '操作' 文件1 文件2.. sed -n -e '操作1;操作2' 文件1 文件2 .. sed -f 腳本文件 文件1 文件2 ... sed -i -e '操作' 文件1 文件2 ... sed -e 'n { 操作1 操作2 }' 文件1 文件2 ...
常用選項:
選項 | 作用 |
-e或--expression= | 表示用指定命令來處理輸入的文本文件,只有一個操作命令時可省略,一般在執(zhí)行多個操作命令使用 |
-f或--file= | 表示用指定的腳本文件來處理輸入的文本文件 |
-h或--help | 顯示幫助 |
-n、--quiet或silent | 禁止sed編輯器輸出,但可以與p命令一起使用完成輸出 |
-i | 直接修改目標文本文件 (建議先驗證命令或備份目標文件) |
-r | sed 的動作支持的是延伸型正規(guī)表示法的語法。(默認是基礎正規(guī)表示法語法) |
常用選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f FILE 從指定文件中讀取編輯腳本
-r, -E 使用擴展正則表達式
-i.bak 備份文件并原處編輯#說明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 會清空文件
常用操作:
操作 | 作用 |
s | 替換,替換指定字符 |
d | 刪除,刪除選定的行 |
a | 增加,在當前行下面增加一行指定內容 |
i | 插入,在選定行上面插入一行指定內容 |
c | 替換,將選定行替換為指定內容 |
y | 字符轉換,轉換前后的字符長度必須相同 |
p | 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以ASCII碼輸出。其通常與"-n"選項一起使用。 |
= | 打印行號 |
l(小寫L) | 打印數據流中的文本和不可打印的ASCII字符(比如結束符$、制表符\t) |
sed -p 打印
sed -n:禁止sed編輯器輸出
操作‘=’:打印行號
操作 “l”:打印數據流中的文本和不可打印的ASCII字符
sed -e 多個操作
sed -n -e '命令1' -e '命令2' 文件 或者 sed -n -e '命令1;命令2' 文件 或者 sed -n ' 命令1 命令2 .... ' 文件
4.對指定行操作(尋址)
4.1以數字形式表示行區(qū)間
sed -n '#p' #代表行號 打印第#行內容 sed -n '#,@p' #代表行號 打印第#行到第@行內容 sed -n '$p' #代表行號 打印最后一行內容 sed -n '#,+@p' #代表行號 打印第#行到第@+#行內容 sed -e '#q' #代表行號 打印第1行到第#行內容
1.
第一行 sed -n '1p' 3.txt 1-4行 sed -n '1,4p' 3.txt 最后一行 sed -n '$p' 3.txt
2.
用 + 打印1-2行 sed -n '1,+2p' 3.txt 打印2-4行 sed -n '2,+2p' 3.txt
3.
用 q 打印第一行到第三行 sed -e '3q' 3.txt
4.打印奇數行或者偶數行
4.2字符串過濾行
1.匹配文件中包含root的行
2.匹配root開頭的行
3.匹配以bash結尾的行
4.匹配文件中,包含root或者bash的行,擴展正則需加上-r
5.從第二行開始,到第一個含有root行結束的行
6.匹配文件中rt中含有2個o的行
5.刪除指定行 sed 'd'
sed '/#/,/@/d' 文件名
sed會讀取每行的內容,從第一個位置#打開刪除功能,到第二位置@刪完后關閉刪除功能,再繼續(xù)查詢與 #和@匹配的行 進行刪除 一直重復此操作
6.替換
6.1字符串
格式:
行范圍 s/舊字符串/新字符串/替換標記
替換標記
s/pattern/string/修飾符 查找替換,支持使用其它分隔符,可以是其它形式:s@@@,s###
替換修飾符:
g 行內全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文件中
I,i 忽略大小寫
替換標記 | 作用 |
數字 | 表明新字符串將替換第幾處匹配的地方 |
g | 表明新字符串將會替換所有匹配的地方 |
p | 打印與替換命令匹配的行,與-n一起使用 |
w文件 | 將替換的結果寫到文件中 |
- sed -g
- sed -s
1.替換
sed -n 's/root/admin/p' /etc/passwd ###將每一行的第一個root替換為admin sed -n 's/root/admin/2p' /etc/passwd ###將每行的第二個root替換為admin
sed -n 's/root/admin/3p' /etc/passwd ###將每行的第三個root替換成admin sed -n 's/root/admin/gp' /etc/passwd ###將每行的所有root,替換成admin
替換命令的分隔符看 s后面跟的字符,3個分隔符要保持一致,如果遇到跟分隔符相同的字符則需要使用"\"來轉義
將/bin/bash 轉換為 /sbin/nologin
因為替換的格式為 s/舊/新 此處的"/"為分隔符 但是/bin/bash與/sbin/nologin中的"/"為根,容易引起歧義
1.1可以使用"\"轉義字符將"/"轉義為普通字符
1.2.或者使用其他字符作為分隔符,且所有分隔符保持一致(s后面的內容就是分隔符)
2.添加
2.1###給passwd文件,開頭都加上#
sed 's/^/#/' /etc/passwd
2.2###兩種給含有root坐在行注釋的方法
2.3###注釋前十行
2.4###重定向到文件中
3.刪除
6.2替換整行內容
替換前與替換后的字符可以不一致
sed '#c 新內容 文件名 #替換第#行的全部內容 或者 sed '/舊內容/c 新內容' 文件名 #將被篩選到(含有舊內容)的行替換為新內容
6.3字符替換
替換前與替換后的字符個數需要一致
sed 'y/舊內容/新內容/' 文件名
7.增加(插入)內容
7.1在行前插入
$i ###在文件最后一行,前面添加 1i ###在文件第一行,前面添加
7.2在行后插入內容
1a ###在第一行后面添加 $a ###在最后一行的后面添加
7.3插入文件內容
7.4調換順序
8.小案例
1.顯示幾點到幾分的日志
sed -n '/2018:08:09/,/2018:09:42:37/p' access_log
2.奇偶數
3.-i 修改文件
4.-a 追加
5.\:空格 \n:換行
6. 2i###第二行前面
7. 2c###將第二行替換
8.取反
9.分組
1. \2的意思
2. sed分組取地址
3. 取IP地址
-n:不自動打印,就不會重復輸出了
-r:開啟擴展正則,就不用加轉義了,但是你寫入的命令,還是要轉義
到此這篇關于Shell中sed編輯器的具體使用的文章就介紹到這了,更多相關Shell sed編輯器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解linux下利用crontab創(chuàng)建定時任務
這篇文章主要介紹了linux下利用crontab創(chuàng)建定時任務的相關資料,需要的朋友可以參考下2017-04-04Linux命令行循環(huán)執(zhí)行shell命令
這篇文章主要介紹了Linux命令行,循環(huán)執(zhí)行shell命令的相關知識,主要包括死循環(huán),普通計數循環(huán),以及Linux shell循環(huán)命令 while死循環(huán)的用法,需要的朋友可以參考下2023-01-01