關(guān)于linux三劍客
-
grep,過(guò)濾關(guān)鍵字信息數(shù)據(jù)。主要是用于查文本內(nèi)的數(shù)據(jù)
-
sed ,對(duì)文本數(shù)據(jù)進(jìn)行編輯,修改原文件內(nèi)容
-
awk,對(duì)文件數(shù)據(jù)過(guò)濾,提取,并且能實(shí)現(xiàn),格式化輸出
-
awk對(duì)文件數(shù)據(jù)處理后,還能更美觀的展示數(shù)據(jù)
-
sed是什么
-
sed軟件本身
-
sed提供的加工的命令
-
給sed提供的源數(shù)據(jù)
sed語(yǔ)法格式
sed [選項(xiàng)] [sed內(nèi)置命令字符] [輸入文件]
說(shuō)明:
1.注意 sed 軟件及后面選項(xiàng),sed 命令和輸入文件,每個(gè)元素之間都至少有一個(gè)空格
2.為了避免混淆,文本稱呼sed為sed軟件.sed-commands(sed命令)是sed軟件內(nèi)置的一些命令選項(xiàng),為了和前面的 options(選項(xiàng))區(qū)分,故稱為sed命令.
3.sed-commands 既可以是單個(gè)sed 命令,也可以是多個(gè)sed命令組合.
4.input-file(輸入文件)是可選項(xiàng),sed 還能夠從標(biāo)準(zhǔn)輸入或管道獲取輸入
語(yǔ)法
sed替換字符數(shù)據(jù)
s替換指令
#替換前的數(shù)據(jù)(正則)#替換后的數(shù)據(jù)#
sed 's#替換前的數(shù)據(jù)#替換后的數(shù)據(jù)#' file.txt
sed命令執(zhí)行過(guò)程
概括流程:
sed 軟件從文件或管道讀取一行,處理一行,輸出一行;再讀取一行.再處理一行.在輸出一行....
sed參數(shù)
sed默認(rèn)修改的是模式空間內(nèi)的數(shù)據(jù)
(簡(jiǎn)單大白話,sed讀取了一行文本數(shù)據(jù),放入到內(nèi)存里進(jìn)行修改,修改的結(jié)果默認(rèn)不會(huì)寫(xiě)入到文件中,只是在內(nèi)存里修改,且打印讓你看到修改的結(jié)果)
吧修改的結(jié)果寫(xiě)入到文件
就得借助參數(shù)的功能
-i 把sed處理的結(jié)果,寫(xiě)入到文件,且不在終端打印了
sed -i 's#替換前的數(shù)據(jù)#替換后的數(shù)據(jù)#' file.txt
options[選項(xiàng)]
解釋說(shuō)明
-n 取消默認(rèn)的 sed 軟件的輸出,常與 sed 命令的 p 連用
-e 一行命令語(yǔ)句可以執(zhí)行多條 sed 命令
-f 選項(xiàng)后面可以接 sed 腳本的文件名
-r 使用正則拓展表達(dá)式,默認(rèn)情況 sed 只識(shí)別基本正則表達(dá)式
-i 直接修改文件內(nèi)容,而不是輸出終端,如果不使用-i 選項(xiàng) sed 軟件只是修改在 內(nèi)存中的數(shù)據(jù),并不影響磁盤(pán)上的文件
sed命令
sed提供了很多功能的指令
在某一行插入數(shù)據(jù)
替換字符數(shù)據(jù)
sed-commands[sed 命令]
解釋說(shuō)明
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 打印不可見(jiàn)的字符
n 清空模式空間,并讀取下一行數(shù)據(jù)并追加到模式空間
N 不清空模式空間,并讀取下一行數(shù)據(jù)并追加到模式空間
p 打印模式空間的內(nèi)容,通常 p 會(huì)與選項(xiàng)-n 一起使用
P(大寫(xiě)) 打印模式空間的內(nèi)容,直到遇到換行符你結(jié)束操作
q 退出 sed
r 從指定文件讀取數(shù)據(jù)
s 取代,s#old#new#g==>這里 g 是 s 命令的替代標(biāo)志,注意和 g 命令區(qū)分
w 另存,把模式空間的內(nèi)容保存到文件中
y 根據(jù)對(duì)應(yīng)位置轉(zhuǎn)換字符
:label 定義一個(gè)標(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 '行號(hào) 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實(shí)現(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 開(kāi)頭,添加兩行數(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實(shí)戰(zhàn)
例如我們?cè)谙到y(tǒng)初始化優(yōu)化時(shí),需要修改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寫(xiě)入多行配置 在開(kāi)頭加入這些配置
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處理文件行范圍語(yǔ)法
刪除第三行數(shù)據(jù)
sed '3 d' t1.log
刪除文件的3到6行
sed '3,6 d' t1.log
刪除第三行開(kāi)始,向下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不指定行號(hào)的話,默認(rèn)匹配所有行,執(zhí)行d刪除命令
sed '行號(hào) d命令' 文件
sed 'd' file
刪除文件第2行
sed '2 d' file
刪除1到3行
sed '1,3 d'
刪除第1、2、4行
語(yǔ)法是用分號(hào),隔開(kāi)多個(gè)命令,多次刪除
sed '1 d;2 d;4d;' t1.log
刪除game的行
sed '/game/d' t1.log
刪除game和http的行
也就是刪除了2個(gè)指定的行
sed '/game/d;/http/d' t1.log
刪除My開(kāi)頭的行
sed '/^My/d' t1.log
sed忽略大小寫(xiě)的指令
sed提供了 大寫(xiě)的I 指令 用于忽略大小寫(xiě)
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ù)行(步長(zhǎng))
seq 1 10 | sed '2~2d'
刪除奇數(shù)行(步長(zhǎng))
seq 1 10 | sed '1~2 d'
感嘆號(hào)取反
Id sed的忽略大小寫(xiě)命令
!d 結(jié)果取反
除了有字符yuchao的行,其他都刪除
[242-yuchao-class01 root ~]#sed '/yuchao/!d' t1.log
My name is yuchao.
My website is http://www.yuchaoit.cn
刪掉除了My開(kāi)頭的行
sed '/^My/!d' t1.log
sed修改數(shù)據(jù)
替換整行命令(c)
c 把選定的行改為新的文本。
把11行替換為新數(shù)據(jù) , 睡醒了 精神很飽滿
語(yǔ)法
sed ' 11 c 睡醒了,精神很飽滿 ' t1.log
替換文件的第二行,改為 "I love linux , python !"
整行全部替換
sed '2c I love linux , python !' t1.log
替換字符(s命令)
sed替換的命令解釋
這個(gè)分隔符,常見(jiàn)有如下形式
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 選項(xiàng)、參數(shù),直接修改文件
sed默認(rèn)是修改內(nèi)存中的模式空間數(shù)據(jù),不會(huì)修改源文件,使用-i會(huì)修改源文件,修改磁盤(pán)上的文件數(shù)據(jù)。
測(cè)試數(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開(kāi)頭
注意,sed提供了忽略大小寫(xiě)的命令,大寫(xiě)的 I
注意大小寫(xiě)
不加忽略大小寫(xiě)命令的寫(xiě)法
sed 's#^My#His#' t1.log
添加忽略大小寫(xiě)的命令
sed 's#my#His#Ig' t1.log
new_name="彭于晏"
注意單引號(hào)、雙引號(hào)的對(duì)變量的解析作用
[242-yuchao-class01 root ~]#sed "s#yuchao#$new_name#g" t1.log
sed分組替換
注意別忘了擴(kuò)展正則 -r參數(shù)
語(yǔ)法:
sed軟件也提供了 ()分組功能
使用1引用第一個(gè)括號(hào)的數(shù)據(jù)
2引用第二個(gè)括號(hào)的數(shù)據(jù)
sed最多記住9個(gè)分組
() 1向后引用分組數(shù)據(jù)
提取出welcome這個(gè)單詞
echo 'I am teacher yuchao,welcome my linux course' | sed -r 's/^.*,(.*)m.*/1/g'
welcome
分組取出ip
s 表示單個(gè)空格
去頭去尾法
[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號(hào)那一行
[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é)果,寫(xiě)入到指定文件
sed '/模式/w new_file' old_file
必須,找出computer這一行,數(shù)據(jù)寫(xiě)入到game2.log文件中
sed '/computer/w game2.log' t1.log -n
替換文件中所有的yuchao為老于,新數(shù)據(jù)寫(xiě)入 yu.log
sed 's#yuchao#老于#gw yu.log' t1.log -n
-e選項(xiàng)
-e選項(xiàng)用于接上sed多個(gè)命令
提取1,2,4行信息
語(yǔ)法
sed -e 'sed命令' -e 'sed命令' -e 'sed命令'
sed -e '1p' -e '2p' -e '4p' t1.log -n
; 分號(hào)
分號(hào)也用于執(zhí)行多條命令,和linux基礎(chǔ)命令一樣支持這種寫(xiě)法。
單獨(dú)提取出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)注
87文章
11292瀏覽量
209322 -
SED
+關(guān)注
關(guān)注
0文章
25瀏覽量
27085
原文標(biāo)題:Linux三劍客之Sed:文本處理神器,一分鐘掌握核心技能!
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論