iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
IT管理

Rocky Linux 8:系統管理與維運實戰系列 第 7

第6章:基本操作文字檔案介紹

前言

在上一章節中,介紹了該如何使用man這個指令來查詢指定的指令的用法,在這一章節中,筆者將繼續的介紹基本操作文字檔案的方式以及相關的指令使用方法。

重新導向檔案輸出或是指令

在解釋重新導向如何運作之前,可以搭配下面這張概念圖:

Redirect image

從上面的圖示可以知道,程式或是指令在執行的時候,會有三個管線,第一個就是使用者執行指令或是程式的時候,會有一個standard input的管線(stdin),這個就是當程式或是指令是互動式的時候,則會監控鍵盤所輸入的字串,當程式或指令執行一陣子之後,會輸出一些訊息,有些訊息是正常的資訊,那這些輸出的訊息則會重新導向到stdout,就是standard output,標準輸出的意思,而有些訊息會是在程式或是指令執行的時候出現錯誤訊息,這些錯誤的訊息則會導向到stderr之管線,即standard error,標準錯誤的意思,而編號0是stdin,編號1的即是stdout,編號2則是stderr。

知道管線上面會存放什麼訊息之後,接著就可以裡用幾個常用的指令來演示重新導向訊息的範例了。

重新導向輸出檔案範例

首先開啟workstation虛擬機器,登入到rocky這個使用者之桌面環境之後,,筆者使用ls這個指令當作範例,並執行下列的指令:

[rockylinux@workstation ~]$ ls ~
Desktop    Downloads   file2_soft  ls.ps   Music     Public     Videos
Documents  file2_hard  ls.pdf      ls.txt  Pictures  Templates

ls~參數的話,指的是將家目錄底下的檔案與目錄(不包含隱藏檔案)列出,若是使用下列的指令:

[rockylinux@workstation ~]$ ls ~ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
Templates
Videos

執行ls ~ > home_list.txt指令則是將輸出的檔案清單重新導向到home_list.txt這個檔案中,接著可以使用cat這個指令將指定的檔案內容給印出來到終端機上,就會得到上面的樣子了。那>這是什麼?這指的是將stdin輸出的訊息重新導向到home_list.txt檔案裡,也等價於ls 1> home_list.txt指令,所以當使用ls這個指令輸出的訊息是在stderr時候,則導向的檔案則會是空的,若只要將stderr之訊息存下來,那只要改成ls not_found_dir 2> error.txt即可,相關的執行命令之結果訊息如下:

[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory

那若要將stdout與stderr分別重新導向到個別的檔案去儲存,那可以使用下列的方式做到:

[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$ ls ~ 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$ cat error.txt
[rockylinux@workstation ~]$

從上面的使用來看,就是分別將編號1之stdout與編號之stderr重新導向到success.txterror.txt檔案儲存,若要將上述兩個管線都導向到同一個檔案呢?那可以參考下列的做法:

[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
ls: cannot access 'not_found_dir': No such file or directory

從上面的執行指令輸出結果,可以知道兩件事情:

  • 可以使用2>&1將stdout與stderr兩個管線的輸出訊息同時重新導向到message.txt做儲存。
  • 可以注意到,使用>會將輸出的訊息導向到指定的檔案之外,也會將同一個檔案之內容給覆蓋掉,那要留下原本的文字檔案要怎麼做呢?可以參考下列的做法:
[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ ls not_found_dir >> message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
ls: cannot access 'not_found_dir': No such file or directory

從上面的執行指令輸出過程,可以看到,首先使用>方式先將message.txt檔案內容覆蓋成前家目錄的清單訊息,接著將ls not_found_dir之錯誤訊息用>>之方式將內容從原本message.txt最後一行內容開始附加進去,這樣就會完整保存之前所存放在message.txt檔案之內容了。

Pipelines管線與tee指令用法介紹

講完了重新導向以及標準輸出與錯誤之重新導向到檔案之後,接著來介紹另一個指令的功能,就是管線Pipelines了。這功能其實意思是,將前面的stdout輸出的結果當成stdin輸入並給下一個指定的指令,並兩者用|隔開,那什麼意思呢?可以看一下下面的執行指令範例:

[rockylinux@workstation ~]$ ls ~ | tee home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos

從上面執行指令的過程可以知道,首先先用ls ~將家目錄除隱藏檔案之外的檔案與目錄全數列出,接著使用pipelines管線將前面輸出的檔案與目錄清單當成輸入轉給tee這個指令,這個指令是用來將讀取標準輸入訊息以及將讀到的訊息寫入到指定的檔案中,因為使用tee指令的時候,會一併把寫入的輸入訊息給印出來,若不要將這些輸入的訊息印出來的話,則可以將上述的指令改成:ls ~ | tee home_list.txt > /dev/null,意思就是將寫入的訊息stdout之標準輸出導向到沒有,/dev/null是一個特別的裝置檔案,可以稱為位元桶或是黑洞,導向這裡的路徑的訊息都會被吃掉與不見,因此就不會有輸出的訊息了。

除了使用tee指令之外,另外也可以使用less或是more指令將用cat指令所書的指定檔案內容終端的文字閱讀器瀏覽,相關執行的指令方式如下:

[rockylinux@workstation ~]$ ls ~/ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt | less
[rockylinux@workstation ~]$
Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
(END)

從上面的指令執行後的輸出訊息可以得知,首先先透過ls ~ > home_list.txt將家目錄的清單給儲存起來,接著使用cat指令將home_list.txt檔案給印出並使用管線pipelines方式將前面檔案內容當成輸入並交給less指令,接著less便會開啟一個文字閱讀器讓圖取檔案內容變得方便,進入文字閱讀器之後,可以用鍵盤上與下方向鍵進行移動,要離開文字閱讀器的話,按下鍵盤的Q即可以離開,若要搜尋的的話,則可以按下鍵盤的/之後,便可以輸入要搜尋的關鍵字。

vim簡易介紹與操作

vim,是一個功能強大且多元的終端機上的文字編輯器,透過使用鍵盤的方式便可以進行文字檔案內容的編輯,為什麼要學vim呢?原因很簡單,因為有時候,主機並不會有桌面環境,只有終端機的情況下,有需要編輯檔案就無法使用圖形化介面的文字編輯器,像是gedit等,因此學習vim會變得如此的重要原因就在這裡。

要開啟vim指令很簡單,只要利用下面的方式即可以開啟指定的檔案:

[rockylinux@workstation ~]$ vim home_list.txt
[rockylinux@workstation ~]$

開啟檔案之後,就會進到文字編輯的模式,相關模式如下:

Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
~
~
~
~
~
 "home_list.txt" 9L, 81C

相關的vim簡易操作方式如下:

  • 按下鍵盤上的i鍵:在游標前方開始,插入字元。
  • 按下鍵盤上的a鍵:在游標後方插入字元。
  • 按下大寫O鍵,在游標上方插空白行。
  • 按下鍵盤的o鍵:在游標下方插入空白行。
  • 按下鍵盤上的delete鍵:刪除一個字元。
  • 連續按兩下鍵盤的d鍵:刪除一行。
  • 先按數字3接著按下鍵盤的d鍵:刪除三行。
  • 連續按兩下鍵盤y鍵:複製一行。
  • 按下鍵盤的p鍵:在游標下方貼上。
    -按下鍵盤的大寫P鍵:在游標上方貼上。
  • 先按鍵盤上的數字3,接著按下y鍵:複製三行。
  • 先輸入「:」鍵接著再輸入數字1:移動游標到檔案的第1行。
  • 先輸入「:」鍵接著再輸入數字N:移動游標到檔案的第N行。
  • 先輸入「:」鍵接著再輸入$:移動到檔案的最後一行。
  • 組合鍵:ctrl加上g鍵:顯示游標在檔案的行跟列的位置。
  • 按下鍵盤上的u鍵:回到之前的上一步。
  • 組合鍵ctrl加上r鍵:下一步。
  • 先按下「/」接著輸入string,搜尋string這個字串。
  • 做完上述的搜尋動作之後,接著按下n鍵則向下搜尋指定的要搜尋的字串。
  • 做完上述的搜尋動作之後,接著按下大寫N鍵則向上搜尋指定的要搜尋的字串。
  • 先輸入「:」鍵接著再輸入w:存檔並繼續編輯。
  • 先輸入「:」鍵接著再輸入wq:存檔並結束編輯與離開vim。
  • 先輸入「:」鍵接著再輸入x:存檔並結束編輯與離開vim。
  • 先輸入「:」鍵接著再輸入q!:不存檔並結束編輯與離開vim。
  • 先輸入「:」接著,輸入「1,$ s/[Cc]at/Dog/g」:在檔案內容中,從第1行道最後一行,以正規表示式搜尋並取代指定的字串。

有關於vim的用法還有很多,筆者這邊先列出最常見的用法供讀者們參考,日後更進階的vim用法可以讀者自行去翻閱其他書籍學習,但是筆者認為這些基本的vim用法學會之後,已經足以應付大部分的事情了。

課後練習

  • 請利用ls /home/rockylinux這個指令將輸出的結果導向到home_rockylinux.txt檔案中。
  • 請利用ls /home/rockylinux_not_found這個指令將輸出的結果導向到home_rockylinux_not_found.txt檔案中。
  • 請利用ls /home/rockylinux_not_found指令,不論是stdout或是stderr之結果都將要重新導向到message.txt檔案中。
  • 請找出一個方法,不要將ls /home/rockylinux_not_found輸出的訊息顯示在終端機上。
  • 請使用cat message.txt指令並使用lessmore文字閱讀器打開,請用一行指令完成。
  • 請使用vim指令進行文字編輯,並試著將message.txt之第一行與最後一行刪除,並找到Documents字串將其改成Replaced-Documents

上一篇
第5章:取得指令使用說明幫助方法
下一篇
第7章:管理本地端主機之使用者與群組(一)
系列文
Rocky Linux 8:系統管理與維運實戰23

尚未有邦友留言

立即登入留言