【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器

目錄:
(一)sed基本語法
(二)sed實戰演練


(一)sed基本語法
(1.1)sed是一項Linux系統命令,功能通awk類似,差別在於sed簡單,對列處理的功能要差一些,awk的功能複雜,對列處理的功能比較強大。sed的全稱是:Stream EDitor
(1.2)sed屬於行編輯器,sed作爲文本編輯器只是用來處理純ASCII碼的文本的,在操作文本的時候是逐行操作的,並不能一次性操作多行。sed作爲文本編輯器並不處理文本文件本身,每當處理一個文件的時候,它會逐行讀取文件,每次將一行讀取到內存空間中,然後在內存中完成編輯,然後將內存中編輯好的結果輸出到屏幕上,這個內存空間我們稱之爲“模式空間”。sed並不是每一行都處理,它會按照某種指定的模式進行過濾,即符合條件的我們就處理,不符合模式條件的就不處理。sed把符合條件的行讀進模式空間進行匹配,如果匹配到了就會在模式空間中使用後面的編輯命令對其完成編輯,並將完成編輯的結果輸出到屏幕上來。
(1.3)默認情況下,sed不編輯原文件,僅對模式空間中的數據做處理。其中sed命令的語法總結爲:“sed 'AddressCommand' file1 file2”
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.4)首先對於sed命令中的Address部分,我們可以用以下的幾種方式來表示,第一種是“StartLine,EndLine”,比如“1,100”表示從第1行到第100行,其中$符號表示最後一行;第二種我們可以使用正則表達式“/RegExp/”,例如我們可以使用“/^root/”表示以root字符串開頭的行;第三種我們可以使用“/pattern1/,/pattern2/”表示第一次被pattern1匹配到的行開始至第一次被pattern2匹配到的行結束;第四種可以以LineNumber表示指定的行;第五種方法我們可以使用“StartLine,+N”表示的是從startLine開始,向後的N行。
(1.5)參數d
(1.5.1)對於Command部分,首先第一個參數爲“d”,表示的是刪除符合條件的行,例如我們以/etc/fstab文件爲例,使用“1,4d”刪除第1至第4行(圖1-2)。如果我們希望刪除第5行到最後1行的內容,則可以使用'5,$d'進行表示(圖1-3)。
# sed '1,4d' /etc/fstab---將/etc/fstab文件中的第1至第4行刪除
# sed '5,$d' /etc/fstab---將/etc/fstab文件中的第5行到最後一行刪除
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.5.2)如果我們指定刪除文件中字符串包含“oot”的所有行,我們在vms002主機上將/etc/fstab文件拷貝到root用戶的家目錄下命名爲fstab文件,並且編輯如下的文件內容(圖1-4)。然後我們使用“# sed '/oot/d' fstab”命令進行文本過濾,此時我們發現過濾出來的內容中已經沒有了cat fstab中標紅的兩行了(圖1-5)。
# sed '/oot/d' fstab---刪除文件中字符串包含“oot”的所有行
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.5.3)如果我們希望刪除當前行到當前行的後2行內容,則可以使用“1,+2d”的參數表示,此時我們發現顯示的內容中第1行到第3行已經過濾掉了(圖1-6),如果我們需要刪除需要刪除某一指定的行,則可以直接數字加上字母d即可。
# sed '1,+2d' fstab---刪除第1行到第3行的內容
# sed '1d' fstab---刪除第1行的內容
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.6)對於Command部分,接着第二個參數是“p”,表示的是顯示符合條件的行。比如現在我們需求是顯示以“/”斜線開頭的行,此時我們需要在sed命令後跟一個“-n”的參數,即“sed -n”表示靜默模式,不再默認顯示模式空間中的內容。而“^/”表示的是以斜線開頭的行,不過需要用“\”進行轉義,根據Address的第二種情況,我們需要以“/RegExp/”進行過濾,所以最後的格式爲“/^\//p”
# sed -n '/^\//p' fstab---查詢並顯示以“/”斜線開頭的行
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.7)對於Command部分,接着第三個參數是“a \string”,表示的是在指定的行後面追加新行,內容爲string。此時我們發現以“^/”開頭的行的下一行都添加了一個新行“# hello world”(圖1-9),如果我們希望能夠添加兩行,則可以使用“\n”作爲分隔符(圖1-10)。
# sed '/^\//a # hello world' fstab---在以“^/”開頭的行的末尾追加新行,追加的內容爲“# hello world”
# sed '/^\//a # hello world\n# hello Linux' fstab---在以“^/”開頭的行的末尾添加兩行,且以“\n”作爲分隔符
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.8)對於Command部分,接着第四個參數是“i \string”,表示的是在指定的行前面添加新行,內容爲string。
# sed '/^\//i # hello world' fstab---在以“^/”開頭的行的上一行插入新行,追加的內容爲“# hello world”
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.9)對於Command部分,接着第五個參數是“r FILE”,表示的是將指定的文件內容添加至符合條件的行處。我們要求在fstab文件中,從第2行開始,將/etc/issue文件添加進來,此時便可以使用“2r /etc/issue”參數(圖1-12);如果我們希望將/etc/issue文件添加到最後一行的後面,則可以使用“$r /etc/issue”參數表示(圖1-13);如果我們希望在指定的行,例如1至3行後面添加etc/issue文件,則可以使用“1,3r /etc/issue”參數(圖1-14)。
# sed '2r /etc/issue' fstab---從第2行開始,將/etc/issue文件添加進來
# sed '$r /etc/issue' fstab---將/etc/issue文件添加到最後一行的後面
# sed '1,3r /etc/issue' fstab---設置從第1至第3行,每一行後面都添加/etc/issue文件
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.10)對於Command部分,接着第六個參數是“w FILE”,表示將指定範圍內的內容另存至指定的文件中。例如我們的需求是將fstab文件中有“oot”的行,提取出來保存至/tmp/oot.txt文件中,我們使用“/oot/w /tmp/oot.txt”參數表示,此時我們發現在/tmp/oot.txt文件中存儲的是fstab文件中含有oot的行。
# sed -n '/oot/w /tmp/oot.txt' fstab---將fstab文件中有“oot”的行,提取出來保存至/tmp/oot.txt文件中
# cat oot.txt---在/tmp目錄下查看oot.txt文件
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.11)查找並替換
(1.11.1)對於Command部分,接着第七個參數是“s/pattern/string/”,表示的是查找並替換,默認只替換每行中第一次被模式匹配到的字符串。其中pattern處表示的可以是字符串也可以是正則表達式,而string處則只可以使用字符串。我們希望將fstab文件中含有oot的字符串替換爲OOT大寫的字符串,此時可以使用“s/oot/OOT/”參數。
# sed 's/oot/OOT/' fstab---將fstab文件中含有oot的字符串替換爲OOT大寫的字符串
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.11.2)如果我們希望將fstab文件中以“/”開頭的行,將斜線替換爲“#”號,則可以使用使用“s/^\//#/”參數,此時我們發現在開頭兩行的“/”斜線已經被替換爲“#”號了。
# sed 's/^\//#/' fstab---將fstab文件中以“/”開頭的行,將斜線替換爲“#”號br/>![](https://s1.51cto.com/images/blog/201912/25/8447fbe61112b5852f7bce21d8aa5187.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(1.11.3)如果我們想要將fstab文件中的所有“/”斜線都替換爲“#”號,此時我們應該使用全局替換符g,此時我們發現系統中所有的斜線都被替換爲了“#”號(圖1-18)。如果我們在查找替換的時候不想用“/”斜線作爲分隔符,也是可以使用其他特殊字符作爲分隔符的,例如“#”或者“@”等(圖1-19)。
g:全局替換
i:忽略字符大小寫
# sed 's/\//#/g' fstab---將fstab文件中的所有“/”斜線都替換爲“#”號
# sed 's@/@#@g' fstab---使用“@”作爲分隔符,並將fstab文件中的所有“/”斜線都替換爲“#”號
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.12)替換表達式類型字符
(1.12.1)對於Command部分,接着第八個參數是“l..e”,例如將like轉換爲liker,將love轉換爲lover,此時我們使用“&”符號,代表引用表達式部分的內容,然後在再加字母“r”表示替換爲我們所希望的格式。
# sed 's#l..e#&r#g' sed.txt---使用“&”符號,代表引用表達式部分的內容,然後在再加字母“r”表示替換爲我們所希望的格式
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.12.2)如果我們希望使用後項引用的方式來進行字符替換,則可以使用如下的方式操作。我們將like替換爲liker,我們將love替換爲lover,使用後項引用的方式“s#(l..e)#\1r#g”參數來替換字符(圖1-21);如果我們希望將like替換爲Like,將love替換爲Lover,則此時我們只有使用後項引用的方式使用參數“s#l(..e)#L\1#g”,纔可以符合要求(圖1-22)。
# sed 's#(l..e)#\1r#g' sed.txt---將like替換爲liker,我們將love替換爲lover
# sed 's#l(..e)#L\1#g' sed.txt---將like替換爲Like,將love替換爲Lover
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(1.13)如果我們希望修改原文件時,此時使用“sed -i”選項即可,直接修改原文件。如果我們使用“sed -e”參數時,表示可以同時執行多個腳本。當然我們也可以將多個腳本放在一個原文件中,然後使用“sed -f”可以指定讀取這個原文件。最後我們還可以使用“sed -r”參數,表示使用擴展正則表達式。
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器


