︿
Top

1、前言

vi 編輯器 (進階 vim 編輯器),以下為 vi 編輯器簡單介紹,詳細內容可參考 維基百科 - vi國立中山大學 - vi 指令說明(完整版)



文章目錄

1、前言
2、VI 編輯器 3 種運作模式
3、File Contents (less、cat、tac、paste)
4、File Excerpts (head、tail)
5、Extract by Column or Field (cut)
6、Extract by Keyword (grep)
7、Text Stats (wc)
8、Sorting Text (sort)
9、Comparing Files (diff)
10、Tools for Manipulating Text (sed)



2、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。



3、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




4、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




5、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




6、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;
  ...略...




7、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      //統計多個檔案時會有加總值




8、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




9、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




10、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
文章標籤: