LFCS 系列第一講:如何在 Linux 上使用 GNU sed 等命令來創建、編輯和操作文件
Linux 基金會認證系統管理員——第一講
請觀看下面關於 Linux 基金會認證計劃的演示:
該系列將命名為《LFCS 系列第一講》至《LFCS 系列第十講》並覆蓋關於 Ubuntu、CentOS 以及 openSUSE 的下列話題。
- 第一講:如何在 Linux 上使用 GNU sed 等命令來創建、編輯和操作文件
- 第二講:如何安裝和使用 vi/m 全功能文字編輯器
- 第三講:歸檔文件/目錄並在文件系統中尋找文件
- 第四講:為存儲設備分區,格式化文件系統和配置交換分區
- 第五講:在 Linux 中掛載/卸載本地和網路(Samba & NFS)文件系統
- 第六講:組合分區作為 RAID 設備——創建&管理系統備份
- 第七講:管理系統啟動進程和服務(使用 SysVinit, Systemd 和 Upstart)
- 第八講:管理用戶和組,文件許可權和屬性以及啟用賬戶的 sudo 許可權
- 第九講:用 Yum,RPM,Apt,Dpkg,Aptitude,Zypper 進行 Linux 軟體包管理
- 第十講:學習簡單的 Shell 腳本編程和文件系統故障排除
重要提示:由於自 2016/2 開始 LFCS 認證要求有所變化,我們增加發布了下列必需的內容。要準備這個考試,推薦你也看看我們的 LFCE 系列。
- 第十一講:怎樣使用 vgcreate、lvcreate 和 lvextend 命令創建和管理 LVM
- 第十二講:怎樣安裝幫助文檔和工具來探索 Linux
- 第十三講:怎樣配置和排錯 GRUB
本文是覆蓋這個參加 LFCS 認證考試的所必需的範圍和技能的十三個教程的第一講。話說了那麼多,快打開你的終端,讓我們開始吧!
處理 Linux 中的文本流
Linux 將程序中的輸入和輸出當成字元流或者字元序列。在開始理解重定向和管道之前,我們必須先了解三種最重要的I/O( 輸入和輸出 )流,事實上,它們都是特殊的文件(根據 UNIX 和 Linux 中的約定,數據流和外圍設備(設備文件)也被視為普通文件)。
在 > (重定向操作符) 和 | (管道操作符)之間的區別是:前者將命令與文件相連接,而後者將命令的輸出和另一個命令相連接。
# command > file
# command1 | command2
由於重定向操作符會靜默地創建或覆蓋文件,我們必須特別小心謹慎地使用它,並且永遠不要把它和管道混淆起來。在 Linux 和 UNIX 系統上管道的優勢是:第一個命令的輸出不會寫入一個文件而是直接被第二個命令讀取。
在下面的操作練習中,我們將會使用這首詩——《A happy child》(作者未知)
cat 命令樣例
使用 sed
sed 是 流編輯器 的縮寫。為那些不懂術語的人額外解釋一下,流編輯器是用來在一個輸入流(文件或者管道中的輸入)執行基本的文本轉換的工具。
sed 最基本的用法是字元替換。我們將通過把每個出現的小寫 y 改寫為大寫 Y 並且將輸出重定向到 ahappychild2.txt 開始。g 標誌表示 sed 應該替換文件每一行中所有應當替換的實例。如果這個標誌省略了,sed 將會只替換每一行中第一次出現的實例。
基本語法:
# sed 's/term/replacement/flag' file
我們的樣例:
# sed 's/y/Y/g' ahappychild.txt > ahappychild2.txt
sed 命令樣例
如果你要在替換文本中搜索或者替換特殊字元(如 /,,&),你需要使用反斜杠對它進行轉義。
例如,我們要用一個符號來替換一個文字,與此同時我們將把一行最開始出現的第一個 I 替換為 You。
# sed 's/and/&/g;s/^I/You/g' ahappychild.txt
sed 替換字元串
在上面的命令中,眾所周知 ^(插入符號)是正則表達式中用來表示一行開頭的符號。
正如你所看到的,我們可以通過使用分號分隔以及用括弧包裹來把兩個或者更多的替換命令(並在它們中使用正則表達式)連接起來。
另一種 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
sed 匹配字元串
uniq 命令
uniq 命令允許我們返回或者刪除文件中重複的行,默認寫到標準輸出。我們必須注意到,除非兩個重複的行相鄰,否則uniq 命令不會刪除他們。因此,uniq 經常和一個前置的 sort 命令(一種用來對文本行進行排序的演算法)搭配使用。默認情況下,sort 使用第一個欄位(用空格分隔)作為關鍵欄位。要指定一個不同的關鍵欄位,我們需要使用 -k 選項。
樣例
du –sch /path/to/directory/* 命令將會以人類可讀的格式返回在指定目錄下每一個子文件夾和文件的磁碟空間使用情況(也會顯示每個目錄總體的情況),而且不是按照大小輸出,而是按照子文件夾和文件的名稱。我們可以使用下面的命令來讓它通過大小排序。
# du -sch /var/* | sort -h
sort 命令樣例
你可以通過使用下面的命令告訴 uniq 比較每一行的前6個字元(-w 6)(這裡是指定的日期)來統計日誌事件的個數,而且在每一行的開頭輸出出現的次數(-c)。
# cat /var/log/mail.log | uniq -c -w 6
文件中的統計數字
最後,你可以組合使用 sort 和 uniq 命令(通常如此)。看看下面文件中捐助者、捐助日期和金額的列表。假設我們想知道有多少個捐助者。我們可以使用下面的命令來分隔第一欄位(欄位由冒號分隔),按名稱排序並且刪除重複的行。
# cat sortuniq.txt | cut -d: -f1 | sort | uniq
尋找文件中不重複的記錄
- 也可閱讀: 13個「cat」命令樣例
grep 命令
grep 在文件(或命令輸出)中搜索指定正則表達式,並且在標準輸出中輸出匹配的行。
樣例
顯示文件 /etc/passwd 中用戶 gacanepa 的信息,忽略大小寫。
# grep -i gacanepa /etc/passwd
grep 命令樣例
顯示 /etc 文件夾下所有 rc 開頭並跟隨任意數字的內容。
# ls -l /etc | grep rc[0-9]
使用 grep 列出內容
- 也可閱讀: 12個「grep」命令樣例
tr 命令使用技巧
tr 命令可以用來從標準輸入中轉換(改變)或者刪除字元,並將結果寫入到標準輸出中。
樣例
把 sortuniq.txt 文件中所有的小寫改為大寫。
# cat sortuniq.txt | tr [:lower:] [:upper:]
排序文件中的字元串
壓縮ls –l
輸出中的分隔符為一個空格。
# ls -l | tr -s ' '
壓縮分隔符
cut 命令使用方法
cut 命令可以基於位元組(-b選項)、字元(-c)或者欄位(-f)提取部分輸入(從標準輸入或者文件中)並且將結果輸出到標準輸出。在最後一種情況下(基於欄位),默認的欄位分隔符是一個製表符,但可以由 -d 選項來指定不同的分隔符。
樣例
從 /etc/passwd 中提取用戶賬戶和他們被分配的默認 shell(-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
last 命令樣例
上面的命令顯示了如何將多個命令和管道結合起來,以便根據我們的要求得到過濾後的數據。你也可以逐步地使用它以幫助你理解輸出是如何從一個命令傳輸到下一個命令的(順便說一句,這是一個非常好的學習經驗!)
總結
儘管這個例子(以及在當前教程中的其他實例)第一眼看上去可能不是非常有用,但是他們是體驗在 Linux 命令行中創建、編輯和操作文件的一個非常好的開始。請隨時留下你的問題和意見——不勝感激!
參考鏈接
via: http://www.tecmint.com/sed-command-to-create-edit-and-manipulate-files-in-linux/
作者:Gabriel Cánepa 譯者:Xuanwo 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive