您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關sed和gawk編輯器怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
sed 編輯器可以在讀取數據時對數據快遞的進行各種處理操作,s 命令 可以替換文本,i 命令 可以插入文本,a 命令 可以追加文本,c 命令 可以修改文本,d 命令 可以刪除文本,y 命令 可以轉換文本,p 命令 可以打印文本,= 命令 可以打印行號,l 命令 可以打印 ASCII 字符,w 命令 可以輸出內容到指定文件,r 命令 可以從指定文件讀取內容。
sed 編輯器還支持 行尋址 ,以上大部分命令都支持使用行尋址的方式來靈活操作數據。
gawk 編輯器是根據 awk 工具從 Unix 移植到 Linux 的 GNU 版本,雖然功能強大,但 Linux 默認沒有安裝該工具,可以通過 yum install gawk 命令進行安裝。gawk 編輯器提供的是一種編程語言,而不僅僅是編輯器命令。
sed 和 gawk 實現的效果是:不進入交互式編輯器,就可以實現自動格式化、插入、修改或刪除文件中的文本數據。
sed 編輯器簡稱 流編輯器( Stream Editor ) 。可以根據命令來處理數據流中的數據,這些命令可以直接從命令行輸入,也可以存在于指定文件中。
sed 編輯器會將所有命令與一行數據進行匹配,匹配完畢后就自動讀取下一行數據,并重復之前的操作,當所有數據都讀取完畢后,命名才會終止。處理后的數據不會影響原文件,而是輸出到 STDOUT 。
sed 命令的基本格式是 sed option script file 。
option 中可用的選項如下圖:
默認情況下,sed 編輯器會將指定的命令應用到 STDIN 上,這樣就可以直接將數據通過管道輸入到 sed 編輯器中進行處理,效果如下:
在上圖中可以看到,echo 輸出的語句通過 | 管道傳入 sed 命令。在 sed 編輯器中使用了 s 命令,作用是用斜線之間指定的第二個文本替換第一個文本的內容。
要在 sed 編輯器的命令行模式中指定多個命令,使用 sed -e 命令即可,效果如下:
在上圖中可以看到,添加 -e 指令后,只需要在多個命令之間使用分號隔開即可。需要注意的是,分號和命令末尾之間不能有空格。
如果不想使用分號,也可以使用 bash shell 的 次提示符 來分隔命令,效果如下:
在這種模式下,不需要在命令末尾添加分號。
使用 sed -f 命令即可從文件中讀取命令,效果如下:
在這種模式下,不需要在命令末尾添加分號。需要注意的是,.sed 后綴并不是強制的,只是為了避免 sed 編輯器的腳本文件和其他文件混淆。
gawk 編輯器可以提供一個類編程環境,讓修改和重新組織文件中的數據變的更得心應手。
Linux 中默認沒有安裝 gawk 編輯器,如果當前 Linux 中不存在該編輯器,需要使用 yum install gawk 命令進行安裝。
使用 yum info gawk 命令可以查看該編輯器的詳細信息,源:installed 表示該編輯器已經安裝到當前 Linux 中。
也可以使用 whereis gawk 命令來查看當前 Linux 中是否存在該編輯器。
gawk 編輯器是 Unix 中 awk 編輯器的 GNU 版本,該編輯器提供的是一種編程語言,而不僅僅是編輯器命令。
gawk 編輯器的強大之處在于可以編寫腳本,通過腳本來讀取文本行的數據,對數據進行處理后再顯示數據,以及創建任意類型的輸出報告。
gawk 編輯器的基本格式是 gawk option '{program}' file ,編輯器腳本必須使用單引號和花括號包裹。
option 中可用的選項如下圖:
默認情況下,gawk 編輯器從 STDIN 中接收數據,效果如下:
當 gawk 命令接收到通過管道傳入的 echo 命令的輸出后,就在控制臺打印了 Hello World 語句。
如果直接在命令行中執行 gawk 命令,那么該命令會一直等待用戶輸入,效果如下:
從上圖中可以看到,第一次執行 gawk 命令后,手動輸入 1 并回車,控制臺打印了 Hello World 語句,再次輸入 2 并回車,控制臺再次打印了 Hello World ,以此類推。只要不手動退出,gawk 編輯器會一直監聽用戶輸入。
在第一次執行 gawk 命令的最后,可以清楚看到是使用 Ctrl + C 強制退出了 gawk 編輯器。其實該編輯器本身支持使用 Ctrl + D 退出監聽,可以看到,第二次執行 gawk 命令的最后,編輯器退出后并沒有顯示 Ctrl + C 的按鍵痕跡,因為這里正確使用了 Ctrl + D 來退出 gawk 編輯器。
gawk 編輯器在處理文件數據時,會自動為 被字段分隔符分隔后的每個數據 分配一個變量,規則如下:
$0 表示整個文本行
$1 表示第一個數據字段
$2 表示第二個數據字段
以此類推
gawk 默認的 字段分隔符 是 任意的空白字符 ,例如空格或制表符,效果如下
從上圖中可以看到,每行數據中存在一個空格,通過該空格將每行的數據分為兩部分,gawk 編輯器使用 $1 成功獲取到每行的第一部分,并將其輸出。
可以使用 gawk -F 來修改字段分隔符,效果如下:
上圖中使用 gawk -F : 命令將字段分隔符替換成了冒號,然后輸出了 passwd 文件中每行的第一個字段。由于輸出內容過多,將輸出內容通過管道傳入 tail -n 5 命令,最后只輸出 5 行數據。
gawk 編輯器允許將多個命令組合成一個完整的編輯器,和 sed 編輯器類似,對于多命令使用分號分隔即可,效果如下:
從上圖中可以看到,gawk 編輯器先將第三個字段改為 not is ,再使用 print $0 命令將整行數據輸出。
同樣的,也支持使用 次提示符 來編寫多個命令,效果如下:
gawk 編輯器允許將腳本存儲到文件中,效果如下:
從上圖中可以看到,在腳本中編寫多個命令非常方便,同時腳本命令外只需要使用花括號進行包裹,不再需要使用單引號
gawk 編輯器可以控制腳本命令的運行時機。默認情況下,腳本命令會在讀取一行文本后就自動執行一次。但可以通過 BEGIN 關鍵字 強制 gawk 在讀取數據之前執行指定腳本。 ,效果如下:
從上圖中可以看到,默認情況下,gawk 命令會在監聽到用戶輸入后再輸出 Hello World 。但當使用 BEGIN 關鍵字后,gawk 命令直接就輸出了 Hello World ,不再等待用戶輸入。
通過這種方式,可以為輸出內容準備一個通用的顯示頭信息,效果如下:
使用 END 關鍵字可以強制 gawk 在讀取數據結束之后執行指定腳本,效果如下:
如果是在文件中編寫腳本,可以使用特殊變量 FS 來指定字段分隔符,效果如下:
在上圖中,BEGIN 關鍵字部分的輸出內容沒有顯示出來,知道是為什么嗎?
因為最后將輸出通過管道傳入了 tail -n 5 命令,該命令的效果是輸出最后 5 行數據,所以最開始輸出的內容也沒無法顯示了,這并不是腳本 BUG 。
介紹一些常用的 sed 命令。
通過一些選項,讓 s 命令 在替換文本時操作更靈活。
默認情況下,在執行替換命令時,只會替換每行出現的第一個匹配項,如果每行有超過一個匹配項,那么后續的都會被忽略,效果如下:
在上圖中可以看到,目標文本中每行都有兩個 test ,sed 命令希望將 test 替換成 trail ,但命令執行后,每行都只有第一個 test 被替換了,后續的 test 沒有發生變化。
如果添加 替換標記 ,有一種方式可以解決上述情況。首先了解一下替換標記的四種可用方式:
在上述方式中,第二種標記又被叫做全局替換,效果如下:
從上圖中可以看到,指定文件中,所有的 test 都被替換成了 trail 。
第一種方式是通過數字標記,指定要替換的匹配項,效果如下:
第三種方式是將被替換行的內容打印出來,效果如下:
在上圖中可以看到,使用 sed 命令后的替換目標是 second 字段,該字段只有第二行數據存在一次匹配。當第一次使用該命令后,將所有被掃描的行都進行輸出。當第二次在替換命令某位替換 p 標記 后,在所有被掃描的行都輸出后,再次輸出了被替換內容的第二行,這就是 p 標記 的效果。
所以在使用該命令時一般會攜帶 sed -n 命令,-n 選項可以屏蔽 sed 命令默認的輸出內容,結合 p 標記 的效果,就可以只顯示被替換內容的行,如上圖第三次的效果。
第四種方式是將被替換內容的行輸出到指定文件,效果如下:
在上圖中可以看到,命令執行完成后,查看 result.txt 的內容就是被替換內容的第二行。
在 sed 命令中替換內容時,如果部分內容涉及到敏感字符,例如本身就要作為替換操作分隔符的 正斜線( / ) ,那么操作起來就非常麻煩,效果如下:
這個時候其實可以指定其他字符來作為替換操作的分隔符,例如 感嘆號( ! ) ,效果如下:
默認情況下,sed 命令會作用到指定數據的所有行。如果想讓命令作用于特定行或某些行,就需要用到 行尋址( Line Addressing ) 。
在 sed 編輯器中有兩種行尋址方式:
* 通過數字形式指定行區間
* 通過文本模式過濾指定行
sed 編輯器會將目標文本的第一個編號為 1 ,第二行編號為 2 ,以此類推。在使用數字形式的行尋址時,有以下三種方式可選:
1. 2s ,表示單個只影響第二行
2. 2,3s ,表示影響第二到第三行
3. 2,$s ,表示從第二行開始,一直到最后一行都受影響,美元符號( $ ) 表示最后一行
第一種形式的效果如下:
在上圖中可以看到,只有第二行數據發生了變化。
第二種形式的效果如下:
在上圖中可以看到,第二行和第三行的數據都發生了變化。
第三種形式的效果如下:
在上圖中可以看到,從第二行開始一直到最后一行的數據都發生了變化。
sed 編輯器允許對存在指定文本的行進行內容替換,效果如下:
在上圖中可以看到,sed 命令首先在目標文本中找到 asing1elife 存在的行,然后將該行的 My 替換成 He ,而其他不存在 asing1elife 的行則不受影響。
該模式如果結合正則表達式,將會發揮更強大的威力。
如果希望在單行執行多個命令,使用 花括號 在 多行模式 下將多個命令進行包裹即可,效果如下:
在上圖中可以看到,sed 命令首先指定了受影響的行數是第二行,然后在第二行中進行了兩次替換。
使用 d 命令 可以刪除 尋址模式匹配到的指定行,d 命令 的尋址模式和 s 命令 的規則一致。
該命令需要注意以下兩點:
1. 只影響流輸出,不會影響原文件
2. 必須加入尋址模式,否則流輸出的所有數據都會被刪除
指定單行的效果如下:
指定多行的效果如下:
指定開始行到最后一行的效果如下:
指定文本的效果如下:
還可以通過文本的方式來指定范圍,效果如下:
但該模式要慎用,因為對于 sed 編輯器來說,第一個文本的匹配是打開了行刪除功能,第二個文本的匹配則是關閉了行刪除功能。所以如果一直沒有匹配到第二個文本,就會因為無法關閉行刪除功能而導致將后續的內容全部刪除,效果如下:
又或者目標文件的數據存在重復,就會導致 sed 編輯器再次匹配到第一個文本而打開行刪除功能,效果如下:
sed 編輯器的 i 命令 會在指定行之前增加一行新數據,a 命令 會在指定行之后增加一行新數據,效果如下:
需要注意的是,插入和附加命令使用的是反斜線( \ ) ,而替換命令使用的是正斜線( / )。
如果要同時插入或追加多行文本,需要在使用多行模式時,在每行文本的末尾添加 反斜線( \ ) ,效果如下:
sed 編輯器的 c 命令 會修改指定行的所有數據內容,效果如下:
需要注意的是,修改命令使用的也是反斜線( \ ) 。
sed 編輯器的 y 命令 可以處理單個字符,格式是 sed [address]y/inchars/outchars/ ,該命令會將 inchars 中的每個字符與 outchars 中的每個字符進行一一對應后分別替換,效果如下:
在上圖中可以看到,轉換命令默認就是全局效果 ,并不像替換命令一樣需要使用 g 選項來打開全局替換效果。不過遺憾的是,轉換命令的轉換效果是否全局,是不可選的,缺省就是全局,也只能是全局轉換。
需要注意的是,inchars 和 outchars 的長度必須相同,否則會報錯,效果如下:
除了替換命令中的 p 選項 可以用于打印被替換的行,還有以下三個命令可以打印數據流的信息:
p 命令 用于打印文本行
= 命令 用于打印行號
l 命令 用于列出行,是小寫的 L
p 命令 可以打印指定的行內容,但建議和 sed -n 命令結合使用,效果如下:
在上圖中可以看到,第一次使用 p 命令時,由于 sed 編輯器默認的輸出效果,首先輸出了完整的流數據,才輸出了 p 命令匹配的行內容。第二次結合 sed -n 命令屏蔽了默認輸出后,就可以只看到 p 命令的輸出結果了。
p 命令也支持行尋址,效果如下:
sed 編輯器默認會為目標文本的每一行添加編號,使用 = 命令 可以將這個編號輸出,效果如下:
l 命令 的作用是打印出數據流中原本不可打印的 ASCII 字符,效果如下:
w 命令 可以將目標文件的指定行寫入到指定文件,效果如下:
r 命令 允許將指定文件的內容插入到目標文件的指定位置,效果如下:
感謝各位的閱讀!關于“sed和gawk編輯器怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。