如何在 Linux 上使用 GNU sed
導讀 | 基金會宣佈了一個全新的 LFCS(Linux 基金會認證系統管理員(Linux Foundation Certified Sysadmin))認證計劃。這一計劃旨在幫助遍佈全世界的人們獲得其在處理 Linux 系統管理任務上能力的認證。這些能力包括支援執行的系統服務,以及第一手的故障診斷、分析,以及為工程師團隊在升級時提供明智的決策。 |
Linux 將程式中的輸入和輸出當成字元流或者字元序列。在開始理解重定向和管道之前,我們必須先了解三種最重要的I/O(輸入和輸出(Input and Output))流,事實上,它們都是特殊的檔案(根據 UNIX 和 Linux 中的約定,資料流和外圍裝置(裝置檔案)也被視為普通檔案)。
在 > (重定向運算子) 和 | (管道運算子)之間的區別是:前者將 與檔案相連線,而後者將 的輸出和另一個命令相連線。
# command >file # command1 | command2
由於重定向運算子會靜默地建立或覆蓋檔案,我們必須特別小心謹慎地使用它,並且永遠不要把它和管道混淆起來。在 Linux 和 UNIX 系統上管道的優勢是:第一個命令的輸出不會寫入一個檔案而是直接被第二個命令讀取。
在下面的操作練習中,我們將會使用這首詩——《A happy child》(作者未知)
sed 是流編輯器(stream editor)的縮寫。為那些不懂術語的人額外解釋一下,流編輯器是用來在一個輸入流(檔案或者管道中的輸入)執行基本的文字轉換的工具。
sed 最基本的用法是字元替換。我們將透過把每個出現的小寫 y 改寫為大寫 Y 並且將輸出重定向到 ahappychild2.txt 開始。g 標誌表示 sed 應該替換檔案每一行中所有應當替換的例項。如果這個標誌省略了,sed 將會只替換每一行中第一次出現的例項
#sed's/term/replacement/flag'file
#sed's/y/Y/g' ahappychild.txt > ahappychild2.txt
如果你要在替換文字中搜尋或者替換特殊字元(如 /,\,&),你需要使用反斜槓對它進行轉義。
例如,我們要用一個符號來替換一個文字,與此同時我們將把一行最開始出現的第一個 I 替換為 You。
#sed's/and/\&/g;s/^I/You/g' ahappychild.txt
在上面的命令中,眾所周知 ^(插入符號)是正規表示式中用來表示一行開頭的符號。
正如你所看到的,我們可以透過使用分號分隔以及用括號包裹來把兩個或者更多的替換命令(並在它們中使用正規表示式)連線起來。
另一種 sed 的用法是顯示或者刪除檔案中選中的一部分。在下面的樣例中,將會顯示 /var/log/messages 中從6月8日開始的頭五行。
#sed-n '/^Jun 8/ p'/var/log/messages |sed-n 1,5p
請注意,在預設的情況下,sed 會列印每一行。我們可以使用 -n 選項來覆蓋這一行為並且告訴 sed 只需要列印(用 p來表示)檔案(或管道)中匹配的部分(第一個命令中指定以“Jun 8” 開頭的行,第二個命令中指定一到五行)。
最後,可能有用的技巧是當檢查 或者配置檔案的時候可以保留檔案本身並且刪除註釋。下面的單行 sed 命令刪除(d)空行或者是開頭為#的行(| 字元對兩個正規表示式進行布林 OR 操作)。
#sed'/^#\|^$/d' apache2.conf
uniq 命令允許我們返回或者刪除檔案中重複的行,預設寫到標準輸出。我們必須注意到,除非兩個重複的行相鄰,否則uniq 命令不會刪除他們。因此,uniq 經常和一個前置的 sort 命令(一種用來對文字行進行排序的演算法)搭配使用。預設情況下,sort 使用第一個欄位(用空格分隔)作為關鍵欄位。要指定一個不同的關鍵欄位,我們需要使用 -k 選項。
du –sch /path/to/directory/* 命令將會以人類可讀的格式返回在指定目錄下每一個子資料夾和檔案的磁碟空間使用情況(也會顯示每個目錄總體的情況),而且不是按照大小輸出,而是按照子資料夾和檔案的名稱。我們可以使用下面的命令來讓它透過大小排序。
#du-sch /var/* | sort -h
你可以透過使用下面的命令告訴 uniq 比較每一行的前6個字元(-w 6)(這裡是指定的日期)來統計日誌事件的個數,而且在每一行的開頭輸出出現的次數(-c)。
#cat/var/log/mail.log |uniq-c -w6
grep 在檔案(或命令輸出)中搜尋指定正規表示式,並且在標準輸出中輸出匹配的行。
顯示檔案 /etc/passwd 中使用者 gacanepa 的資訊,忽略大小寫。
#grep-i gacanepa /etc/passwd
顯示 /etc 資料夾下所有 rc 開頭並跟隨任意數字的內容。
#ls-l /etc |grep rc[0-9]
tr 命令可以用來從標準輸入中轉換(改變)或者刪除字元,並將結果寫入到標準輸出中。
把 sortuniq.txt 檔案中所有的小寫改為大寫。
#cat sortuniq.txt |tr[:lower:][:upper:]
壓縮ls –l輸出中的分隔符為一個空格。
#ls-l |tr-s ' '
cut 命令可以基於位元組(-b選項)、字元(-c)或者欄位(-f)提取部分輸入(從標準輸入或者檔案中)並且將結果輸出到標準輸出。在最後一種情況下(基於欄位),預設的欄位分隔符是一個製表符,但可以由 -d 選項來指定不同的分隔符。
從 /etc/passwd 中提取使用者賬戶和他們被分配的預設 (-d 選項允許我們指定分界符,-f 選項指定那些欄位將被提取)。
#cat/etc/passwd|cut-d:-f1,7
將以上命令結合起來,我們將使用 last 命令的輸出中第一和第三個非空檔案建立一個文字流。我們將使用 grep 作為第一過濾器來檢查使用者 gacanepa 的會話,然後將分隔符壓縮至一個空格(tr -s ' ')。下一步,我們將使用 cut 來提取第一和第三個欄位,最後使用第二個欄位(本樣例中,指的是IP地址)來排序之後,再用 uniq 去重。
#last|grep gacanepa |tr-s ‘‘|cut-d’‘-f1,3|sort-k2 |uniq
上面的命令顯示瞭如何將多個命令和管道結合起來,以便根據我們的要求得到過濾後的資料。你也可以逐步地使用它以幫助你理解輸出是如何從一個命令傳輸到下一個命令的(順便說一句,這是一個非常好的學習經驗!)
儘管這個例子(以及在當前教程中的其他例項)第一眼看上去可能不是非常有用,但是他們是體驗在 Linux 命令列中建立、編輯和操作檔案的一個非常好的開始。請隨時留下你的問題和意見——不勝感激!
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2931975/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 文字處理的金剛鑽 —— sed (GNU/sed)
- 如何在 GNU Linux 上透過 Nvm 安裝 Node 和 Npm?LinuxNPM
- 如何在 Linux 上使用 pkgsrcLinux
- 《Linux下sed命令的使用》Linux
- 如何在linux伺服器上使用hanlpLinux伺服器HanLP
- linux下sed的使用+練習Linux
- GNU與LinuxLinux
- 如何在 Linux 上建立和使用交換檔案Linux
- 【GNU/Linux實戰手記之Emacs篇 上】 (轉)LinuxMac
- GNU 和 Linux(轉)Linux
- 如何在 Linux 上使用 kill 和 killall 來管理程式Linux
- linux sed 命令Linux
- linux sed命令Linux
- LINUX命令-sedLinux
- linux之sedLinux
- 【Linux學習教程】Linux中Sed命令如何使用?Linux
- Linux 核心使用的 GNU C 擴充套件(轉)Linux套件
- linux三劍客(grep、sed、awk)基本使用Linux
- Linux文字處理命令sed基本使用示例Linux
- 如何在 Linux/Windows/MacOS 上使用 .NET 進行開發LinuxWindowsMac
- 如何在 Linux 上使用 dnf 命令安裝軟體包?Linux
- 如何在 Linux 上使用 snap 安裝 Spotify(聲破天)Linux
- 如何在 Linux 上 使用 ONLYOFFICE 協同編輯文件Linux
- 如何在Mac上使用DockerMacDocker
- Linux sed命令用法Linux
- linux中sed用法Linux
- linux之 sed命令Linux
- Linux sed TipsLinux
- linux之sed用法Linux
- [linux]sed與awkLinux
- linux sed學習Linux
- 如何在 Linux 上安裝 JavaLinuxJava
- 如何在Linux上劃分VLANLinux
- GNU/Linux和FreeBSD上的NAT閘道器安裝(轉)Linux
- 如何在Linux上使用netstat命令查證DDOS攻擊Linux
- 如何在 Linux 上使用 x2go 設定遠端桌面LinuxGo
- Sed使用簡介
- sed使用變數變數