關(guān)于linux三劍客
-
grep,過濾關(guān)鍵字信息數(shù)據(jù)。主要是用于查文本內(nèi)的數(shù)據(jù)
-
sed ,對文本數(shù)據(jù)進(jìn)行編輯,修改原文件內(nèi)容
-
awk,對文件數(shù)據(jù)過濾,提取,并且能實現(xiàn),格式化輸出
-
awk對文件數(shù)據(jù)處理后,還能更美觀的展示數(shù)據(jù)
-
sed是什么
-
sed軟件本身
-
sed提供的加工的命令
-
給sed提供的源數(shù)據(jù)

sed語法格式
sed [選項] [sed內(nèi)置命令字符] [輸入文件]
說明:
1.注意 sed 軟件及后面選項,sed 命令和輸入文件,每個元素之間都至少有一個空格
2.為了避免混淆,文本稱呼sed為sed軟件.sed-commands(sed命令)是sed軟件內(nèi)置的一些命令選項,為了和前面的 options(選項)區(qū)分,故稱為sed命令.
3.sed-commands 既可以是單個sed 命令,也可以是多個sed命令組合.
4.input-file(輸入文件)是可選項,sed 還能夠從標(biāo)準(zhǔn)輸入或管道獲取輸入
語法
sed替換字符數(shù)據(jù)
s替換指令
#替換前的數(shù)據(jù)(正則)#替換后的數(shù)據(jù)#
sed 's#替換前的數(shù)據(jù)#替換后的數(shù)據(jù)#' file.txt
sed命令執(zhí)行過程
概括流程:
sed 軟件從文件或管道讀取一行,處理一行,輸出一行;再讀取一行.再處理一行.在輸出一行....

sed參數(shù)
sed默認(rèn)修改的是模式空間內(nèi)的數(shù)據(jù)
(簡單大白話,sed讀取了一行文本數(shù)據(jù),放入到內(nèi)存里進(jìn)行修改,修改的結(jié)果默認(rèn)不會寫入到文件中,只是在內(nèi)存里修改,且打印讓你看到修改的結(jié)果)
吧修改的結(jié)果寫入到文件
就得借助參數(shù)的功能
-i 把sed處理的結(jié)果,寫入到文件,且不在終端打印了
sed -i 's#替換前的數(shù)據(jù)#替換后的數(shù)據(jù)#' file.txt
options[選項]
解釋說明
-n 取消默認(rèn)的 sed 軟件的輸出,常與 sed 命令的 p 連用
-e 一行命令語句可以執(zhí)行多條 sed 命令
-f 選項后面可以接 sed 腳本的文件名
-r 使用正則拓展表達(dá)式,默認(rèn)情況 sed 只識別基本正則表達(dá)式
-i 直接修改文件內(nèi)容,而不是輸出終端,如果不使用-i 選項 sed 軟件只是修改在 內(nèi)存中的數(shù)據(jù),并不影響磁盤上的文件
sed命令
sed提供了很多功能的指令
在某一行插入數(shù)據(jù)
替換字符數(shù)據(jù)
sed-commands[sed 命令]
解釋說明
a 追加,在指定行后添加一行或多行文本
c 取代指定的行
d 刪除指定的行
D 刪除模式空間的部分內(nèi)容,直到遇到換行符
結(jié)束操作,與多行模式相關(guān)
i 插入,在指定的行前添加一行或多行文本
h 把模式空間的內(nèi)容復(fù)制到保持空間
H 把模式空間的內(nèi)容追加到保持空間
g 把保持空間的內(nèi)容復(fù)制到模式空間
G 把保持空間的內(nèi)容追加到模式空間
x 交換模式空間和保持空間的內(nèi)容
l 打印不可見的字符
n 清空模式空間,并讀取下一行數(shù)據(jù)并追加到模式空間
N 不清空模式空間,并讀取下一行數(shù)據(jù)并追加到模式空間
p 打印模式空間的內(nèi)容,通常 p 會與選項-n 一起使用
P(大寫) 打印模式空間的內(nèi)容,直到遇到換行符你結(jié)束操作
q 退出 sed
r 從指定文件讀取數(shù)據(jù)
s 取代,s#old#new#g==>這里 g 是 s 命令的替代標(biāo)志,注意和 g 命令區(qū)分
w 另存,把模式空間的內(nèi)容保存到文件中
y 根據(jù)對應(yīng)位置轉(zhuǎn)換字符
:label 定義一個標(biāo)簽
t 如果前面的命令執(zhí)行成功,那么就跳轉(zhuǎn)到 t 指定的標(biāo)簽處,繼續(xù)往下執(zhí)行后 續(xù)命令,否則,仍然繼續(xù)正常的執(zhí)行流程
sed匹配文本范圍

sed的修改字符與取消默認(rèn)輸出

sed增刪改查(練習(xí)) 練習(xí)期間,別用-i參數(shù),去修改源文件,直接看替換結(jié)果
sed增加字符命令
"a":追加文本到指定行,記憶方法:a 的全拼是 apend,,意思是追加 添加一行或多行文本
3a 表示在第三行下面追加數(shù)據(jù)
"i":插入文本到指定行前,記憶方法:i 的全拼是 insert,意思是插入 添加一行或多行文本
3i 在第三行上面插入數(shù)據(jù)
單行增加命令
sed '行號 sed指令 你想添加的字符數(shù)據(jù)' 源文件
在文件第二行后,插入數(shù)據(jù),"今天又是美好的一天"
[242-yuchao-class01 root ~]#sed '2 a "今天又是美好的一天" ' t1.log
My name is yuchao.
I teach linux.
"今天又是美好的一天"
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn
在第二行前,插入數(shù)據(jù)
sed '2 i 今天霧霾比較大' t1.log
sed多行增加
增加的數(shù)據(jù)存在換行
cat實現(xiàn)多行文本追加
cat >>my.log<<EOF
你好
我好
他也好
EOF
echo 追加多行數(shù)據(jù)
用法如下
[242-yuchao-class01 root ~]#echo -e "hello
world
你好
我也好" > hello.log
[242-yuchao-class01 root ~]#cat hello.log
hello
world
你好
我也好
sed追加多行文本
cat、還是echo,都只能往文件末尾追加內(nèi)容。
而sed是按行處理文本,可以指定要處理的行,也就是在指定行插入字符數(shù)據(jù)。
使用 添加多行數(shù)據(jù)
給t1.log 開頭,添加兩行數(shù)據(jù)
加油
奧力給
[242-yuchao-class01 root ~]#sed -i '1 i 加油
奧力給' t1.log
[242-yuchao-class01 root ~]#cat -n t1.log
1加油
2奧力給
3My name is yuchao.
4I teach linux.
5I like play computer game.
6My qq is 877348180.
7My website is http://www.yuchaoit.cn
練習(xí)sed追加配置文件信息(單行)
1.練習(xí),修改nginx配置文件,在第39行插入新數(shù)據(jù) listen 81;
只修改,且終端上看到修改結(jié)果,但是不修改文件
sed '39 i listen 81;' /etc/nginx/nginx.conf
sed -i '39 i listen 81;' /etc/nginx/nginx.conf
修改sshd_config實戰(zhàn)
例如我們在系統(tǒng)初始化優(yōu)化時,需要修改sshd服務(wù)端設(shè)置,需要加入如下多行配置
Port 25515 # 改端口
PermitRootLogin no # 不允許root登錄
PerminEmptyPasswords no # 不允許空密碼
UseDNS no # 不做主機(jī)名解析,加速ssh連接
GSSAPIAuthentication no # 不做主機(jī)名解析,加速ssh連接
修改配置之前先備份源文件
源文件 /etc/ssh/sshd_config
備份,添加ori后綴
cp /etc/ssh/sshd_config{,.ori}
sed寫入多行配置 在開頭加入這些配置
sed -i '1 i Port 25515
PermitRootLogin no
PerminEmptyPasswords no
UseDNS no
GSSAPIAuthentication no' /etc/ssh/sshd_config
sed刪除字符數(shù)據(jù)
d 刪除指定的行
d 命令,表示刪除字符,delete意思
sed默認(rèn)是多行處理所有文本,如果不指定范圍,sed默認(rèn)是刪除所有文本行數(shù)據(jù)了
sed 刪除第二行數(shù)據(jù)
[242-yuchao-class01 root ~]#sed '2 d' t1.log
sed刪除1到4行
sed '1,4d' t1.log
關(guān)于sed處理文件行范圍語法

