iT邦幫忙

DAY 10
6

邁向 RHCE 之路系列 第 10

邁向 RHCE 之路 (Day10) - vi 編輯器及常用指令

  • 分享至 

  • twitterImage
  •  

vi 編輯器 (進階 vim 編輯器),以下為 vi 編輯器簡單介紹,詳細內容可參考維基百科 - vivi指令說明(完整版),VI 編輯器有 3 種模式:
Command-Mode: 可下指令
按下 aR 即可進入 Insert-Mode
按下 : 即可進入 Extend-Mode
按下 gg 跳至檔頭
按下 G 跳至檔尾

Insert-Mode: 可對檔案內容進行編輯
按下 ESC 即可回到 Command-Mode

Extend-Mode: 可執行檔案內容搜尋、取代、存檔、離開
按下 ESC 即可回到 Command-Mode
常用參數如下
set nu: 顯示行數
set nonu: 取消顯示行數
set hlsearch: 搜尋到關鍵字時高亮度顯示 (High Light)
set nohlsearch: 取消搜尋到關鍵字時高亮度顯示 (High Light)
set ic: 搜尋關鍵字時忽略大小寫
set noic: 取消搜尋關鍵字時忽略大小寫
wq: 存檔後離開
w filename: 另存新檔
e!: 重新載入原檔
1,10s/iphone/ipad2 : 把檔案中 1 ~ 10 行的內容進行更換
%s/iphone/ipad2/g : 把檔案中所有的內容進行更換

以下為介紹在指令模式下常用到的基本指令及其應用
File Contents: less、cat、tac、paste
File Excerpts: head、tail
Extract by Column or Field: cut
Extract by Keyword: grep
Text Stats: wc
Sorting Text: sort
Eliminating Duplicate Lines: sort -u and uniq -c
Comparing Files: diff
----- File Contents (less、cat、tac、paste) -----
透過指令 less 來查看檔案內容,當內容大於一頁時可利用 PageUp、PageDown 來進行上下頁切換,指令 cat 及 tac 則為一次列出檔案內容,cat 為從頭開始列出檔案內容 tac 為從尾開始列出檔案內容。

#less /etc/issue
 CentOS Linux release 6.0 (Final)
 Kernel \r on an \m
#cat /etc/issue                   //從頭開始列出檔案內容
 CentOS Linux release 6.0 (Final)
 Kernel \r on an \m
#tac /etc/issue                   //從尾開始列出檔案內容
 Kernel \r on an \m
 CentOS Linux release 6.0 (Final)

指令 cat 及 paste 若欲同時列出多個檔案內容時其排列方式不同,cat 為一個檔案內容顯示完畢後緊接另一個檔案內容而 paste 則是平行顯示 (中間隔 tab),這樣說或許很抽象但利用下列範例即可知其功能,如下檔案 f1 內容為小寫 a ~ e 而 f2 內容為大寫 A ~ E。

#cat f1 f2      //一個檔案內容顯示完畢後緊接另一個檔案內容
 1
 2
 3
 a
 b
 c
#paste f1 f2    //平行顯示 (中間隔 tab)
 1       a
 2       b
 3       c

----- File Excerpts (head、tail) -----
指令 head 及 tail 則可用來快速查看檔案內容並指令顯示行數 (預設為 10 行),head 預設為顯示檔案內容前 10 行 tail 預設為顯示檔案內容後 10 行,若欲指定顯示的行數可配合參數 -n。

#head -n 3 /etc/passwd     //顯示檔案內容前 5 行
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#tail -n 1 /etc/passwd     //指定顯示多個檔案內容後 1 行
 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
 weithenn:x:500:500::/home/user/weithenn:/bin/bash
 wei:x:501:501::/home/user/wei:/bin/bash

----- Extract by Column or Field (cut) -----
指令 cut 則可用來對字串進行切割的處理,如下範例為利用指令 ifconfig 顯示內容配合 grep 搜尋字串內容後後利用 cut 對標準輸出 Standard Output (1) 字串進行處理,以下為操作範例及常用參數為 -d: 指定切割符號、-f: 指定以切割符號為準取第幾個欄位,如下操作練習利用 grep 搜尋網卡 IP Address 配合使用 cut 指令來取出 IP Address:

#ifconfig |grep Bc                 //指令執行結果
 inet addr: 192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
#ifconfig | grep Bc | cut -f2 -d:  //上述輸出字串結果,指定切割符號為 : 後取第二個欄位
 192.168.1.10  Bcast
#ifconfig |grep Bc | cut -d: -f2 | cut -d" " -f1  //上述輸出字串結果,指定切割符號為空格後取第一個欄位
 192.168.1.10

----- Extract by Keyword (grep) -----
指令 grep 可對檔案內容或標準輸出進行字串過濾的處理,以下為操作範例及常用參數說明:
-i: 忽略大小寫
-n: 顯示行數
-v: 排除指定的搜尋文字
-A: 找到指定條件並列出後指定行數
-B: 找到指定條件並列出前指定行數
-C: 找到指定條件並列出前/後指定行數
-r: 搜尋資料夾時連子目錄都一併尋找 (Recursively)
--color=auto: 找到指定條件時使用顏色顯示

#cat test        //查看檔案 test 內容
 abc
 ABC
 xyz
 XYZ
#grep a test     //搜尋檔案內容中含 a 字元的字串
 abc
#grep -i a test  //搜尋檔案內容中含 a、A 字元的字串 (忽略大小寫)
 abc
 ABC
#grep -n a test  //搜尋檔案內容中含 a 字元的字串並印出行數
 1:abc
#grep -v a test  //排除搜尋檔案內容中含 a 字元的字串
 ABC
 xyz
 XYZ
