前言:
? ? ? ?Shell三劍客是grep、sed和awk三個工具的簡稱,因功能強大,使用方便且使用頻率高,因此被戲稱為三劍客,熟練使用這三個工具可以極大地提升運維效率。
? ? ? ?sed是一個流編輯器,用于對文本進行編輯、替換、刪除等操作。sed通過讀取、執行和顯示三個過程來工作,可以在無交互的情況下實現復雜的文本處理操作。
一、sed命令參數描述
1.sed命令選項
-n 不打印所有行到標準輸出
-e 表示將下一個字符串解析為sed命令,如果只傳遞一個編輯命令給sed,-e選項可以省略
-f 表示正在調用sed腳本文件
2.sed命令定位文本的方法
x x為指定行號
x,y 指定從x到y的行號范圍
/pattern/ 查詢包含模式的行
/pattern/pattern/ 查詢包含兩個模式的行
/pattern/,x 從與pattern的匹配行到x號行之間的行
x,/pattern/ 從x號行到與patter匹配的行之間的行
x,y! 查詢不包括x和y行號的行
3.sed編輯命令?
p 打印匹配行
= 打印文件行號
a\ 在定位行號之后追加文本信息
i\ 在定位行號之前插入文本信息
d 刪除定位行
c\ 用新文本替換定位文本
s 使用替換模式替換相應模式
r 從另一個文件中讀文本
w 將文本寫入到一個文件
y 變換字符
q 第一個模式匹配完成后推出
l 顯示與八進制ACSII碼等價的控制字符
{} 在定位行執行的命令組
n 讀取下一個輸入行,用下一個命令處理新的行
h 將模式緩沖區的文本復制到保持緩沖區
H 將模式緩沖區的文本追加到保持緩沖區
x 互換模式緩沖區和保持緩沖區的內容
g 將保持緩沖區的內容復制到模式緩沖區
G 將保持緩沖區的內容追加到模式緩沖區
二、sed應用舉例
1.sed命令選項舉例
sed編輯命令p實現打印匹配行,-n表示不打印所有行
#查看文件全部內容
[root@test02 ~]# cat a.txt
#sfsd
fsjdf
fdfs#執行sed命令帶-n選項,只打印文本第一行
[root@test02 ~]# sed -n '1p' a.txt
#sfsd#執行sed命令不帶-n選項,打印文本第一行和文本全部內容
[root@test02 ~]# sed '1p' a.txt
#sfsd
#sfsd
fsjdf
fdfs#打印范圍行,1到2行
[root@test02 ~]# sed -n '1,2p' a.txt
#sfsd
fsjdf#利用/pattern/進行模式匹配,且匹配是大小寫敏感的
[root@test02 ~]# sed -n '/fsjdf/p' a.txt
fsjdf
[root@test02 ~]# sed -n '/sfsd/p' a.txt
#sfsd
sed -e用法
#-e表示將下一個字符串解析為sed編輯命令,如果只傳遞一個編輯命令給sed,-e選項可以忽略。
#只有項sed傳遞多個編輯命令時,-e才有用武之地#打印行號命令
[root@test02 ~]# sed -n '/sfsd/=' a.txt
1
[root@test02 ~]# sed -n '/fsjdf/=' a.txt
2
#打印行的內容及行號
[root@test02 ~]# sed -n -e '/fsjdf/p' -e '/fsjdf/=' a.txt
fsjdf
2
?sed -f選項
#-f選項只有調用sed腳本文件時才起作用,
#追加文本格式
#sed '指定地址a\追加文本' 操作文件[root@test02 ~]# cat append.sed
#!/bin/sed -f
/my/a\
we append a new line#在my關鍵字這一行之后追加文本
[root@test02 ~]# ./append.sed a.txt
#sfsd
what is your name
my name is Andy Law
we append a new line
zhen ta ma caodan!
fsjdf
fdfsaaaa
2.sed文本定位舉例
匹配元字符需使用轉義字符“\”
#匹配元字符
[root@test02 ~]# sed -n '/\!/p' a.txt
zhen ta ma caodan!
#sed命令可以正則表達式可以匹配元字符,$正則中表示行尾,sed中表示最后一行,最后一行為空行
[root@test02 ~]# sed -n '$p' a.txt#打印1到2行之外的行
[root@test02 ~]# sed -n '1,2!p' a.txt
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfs#打印匹配關鍵字my到最后一樣
[root@test02 ~]# sed -n '/my/,$p' a.txt
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
#打印第2行到my關鍵字匹配的行
[root@test02 ~]# sed -n '2,/my/p' a.txt
what is your name
my name is Andy Law
3.sed基本編輯命令舉例
插入命令i\
#sed編輯命令插入文本的符號為i\,插入文本的格式為:
sed '指定地址i\插入文本' 輸入文件[root@test02 ~]# cat insert.sed
#!/bin/sed -f
/my/i\
we insert a new line [root@test02 ~]# ./insert.sed a.txt
#sfsd
what is your name
we insert a new line
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
修改文本 c\
#sed編輯命令的修改文本符號為c\,格式為:
sed '指定地址c\更換文本' 輸入文件[root@test02 ~]# cat modify.sed
#!/bin/sed -f
/my/c\
we modify this line
[root@test02 ~]# ./modify.sed a.txt
#sfsd
what is your name
we modify this line
zhen ta ma caodan!
fsjdf
fdfsaaaa
刪除文本d
#sed編輯命令刪除文本符號為d,格式為:
sed '指定地址d' 操作文件[root@test02 ~]# cat a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
[root@test02 ~]# sed '2d' a.txt
#sfsd
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
#刪除最后一行
[root@test02 ~]# sed '$d' a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfs
#刪除5到最后一行
[root@test02 ~]# sed '5,$d' a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
?替換文本s
#sed編輯命令替換文本的符號為s,格式為:
sed 's/被替換文本/新替換文本/[替換選項]' 輸入文本g 表示替換文本中所有出現被替換字符串之處
p 與-n選項結合,只打印替換行
w 文件名 表示將輸出定向到一個文件[root@test02 ~]# sed 's/my/your/' a.txt
#sfsd
what is your name
your name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
寫入一個新的文件
#寫入文本符號w,格式為:
sed '指定地址 w 文件名' 操作文件#將a.txt文件1到3行生成新文件輸入到nuw.txt
[root@test02 ~]# sed -n '1,3 w new.txt' a.txt
[root@test02 ~]# cat new.txt
#sfsd
what is your name
my name is Andy La[root@test02 ~]# sed -n '/my/ w new.txt' a.txt
[root@test02 ~]# cat new.txt
my name is Andy Law