- RHCSARHCE 紅帽Linux認證學習指南(第7版)EX200 & EX300
- (美)Michael Jang等
- 5196字
- 2020-11-29 00:30:00
認證目標3.03 文本文件的管理
Linux和Unix都通過一系列文本文件進行管理。Linux系統管理員通常不喜歡用圖形編輯器管理這些配置文件。像OpenOffice.org Writer或微軟的Word這類的編輯器通常會把文件保存為二進制格式,或者會修改純文本文件的編碼。除非文本文件按原始格式保存,否則對文本做任何修改都可能導致Linux系統無法啟動。
Linux命令把文本文件當作數據流進行管理。你在前面已經看到重定向符和管道符等工具的作用。但是如果沒有合適的工具將數據進行分類處理,我們可能會被數據淹沒了。即使在對文件進行編輯之前,也必須知道如何在命令行接口讀取這些文本文件。
3.3.1 文本流的讀命令
前面已經學習了cd、ls和pwd用于處理Linux文件的命令。加上find和locate命令,我們已掌握了如何確定所需要文件的位置。
現在該是如何讀取、復制和移動文件的時候了。大多數Linux配置文件都是文本文件,Linux編輯器就是文本編輯器。Linux命令就是為讀取文本文件而設計的。為確定當前目錄中文件的類型,可以試試file *命令。
1. cat命令
最簡單的文本文件讀取命令是cat。cat filename命令可翻頁顯示filename文件的內容。它也可以處理多個文件名。它把多個文件的內容合并在一起,并將其連續輸出到屏幕上。也可以把輸出結果重定向到自己喜歡的文件名中,這將在3.1.5一節“文本流和命令重定向”中討論。
2. less和more命令
大文件需要一個可以讓用戶悠閑自在瀏覽文件內容的命令,它們就是more和less。用more filename命令可以翻頁顯示文本文件的內容,每次一個屏幕從頭到尾顯示。使用less filename命令,我們可以用PAGE UP、PAGE DOWN和方向鍵向前或向后翻頁查看同樣的文本。這兩個命令都支持vi模式搜索。
less和more命令不修改文件,所以是翻頁顯示大文本文件(如錯誤日志)或者在大文本文件中搜索項目的極佳方法。例如,要瀏覽基本的/var/log/messages文件,可執行下面的命令:
# less /var/log/messages
然后就可以翻頁顯示日志文件以搜索文件中的重要信息。接下來可以用向前的斜杠(/)和問號在文件中向前或向后搜索。例如,當我們執行了上述命令后,就會出現如圖3-3所示的窗口。

圖3-3 less命令和/var/log/messages中的內容
例如,要在文件中向前搜索“IPv4 tunneling”,只要在命令行窗口的底部輸入下面的內容即可:
/IPv4 tunneling
如果要按相反的方向搜索,則只要把/改為?即可。
less命令有幾個功能是more和cat這兩個命令所沒有的。它可以讀取用Gzip格式壓縮的文本文件,通常這種文件的擴展名為.gz。例如,許多在shell環境執行的標準命令的man文檔都保存在/usr/share/man/manl目錄中。這個目錄中的所有文件都被壓縮成.gz格式的文件。但用less命令不需要解壓就可以讀取這些文件的內容。
這就讓我們想起man命令的使用。換言之,下面兩個命令在功能上是等效的:
# man cat # less /usr/share/man/man1/cat.1.gz
3. head和tail命令
head和tail是兩個不同的命令,但是它們的用法完全相同。默認情況下,head filename命令顯示一個文件的前10行內容。tail filename命令顯示文件的最后10行內容。可以用-nxy開關選項定義需要顯示的行數。例如,tail -n 15 /etc/passwd命令顯示/etc/passwd文件的最后15行內容。
tail命令特別有用,可用于解決執行過程中發生的問題。例如,如果登錄一直失敗,則下面的命令可以監測相關文件,當記錄下新的日志條目時在屏幕上顯示出來:
# tail -f /var/log/secure
3.3.2 處理文本流的命令
文本流就是數據的流動。例如,cat filename命令把來自filename的數據流輸出到終端上。當這些文件變大時,最好先用過濾器命令對這些流進行處理。
為此,Linux引入了幾個簡單的命令幫助我們搜索、檢查和對文件的內容排序。有些特殊的文件,它們包含其他文件。這些容器文件的一部分俗稱為打包工具(tarball)。
實際經驗
打包(tarball)是一種發布Linux程序包的常用方法。它們通常以一個壓縮格式發布程序包,如.tar.gz或.tgz文件擴展名,它們把程序包都集中到一個文件中。
1. sort命令
可以用多種方法對文件的內容進行排序。默認情況下,sort命令按照字母順序將文件內容按每行首字符進行排序。例如,sort /etc/passwd命令把所有用戶(包括與某些特定服務有關的用戶)按用戶名排序。
2. grep命令
grep命令使用搜索詞搜索文件。它返回包含此搜索詞的整行內容。例如,grep "Michael Jang"/etc/passwd就會在/etc/passwd文件中查找到本書作者的名字。
在grep命令中可使用正則表達式。正則表達式十分強大,可指定復雜的搜索模式。表3-2中列出了在正則表達式中具有特殊意義的一些字符。如果希望丟棄元字符的特殊意義,而純粹照字面使用,需要在元字符的前面加上反斜杠(\)。
表3-2 正則表達式中的特殊字符