刪除第三行數(shù)據(jù)
sed '3 d' t1.log
刪除文件的3到6行
sed '3,6 d' t1.log
刪除第三行開始,向下2行
sed '3,+2 d' t1.log
刪除奇數(shù)行 1,3,5,7,9
sed '1~2 d' t1.log
刪除偶數(shù)行 2,4,6,8
sed '2~2 d' t1.log
保留前三行
[242-yuchao-class01 root ~]#sed -e '4,$ d' t1.log
找到game那一行,且刪掉
[242-yuchao-class01 root ~]#sed '/game/ d' t1.log
刪除game這一行到結(jié)尾
[242-yuchao-class01 root ~]#sed '/game/,$ d' t1.log
刪除文件中所有包含game的行,以及它下一行
[242-yuchao-class01 root ~]#sed '/game/,+1 d' t1.log
打印行范圍練習(xí)
sed提供打印的命令是p
sed刪除命令練習(xí)
元數(shù)據(jù)
[yuchao-linux01 root ~]#cat chaoge.log
My name is yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn
刪除文件所有行
sed不指定行號的話,默認(rèn)匹配所有行,執(zhí)行d刪除命令
sed '行號 d命令' 文件
sed 'd' file
刪除文件第2行
sed '2 d' file
刪除1到3行
sed '1,3 d'
刪除第1、2、4行
語法是用分號,隔開多個命令,多次刪除
sed '1 d;2 d;4d;' t1.log
刪除game的行
sed '/game/d' t1.log
刪除game和http的行
也就是刪除了2個指定的行
sed '/game/d;/http/d' t1.log
刪除My開頭的行
sed '/^My/d' t1.log
sed忽略大小寫的指令
sed提供了 大寫的I 指令 用于忽略大小寫
sed '/^My/Id' t1.log
刪除以.結(jié)尾的行
sed '/.$/d' t1.log
刪除第二行到qq的行
sed '2,7d' t1.log
sed '2,/qq/d' t1.log
刪除2和5兩行
sed '2d;5d' t1.log
刪除2到5行
sed '2,5d' t1.log
刪除3到尾行
sed '3,$d' t1.log
刪除偶數(shù)行(步長)
seq 1 10 | sed '2~2d'
刪除奇數(shù)行(步長)
seq 1 10 | sed '1~2 d'
感嘆號取反
Id sed的忽略大小寫命令
!d 結(jié)果取反
除了有字符yuchao的行,其他都刪除
[242-yuchao-class01 root ~]#sed '/yuchao/!d' t1.log
My name is yuchao.
My website is http://www.yuchaoit.cn
刪掉除了My開頭的行
sed '/^My/!d' t1.log
sed修改數(shù)據(jù)
替換整行命令(c)
c 把選定的行改為新的文本。
把11行替換為新數(shù)據(jù) , 睡醒了 精神很飽滿
語法
sed ' 11 c 睡醒了,精神很飽滿 ' t1.log
替換文件的第二行,改為 "I love linux , python !"
整行全部替換
sed '2c I love linux , python !' t1.log
替換字符(s命令)
sed替換的命令解釋
這個分隔符,常見有如下形式
sed 's/old_string/new_string/'
sed 's#old_string#new_string#'
sed 's@old_string@new_string@'
強(qiáng)烈建議用#
sed 's#old_string#new_string#'
替換一次
sed 's/替換前字符/替換后字符/' file
全局替換,global 全局替換
sed 's/替換前字符/替換后字符/g' file
s 將每一行第一處匹配的字符替換
s/old_string/new_string/
sed 's#i#I#' t1.log
g 全局替換global,每一行,每一處匹配的字符都替換 s/old_string/new_string/
sed 's#i#I#g' t1.log
sed 's/i/I/g' t1.log
-i 選項、參數(shù),直接修改文件
sed默認(rèn)是修改內(nèi)存中的模式空間數(shù)據(jù),不會修改源文件,使用-i會修改源文件,修改磁盤上的文件數(shù)據(jù)。
測試數(shù)據(jù)
My name is yuchao. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/
字符yuchao改為老于
替換一次
[242-yuchao-class01 root ~]#sed 's#yuchao#老于#' t1.log
My name is 老于. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.老于it.cn , and another website is https://www.yuchao.top/
替換多次,全局替換
sed 's#yuchao#老于#g' t1.log
替換第三行的computer改為linux
sed '3 s#computer#linux#g' t1.log
所有的My改為His
指定my開頭
注意,sed提供了忽略大小寫的命令,大寫的 I
注意大小寫
不加忽略大小寫命令的寫法
sed 's#^My#His#' t1.log
添加忽略大小寫的命令
sed 's#my#His#Ig' t1.log
new_name="彭于晏"
注意單引號、雙引號的對變量的解析作用
[242-yuchao-class01 root ~]#sed "s#yuchao#$new_name#g" t1.log
sed分組替換
注意別忘了擴(kuò)展正則 -r參數(shù)
語法:
sed軟件也提供了 ()分組功能
使用1引用第一個括號的數(shù)據(jù)
2引用第二個括號的數(shù)據(jù)
sed最多記住9個分組
() 1向后引用分組數(shù)據(jù)
提取出welcome這個單詞
echo 'I am teacher yuchao,welcome my linux course' | sed -r 's/^.*,(.*)m.*/1/g'
welcome
分組取出ip
s 表示單個空格
去頭去尾法
[242-yuchao-class01 root ~]#ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n
192.168.0.242
分組提取法
sed查詢
sed打印命令p 打印sed正則處理后的數(shù)據(jù)
并且sed默認(rèn)打印模式空間,可以用-n取消
文本,10數(shù)據(jù) > sed 一行一行的讀取,編輯 >> 打印
固定用法,只要使用到了p打印些數(shù)據(jù),就是想輸出指定數(shù)據(jù)
必然用-n取消默認(rèn)打印,目的是,只看到你想p打印的那些數(shù)據(jù)
打印第二行
sed '2 p ' t1.log
打印前三行
sed '1,3p' t1.log -n
只顯示qq號那一行
[242-yuchao-class01 root ~]#sed -r '/[0-9]{9}/p' t1.log -n
My qq is 877348180. my num is 1555555555.
找出http和linux的行
-e 多次編輯
[242-yuchao-class01 root ~]#sed -e '/http/p' -e '/linux/p' t1.log -n
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/
[242-yuchao-class01 root ~]#sed '/http/p;/linux/p' -n t1.log
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/
sed其他命令
w命令
作用是將sed操作結(jié)果,寫入到指定文件
sed '/模式/w new_file' old_file
必須,找出computer這一行,數(shù)據(jù)寫入到game2.log文件中
sed '/computer/w game2.log' t1.log -n
替換文件中所有的yuchao為老于,新數(shù)據(jù)寫入 yu.log
sed 's#yuchao#老于#gw yu.log' t1.log -n
-e選項
-e選項用于接上sed多個命令
提取1,2,4行信息
語法
sed -e 'sed命令' -e 'sed命令' -e 'sed命令'
sed -e '1p' -e '2p' -e '4p' t1.log -n
; 分號
分號也用于執(zhí)行多條命令,和linux基礎(chǔ)命令一樣支持這種寫法。
單獨提取出1,2,4行信息
sed '1p;2p;4p' t1.log -n
sed -e '1p' -e '2p' -e '4p' t1.log -n
-
Linux
+關(guān)注
關(guān)注
88文章
11746瀏覽量
218832 -
SED
+關(guān)注
關(guān)注
0文章
26瀏覽量
27577
原文標(biāo)題:Linux三劍客之Sed:文本處理神器,一分鐘掌握核心技能!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux中g(shù)rep、sed和awk命令詳解
使用 Linux/Unix 進(jìn)行文本處理
嵌入式Linux系統(tǒng)知識架構(gòu)
Redmi Note 9 Pro系列三劍客正式亮相
【嵌入式】構(gòu)建嵌入式Linux系統(tǒng)(uboot、內(nèi)核、文件系統(tǒng))
單日獲客成本超20萬,國產(chǎn)大模型開卷200萬字以上的長文本處理
如何掌握Linux文本處理
Linux Shell文本處理神器合集:15個工具+實戰(zhàn)例子,效率直接翻倍
Linux三劍客之Sed:文本處理神器
評論