關于linux三劍客
-
grep,過濾關鍵字信息數據。主要是用于查文本內的數據
-
sed ,對文本數據進行編輯,修改原文件內容
-
awk,對文件數據過濾,提取,并且能實現,格式化輸出
-
awk對文件數據處理后,還能更美觀的展示數據
-
sed是什么
-
sed軟件本身
-
sed提供的加工的命令
-
給sed提供的源數據
sed語法格式
sed [選項] [sed內置命令字符] [輸入文件]
說明:
1.注意 sed 軟件及后面選項,sed 命令和輸入文件,每個元素之間都至少有一個空格
2.為了避免混淆,文本稱呼sed為sed軟件.sed-commands(sed命令)是sed軟件內置的一些命令選項,為了和前面的 options(選項)區分,故稱為sed命令.
3.sed-commands 既可以是單個sed 命令,也可以是多個sed命令組合.
4.input-file(輸入文件)是可選項,sed 還能夠從標準輸入或管道獲取輸入
語法
sed替換字符數據
s替換指令
#替換前的數據(正則)#替換后的數據#
sed 's#替換前的數據#替換后的數據#' file.txt
sed命令執行過程
概括流程:
sed 軟件從文件或管道讀取一行,處理一行,輸出一行;再讀取一行.再處理一行.在輸出一行....
sed參數
sed默認修改的是模式空間內的數據
(簡單大白話,sed讀取了一行文本數據,放入到內存里進行修改,修改的結果默認不會寫入到文件中,只是在內存里修改,且打印讓你看到修改的結果)
吧修改的結果寫入到文件
就得借助參數的功能
-i 把sed處理的結果,寫入到文件,且不在終端打印了
sed -i 's#替換前的數據#替換后的數據#' file.txt
options[選項]
解釋說明
-n 取消默認的 sed 軟件的輸出,常與 sed 命令的 p 連用
-e 一行命令語句可以執行多條 sed 命令
-f 選項后面可以接 sed 腳本的文件名
-r 使用正則拓展表達式,默認情況 sed 只識別基本正則表達式
-i 直接修改文件內容,而不是輸出終端,如果不使用-i 選項 sed 軟件只是修改在 內存中的數據,并不影響磁盤上的文件
sed命令
sed提供了很多功能的指令
在某一行插入數據
替換字符數據
sed-commands[sed 命令]
解釋說明
a 追加,在指定行后添加一行或多行文本
c 取代指定的行
d 刪除指定的行
D 刪除模式空間的部分內容,直到遇到換行符
結束操作,與多行模式相關
i 插入,在指定的行前添加一行或多行文本
h 把模式空間的內容復制到保持空間
H 把模式空間的內容追加到保持空間
g 把保持空間的內容復制到模式空間
G 把保持空間的內容追加到模式空間
x 交換模式空間和保持空間的內容
l 打印不可見的字符
n 清空模式空間,并讀取下一行數據并追加到模式空間
N 不清空模式空間,并讀取下一行數據并追加到模式空間
p 打印模式空間的內容,通常 p 會與選項-n 一起使用
P(大寫) 打印模式空間的內容,直到遇到換行符你結束操作
q 退出 sed
r 從指定文件讀取數據
s 取代,s#old#new#g==>這里 g 是 s 命令的替代標志,注意和 g 命令區分
w 另存,把模式空間的內容保存到文件中
y 根據對應位置轉換字符
:label 定義一個標簽
t 如果前面的命令執行成功,那么就跳轉到 t 指定的標簽處,繼續往下執行后 續命令,否則,仍然繼續正常的執行流程
sed匹配文本范圍
sed的修改字符與取消默認輸出
sed增刪改查(練習) 練習期間,別用-i參數,去修改源文件,直接看替換結果
sed增加字符命令
"a":追加文本到指定行,記憶方法:a 的全拼是 apend,,意思是追加 添加一行或多行文本
3a 表示在第三行下面追加數據
"i":插入文本到指定行前,記憶方法:i 的全拼是 insert,意思是插入 添加一行或多行文本
3i 在第三行上面插入數據
單行增加命令
sed '行號 sed指令 你想添加的字符數據' 源文件
在文件第二行后,插入數據,"今天又是美好的一天"
[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
在第二行前,插入數據
sed '2 i 今天霧霾比較大' t1.log
sed多行增加
增加的數據存在換行
cat實現多行文本追加
cat >>my.log<<EOF
你好
我好
他也好
EOF
echo 追加多行數據
用法如下
[242-yuchao-class01 root ~]#echo -e "hello
world
你好
我也好" > hello.log
[242-yuchao-class01 root ~]#cat hello.log
hello
world
你好
我也好
sed追加多行文本
cat、還是echo,都只能往文件末尾追加內容。
而sed是按行處理文本,可以指定要處理的行,也就是在指定行插入字符數據。
使用 添加多行數據
給t1.log 開頭,添加兩行數據
加油
奧力給
[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
練習sed追加配置文件信息(單行)
1.練習,修改nginx配置文件,在第39行插入新數據 listen 81;
只修改,且終端上看到修改結果,但是不修改文件
sed '39 i listen 81;' /etc/nginx/nginx.conf
sed -i '39 i listen 81;' /etc/nginx/nginx.conf
修改sshd_config實戰
例如我們在系統初始化優化時,需要修改sshd服務端設置,需要加入如下多行配置
Port 25515 # 改端口
PermitRootLogin no # 不允許root登錄
PerminEmptyPasswords no # 不允許空密碼
UseDNS no # 不做主機名解析,加速ssh連接
GSSAPIAuthentication no # 不做主機名解析,加速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刪除字符數據
d 刪除指定的行
d 命令,表示刪除字符,delete意思
sed默認是多行處理所有文本,如果不指定范圍,sed默認是刪除所有文本行數據了
sed 刪除第二行數據
[242-yuchao-class01 root ~]#sed '2 d' t1.log
sed刪除1到4行
sed '1,4d' t1.log
關于sed處理文件行范圍語法
刪除第三行數據
sed '3 d' t1.log
刪除文件的3到6行
sed '3,6 d' t1.log
刪除第三行開始,向下2行
sed '3,+2 d' t1.log
刪除奇數行 1,3,5,7,9
sed '1~2 d' t1.log
刪除偶數行 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這一行到結尾
[242-yuchao-class01 root ~]#sed '/game/,$ d' t1.log
刪除文件中所有包含game的行,以及它下一行
[242-yuchao-class01 root ~]#sed '/game/,+1 d' t1.log
打印行范圍練習
sed提供打印的命令是p
sed刪除命令練習
元數據
[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不指定行號的話,默認匹配所有行,執行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
刪除以.結尾的行
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
刪除偶數行(步長)
seq 1 10 | sed '2~2d'
刪除奇數行(步長)
seq 1 10 | sed '1~2 d'
感嘆號取反
Id sed的忽略大小寫命令
!d 結果取反
除了有字符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修改數據
替換整行命令(c)
c 把選定的行改為新的文本。
把11行替換為新數據 , 睡醒了 精神很飽滿
語法
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@'
強烈建議用#
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 選項、參數,直接修改文件
sed默認是修改內存中的模式空間數據,不會修改源文件,使用-i會修改源文件,修改磁盤上的文件數據。
測試數據
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分組替換
注意別忘了擴展正則 -r參數
語法:
sed軟件也提供了 ()分組功能
使用1引用第一個括號的數據
2引用第二個括號的數據
sed最多記住9個分組
() 1向后引用分組數據
提取出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正則處理后的數據
并且sed默認打印模式空間,可以用-n取消
文本,10數據 > sed 一行一行的讀取,編輯 >> 打印
固定用法,只要使用到了p打印些數據,就是想輸出指定數據
必然用-n取消默認打印,目的是,只看到你想p打印的那些數據
打印第二行
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操作結果,寫入到指定文件
sed '/模式/w new_file' old_file
必須,找出computer這一行,數據寫入到game2.log文件中
sed '/computer/w game2.log' t1.log -n
替換文件中所有的yuchao為老于,新數據寫入 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
; 分號
分號也用于執行多條命令,和linux基礎命令一樣支持這種寫法。
單獨提取出1,2,4行信息
sed '1p;2p;4p' t1.log -n
sed -e '1p' -e '2p' -e '4p' t1.log -n
-
Linux
+關注
關注
87文章
11292瀏覽量
209323 -
SED
+關注
關注
0文章
25瀏覽量
27085
原文標題:Linux三劍客之Sed:文本處理神器,一分鐘掌握核心技能!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論