#grep -A2 a test //搜尋檔案內容中含 a 字元的字串並印出後 2 行
 abc
 ABC
 xyz
#grep -B1 x test //搜尋檔案內容中含 x 字元的字串並印出前 1 行
 ABC
 xyz
#grep -C1 x test //搜尋檔案內容中含 x 字元的字串並印出前後各 1 行
 ABC
 xyz
 XYZ

下列操作為切換至系統放置文字目錄 /usr/share/doc 使用參數 -n 來列出行數,-r 連子目錄都尋找,--color=auto 顏色顯示擊中條件,搜尋條件為 127.0.0.1

#cd /usr/share/doc
#grep -nr --color=auto '127.0.0.1' *
 curl-7.19.7/FAQ:1081:  pure numbers, such as 127.0.0.1 or ::1.
 dhclient-4.1.1/dhclient.conf.sample:5:prepend domain-name-servers 127.0.0.1;
 ...略...

----- Text Stats (wc) -----
指令 wc 計算檔案的列數 (Line)、字數 (Word)、位元組 (Bytes),以下為操作範例及常用參數說明:
-l: 統計列數
-w: 統計字數
-c: 統計位元組

#paste f1 f2   //顯示 f1 及 f2 內容
 1       a
 2       b
 3       c
#wc -l f1      //統計 f1 檔案內容列數
 3 f1
#wc -l f2      //統計 f2 檔案內容列數
 3 f2
#wc -l f1 f2   //統計 f1 及 f2 檔案內容列數
 3 f1
 3 f2
 6 total       //統計多個檔案時會有加總值

----- Sorting Text (sort) -----
指令 sort 可對檔案內容進行排序並將結果顯示於標準輸出 (STDOUT),但請注意其指令功能並不會改變檔案內容而是僅僅顯示而以,以下為操作範例及常用參數說明:
-u: 顯示唯一 (排除重覆字)
-r: 反向排序
-t: 指定分隔符號
-k 3: 取第三欄
-n:為將文字轉成數字才能正確排序

#cat f1      //查看 f1 檔案內容 
 Z
 b
 g
 A
 y 
 A
#sort f1     //排序 f1 內容 (僅顯示於 STDOUT 並未改變檔案內容本身)
 A
 A
 b
 g
 y
 Z
#sort -r f1  //反向排序 f1 內容 (僅顯示於 STDOUT 並未改變檔案內容本身)
 Z
 y
 g
 b
 A
 A
#sort -u f1  //排序後去掉重覆字 (僅顯示於 STDOUT 並未改變檔案內容本身)
 A
 b
 g
 y
 Z
#sort -t : -k 3 -n /etc/passwd   //對 UID 進行排序
 ...略...
 weithenn:x:500:500::/home/user/weithenn:/bin/bash
 wei:x:501:501::/home/user/wei:/bin/bash
 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

雖然 sort 有參數 -u 可來顯示唯一字元,但有時我們會想知道到底重覆了幾次,此時就可使用指令 uniq 配合參數 -c 來達成。

#cut -d: -f7 /etc/passwd  | sort | uniq     //取使用者帳號檔案第 7 個欄位排序後取唯一字元
 /bin/bash
 /bin/sync
 /sbin/halt
 /sbin/nologin
 /sbin/shutdown
#cut -d: -f7 /etc/passwd  | sort | uniq -c  //加上 -c 參數來統計重覆了幾次
  3 /bin/bash
  1 /bin/sync
  1 /sbin/halt
 30 /sbin/nologin
  1 /sbin/shutdown

----- Comparing Files (diff) -----
指令 diff 可對指定的檔案內容進行內容比對並將不同的地方顯示出來。

#cp -a /etc/issue /etc/issue.orig    //複製檔案
#vi /etc/issue                       //修改內容將 \m 刪除
#diff -ruN /etc/issue /etc/issue.orig  //使用 diff 對 2 個檔案進行比對
 --- /etc/issue  2011-10-11 12:14:09.029819705 +0800
 +++ /etc/issue.orig     2011-07-03 10:15:46.000000000 +0800
 @@ -1,3 +1,3 @@
  CentOS Linux release 6.0 (Final)
 -Kernel \r on an
 +Kernel \r on an \m

----- Tools for Manipulating Text (sed) -----
sed 指令可快速搜尋檔案內容某個關鍵字並進行取代的動作,但請注意其指令功能並不會改變檔案內容而是僅僅顯示而以 (若要取代則加上 -i 參數即可:

#cat f1                      //查看檔案內容
 1,iphone,ipad
 2,iPhone,ipad
 3,Iphone,IPAD
#sed '1s/ipad/ipod/' f1      //將第 1 個關鍵字 ipad 取代為 ipod
 1,iphone,ipod
 2,iPhone,ipad
 3,Iphone,IPAD
#sed 's/ipad/ipod/g' f1      //將所有關鍵字 ipad 取代為 ipod
 1,iphone,ipod
 2,iPhone,ipod
 3,Iphone,IPAD
#sed 's/[iI]phone/ipod/g' f1 //將所有關鍵字 iphone, Iphone 取代為 ipod
 1,ipod,ipad
 2,iPhone,ipad
 3,ipod,IPAD

(上一篇)邁向 RHCE 之路 (Day09) - 正規表示式 (Regular Expression)
(下一篇)邁向 RHCE 之路 (Day11) - 執行序 (Process)
邁向 RHCE 之路系列文章連結


上一篇
邁向 RHCE 之路 (Day09) - 正規表示式 (Regular Expression)
下一篇
邁向 RHCE 之路 (Day11) - 執行序 (Process)
系列文
邁向 RHCE 之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言