grep命令支持一些有用的開關選項。為使搜索區分大小寫,可以在命令行傳遞-i選項。-E選項支持使用擴展的正則表達式語法。另外一個值得注意的開關選項是-v,它可反轉匹配邏輯。也就是說,它告訴grep,只選擇不能匹配正則表達式的那些行。
舉個例子。假設只想選擇/etc/nsswitch.conf中不為空、且不包含注釋(即不以#字符開頭)的那些行。這可以通過執行下面的命令實現:
# grep -v '^$' /etc/nsswitch.conf | grep -v '^#'
注意,第一個grep命令選擇了全部不為空的行(匹配空行的正則表達式為^$,也就是說,行尾緊跟行首)。然后,輸出通過管道發送給第二個grep命令,它排除了所有以#字符開頭的行。
使用一個grep命令和-e開關,可以得到同樣的結果,-e開關允許在同一命令中指定多個搜索模式:
# grep -v -e '^$' -e '^#' /etc/nsswitch.conf
關于正則表達式的更多信息,可輸入man 7 regex查看。
3. diff命令
diff是一個非常有用的命令,它可以找出兩個文件的差別。如果已經使用過本章后面將要介紹的Network Manager Connections Editor工具,此工具會修改/etc/sysconfig/network-scripts目錄中的諸如ifcfg-eth0文件的內容。
如果已經備份了ifcfg-eth0文件,則用diff命令可以找出兩個文件的區別。例如,下面的命令可找出/root目錄中的ifcfg-eth0與/etc/ sysconfig/ network-scripts目錄中ifcfg-eth0文件的差別:
# diff /root/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0
4. wc命令
wc是單詞統計(word count)的縮寫符。它可以返回一個文件中的行數、單詞數和字符數。wc命令很容易使用,例如,wc -w filename命令返回此文件的單詞數。
5. sed命令
sed命令是流編輯(stream editor)的縮寫符,用于搜索并修改文件中指定的單詞甚至文本流。例如,下面的命令把opsys文件每一行的第一個Windows改為Linux,并把結果保存到newopsys文件中:
# sed 's/Windows/Linux/' opsys > newopsys
但這還不是sed的全部功能。如果在opsys文件中的一行有不止一個Windows,這個命令不會替換第二個Windows,但是增加“全局”后綴符(g)就可以做到這一點:
# sed 's/Windows/Linux/g' opsys > newopsys
下面的示例確保所有用writable=yes指令配置的Samba共享參數都被改為writable=no:
# sed 's/writable = yes/writable = no/g' /etc/samba/smb.conf > ~/smb.conf
當然,在原來的/etc/samba/smb.conf文件被覆蓋之前,最好先瀏覽/root/smb.conf文件中的內容。
6. awk命令
awk命令是以它的開發者命名的(Aho、Weinberger和Kernighan),它更像是一個完整的編程語言,而不只是一條命令。它用一個關鍵字確定所在的行,可以讀取這一行中的從指定列開始的內容。一個常用的示例是它作用于/etc/passwd文件。例如,下面這個命令輸出/etc/passwd中包含“mike”的每個用戶的第四個字段(組ID):
# awk -F : '/mike/ {print $4}' /etc/passwd
3.3.3 在控制臺編輯文本文件
RHCSA認證目標的最初版本明確要求考生需要掌握vim編輯器的使用。嚴格來說,無論用哪個文本編輯器來編輯文本文件都沒有關系。但我們認為你應該了解vim編輯器的用法,顯然Red Hat的許多人也同意這個觀點。vim編輯器是vi編輯器改進版(vi improved)的縮寫。安裝后可以用vi命令啟動vim編輯器。從現在開始我們就用vi代表這個編輯器。
我們認為每個系統管理員都應對vi有一個基本的了解。雖然emacs也是個很好的選擇,但是vi可以幫助我們挽救一個有故障的系統。如果你曾經用緊急引導媒介恢復一個重要的配置文件,則vi可能是唯一可用的編輯器。
雖然RHEL 7也包含了對一個更加直觀的nano編輯器的訪問,但是掌握vi命令可以幫助我們更快速地搜索和編輯文本文件的關鍵部分。雖然RHEL急救媒介(rescue media)提供了更多的基于控制臺的編輯器,但是vi是Linux中功能最豐富、最高效的編輯器之一。
應該掌握vi的兩種基本模式:命令模式和插入模式。當我們用vi打開一個文件時,它就處于命令模式。有些命令會啟動插入模式。打開一個文件很容易,用vi filename命令即可。圖3-4是vi命令打開/etc/nsswitch.conf文件的一個示例。

圖3-4 用vi編輯/etc/nsswitch.conf文件
下面是對vi編輯器的最簡單的介紹。要想掌握更多的內容有很多圖書可以選擇,也可以用vimtutor命令得到一個vi教程。
1. vi的命令模式
處于命令模式時,除了編輯外可以對一個文本文件做任何操作。在命令模式下可以使用的選項非常多且經常變化,用幾本書也描述不完。歸納起來vi命令的選項可分為7類:
● 打開 要在命令行接口用vi編輯器打開一個文件,可執行vi filename命令。
● 搜索 對于向前搜索,在反斜杠(/)后面加上搜索詞。記住,Linux是大小寫敏感的,因此要用/Michael(而不是/michael)命令來搜索/etc/passwd文件中的“Michael”。向后搜索要用問號(?)。
● 寫入 保存編輯后的結果要用w命令。可以結合其他命令,如:wq寫入文件并退出vi。
● 關閉 用:q命令退出vi編輯器。
● 放棄 放棄任何修改要用:q!命令。
● 編輯 可以用vi的很多命令編輯文件。例如,x刪除當前光標所在的字符;dw刪除當前光標所在單詞;dd刪除當前行。記住,yy把當前行復制到緩沖區中,p把字符復制到緩沖區中,u取消前一次的修改。
● 插入 有很多命令可以啟動插入模式。按i在當前位置開始插入文本,按o在光標當前位置的下方插入一個空行。
2.基本的文本編輯
在現在的Linux系統中,用vi編輯文件是一件非常容易的事。只需要常用的導航鍵(方向鍵、PAGEUP和PAGEDOWN),然而用i和o等基本命令啟動vi的插入模式,直接在文件中輸入新的內容。
當結束插入模式時,按ESC鍵返回到命令模式。這時可以保存、放棄編輯結果,并退出vi程序。
實際經驗
vi命令有幾個專用的版本。vipw、vigw和visudo命令分別用來編輯 /etc/passwd、/etc/group和/etc/sudoers文件。vipw -s和vigr -s命令分別編輯/etc/shadow和/etc/gshadow文件。
3.3.4 練習3-1:用vi創建一個新用戶
在這個練習中,我們通過vi文本編輯器編輯/etc/passwd文件以創建一個新用戶。雖然創建Linux新用戶還有其他方法,這個練習可以用來驗證使用vi和命令行接口的熟練程度。
(1)打開Linux命令行窗口。以root用戶登錄并輸入vipw命令。這個命令用vi編輯器打開/etc/passwd文件。
(2)導航到文件的末尾。在命令模式下移動到文件末尾有很多辦法,包括使用DOWN ARROW鍵、PAGEDOWN鍵,或者G命令。
(3)找到普通用戶所在的一行。如果剛剛新建一個用戶,則應該文件的最后一行,其UID為1000或更高。如果不存在普通用戶,則找到第一行,它肯定與root系統管理員有關,這一行在第3列和第4列有數字0。
(4)復制這一行內容。如果已經熟悉vi的操作,則應該知道如何用yy命令將整行內容復制到緩沖區中。這就是把整行內容“拖到”緩存中。然后用p命令把這一行內容粘貼到其他位置,可以粘貼任意多次。
(5)修改用戶名、用戶ID和組ID以及用戶全名和新用戶的主目錄。有關它們的詳細信息請閱讀第8章內容。例如,在下面的示例中,這些內容對應于tweedle、1001、1001、Tweedle Dee和/home/tweedle。確保用戶名與主目錄對應。

(6)按下ESC鍵返回到命令模式,用:w命令保存文件,然后用:q退出vi(在vi中可以合并使用這兩個命令。下次修改后要保存文件并且退出vi可以用:wq命令)。
(7)應該看到如下的消息:
You have modified /etc/passwd. You may need to modify /etc/shadow for consistency. Please use the command 'vipw -s' to do so.
該信息可能會被忽略,因為第8步會在etc/shadow文件中添加合適的信息,但你無須直接修改/etc/shadow。
(8)以root用戶身份執行passwd newuser命令。給新用戶設置一個口令。在本例中,這個新用戶是tweedle。
(9)過程還沒有結束,每個用戶還需要一個組。因此執行vigr命令。重復前面介紹的把某一合適的行復制到文本的末尾的步驟。注意,組名和組ID通常與用戶名和用戶ID相同。
(10)只需要修改新增加一行中的組名和組ID。根據前面示例的信息,組名為tweedle,組ID為1001。
(11)重復前面提到的:wq命令保存文件并且關閉vi程序。
(12)注意以下信息:
You have modified /etc/group. You may need to modify /etc/gshadow for consistency. Please use the command 'vigr -s' to do so.
(13)如前所述,用vigr -s命令打開/etc/gshadow文件。我們注意到這個文件的內容不多。找到合適一行進行復制后,就只需要修改組名。
(14)重復剛才提到的:wq命令,保存文件并關閉vi。實際上,我們會看到一個信息,表示這個文件是只讀的。因此,要保存到這種“只讀文件”中必須用:wq!命令,這會覆蓋掉當前的設置。
(15)正確建立新用戶還需要另外幾個步驟。這些步驟與新用戶的主目錄、/etc/skel目錄中的標準文件有關。詳細內容請閱讀第8章。
3.3.5 如果不喜歡vi
默認情況下,當我們執行edquota和crontab命令時,系統都會用vi編輯器打開相應的quota和cron作業配置文件。如果很不喜歡用vi,則用下面的命令可以改變默認編輯器:
# export EDITOR=/bin/nano
如果想改變所有用戶的默認編輯器,則要把前面這一行命令添加到/etc/environment配置文件中。不是非得用vi編輯器修改/etc/environment文件不可,下面的命令可以把剛才提到的命令添加到/etc/environment文件的末尾。
# echo 'export EDITOR=/bin/nano' >> /etc/environment
由于nano編輯器相當直觀,如圖3-5所示,因此本書不提供此編輯器的用法。完整的使用手冊可從www.nano-editor.org/dist/v2.3/nano.html下載。

圖3-5 用nano編輯器打開/etc/nsswitch.conf文件
如果喜歡用其他編輯器如emacs,也可做類似修改。
3.3.6 用GUI工具編輯文本文件
毫無疑問,Red Hat考試對使用GUI的用戶已經越來越友好。曾經有一段時間,RHCSA認證目標包括了gedit文本編輯器。比較傳統的Linux系統管理員可能會對此感到恐懼(gedit編輯器因此從RHCSA考試中刪除)。
如果系統沒有安裝gedit編輯器,可執行yum install gedit命令安裝gedit。一旦安裝了gedit,單擊Applications | Accessories | gedit就可以啟動它。由于它是一個直觀的GUI文本編輯器,因此它的用法很簡單。不要糾纏于編輯器,它們只不過是考試和實際工作的一個工具而已。
但如果要在遠程系統上編輯配置文件,我們可能無法訪問遠程系統上的gedit,特別當遠程系統還沒有安裝gedit時。當然,我們可以在任何Red Hat系統上安裝該GUI工具,并使用X轉發。但是許多管理員建立的虛擬機是不帶GUI的,目的是為了節省空間并降低安全風險。
- pcDuino開發實戰
- Linux設備驅動開發詳解(第2版)
- Cybersecurity:Attack and Defense Strategies
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- 嵌入式操作系統(Linux篇)(微課版)
- macOS效率手冊
- Mobile First Design with HTML5 and CSS3
- Linux服務器配置與管理
- Django Project Blueprints
- 計算機應用基礎(Windows 7+Office 2016)
- CSS揭秘
- Learn Quantum Computing with Python and IBM Quantum Experience
- Less Web Development Essentials
- Windows 8完全自學手冊
- Android NDK Beginner's Guide