(二)sed實戰演練
(2.1)示例:現在我們的需求是將執行的history命令的行首的空白行清除掉,並且能夠獲取到history命令的第一列的所有信息,此時我們可以使用“^[[:space:]]*”表示行首爲任意空格,然後再使用cut命令將打印結果的第一列顯示出來(圖1-25)。
# history | sed 's#^[[:space:]]*##g' | cut -d' ' -f1---執行的history命令的行首的空白行清除掉,並且能夠獲取到history命令的第一列的所有信息
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.2)示例:刪除/boot/grub2/grub.cfg文件中行首的空白符。
# sed -r 's@^[[:space:]]+@@g' /boot/grub2/grub.cfg---將/boot/grub2/grub.cfg文件中的行首的空白字符去除頂格顯示
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.3)示例:替換/etc/inittab文件中“id:3:initdefault:”一行中的數字爲5。我們將/etc/inittab文件拷貝到當前目錄,然後在最後一行添加一行“id:3:initdefault:”(圖2-4),此時我們使用sed可以得到所需的結果。
# sed 's@(id:)[0-9](:initdefault:)@\15\2@g' inittab---將inittab文件中的最後一行“id:3:initdefault:”修改爲“id:5:initdefault:”
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.4)示例:刪除/etc/inittab文件中的空白行。
# cat /etc/inittab
# sed '/^$/d' /etc/inittab
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.5)示例:刪除/etc/inittab文件中開頭的#號。
# sed 's@^#@@g' inittab
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.6)示例:刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符,#號後沒有空白字符的該#號不刪除。
# sed -r 's@^#[[:space:]]+@@g' /etc/inittab
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.7)示例:先找出某文件中以空白字符開頭並且後面跟#號的行,然後刪除該行中的開頭的空白字符及#號。
# sed -r 's@^[[:space:]]+#@@g' /etc/inittab
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.8)示例:取出一個文件或目錄路徑的父目錄名稱。首先我們可能遇到的文件或目錄如下:“/etc/rc.d”、“/etc/rc.d/”、“/etc/rc.d/abc”、“/etc/rc.d/abc/”,然後取出文件或者目錄的父目錄並顯示出來。
# echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'---獲取目錄的父目錄
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器
(2.9)示例:取出一個文件或目錄路徑的基名。首先我們可能遇到的文件或目錄如下:“/etc/rc.d”、“/etc/rc.d/”、“/etc/rc.d/abc”、“/etc/rc.d/abc/”,然後取出文件或者目錄的基名例如rc.d或者abc顯示出來。
# echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'---顯示/etc/rc.d的基名
【講清楚,說明白!】Linux從業人員必備工具--sed文本處理神器

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章