台大計算機中心網路推廣協會
              網路課程講義

課程名稱:UNIX的檔案處理
上課日期:82年11月8日
講師:蕭永慶
───────────────────────────
<<<版權聲明>>>
本著作物版權屬於國立台灣大學電子計算機中心。為了推廣網路的使用,除了下列的限
制之外,任何人均可以任何型式複製或修改這份講義。
一、不得有任何的商業行為
二、複製或修改這份講義時,必須將本版權聲明列入,並註明之
三、國立台灣大學電子計算機中心不對修改過後的內容負任何的責任
───────────────────────────
<<<目錄>>>
□編輯器
  一、終端機簡介
  二、終端機控制
  三、編輯器種類
  四、vi的使用
  五、joe的使用
  六、Jove & Emacs
  七、info系統
□其他檔案處理的方法
  一、壓縮檔
  二、尋找字串
  三、nroff標準的UNIX簡易排版指令。
  四、TeX/LaTeX
  五、awk
  六、尋找檔案find

□編輯器

一、終端機簡介
        一個終端機是一個螢幕與一個鍵盤的組合,其型別有vt100, vt102, vt220,
    sun, hp, ansi 等。基本上這些型別就是不同公司的不同產品型號,他們之間的差
    異在於控制游標的方法不同,按鍵時鍵盤產生的鍵盤代碼不同,以及是否有彩色能
    力等。
        由於設計先天不良,UNIX無法自動偵測終端機的型別,必須以人工的方式告知
    。告知的方法就是設定一個環境變數TERM。UNIX裡面需要控制螢幕的程式都會參考
    此變數。設定此變數的方法如下:

    1. 在csh, tcsh下用:

            % set term = vt100

        這裡要說明的是為什麼剛剛說要設定的變數名是大寫(TERM),而這裡卻是小寫
        ;另外一個問題是csh、tcsh中,set指令是用來設定臨時變數而已,另有一個
        專門設定環境變數的指令叫setenv,為什麼不用setenv?

        答案是 csh、tcsh為了使用者的方便,只要'term'這一個臨時變數被設了值,
        csh 就自動更新TERM這個環境變數的值。

    2. 在sh,bash,ksh,zsh中要下兩個命令:

            $ TERM=vt100
            $ export TERM

        其中export的意思為,把'TERM'這個暫時變數轉成環境變數

            <UNIX小字典──環境變數與變數>

            在UNIX裡面,這是一個不講還好、越講越搞不清楚的觀念。簡單的說,所
            謂的<環境變數>就是此變數能夠告訴所有的程式使用者目前所處的環境
            ,而變數則不能,因為只有Shell 能看到變數,而環境變數是所有的程式
            都能夠看到的。例如所有的程式都需要知道TERM這個變數,所以它是一個
            環境變數。在sh下面的export命令可以想作:讓大家都能看到這個變數。

二、終端機控制
    一般而言,終端機提供一些簡單的編輯功能:
    1. 刪除一個字: BS (CTRL-H, ^H) 或 DEL (^?)
        這兩個鍵正常狀況下只有一個有用。可用以下兩個命令選擇

            % stty erase '^H'
            % stty erase '^?'

    2. 刪除一行: CTRL-U (^U)
    3. 輸出控制:

            CTRL-S (^S) 暫停輸出
            CTRL-Q (^Q) 取消暫停輸出

三、編輯器種類
    A. 列編輯器(line editor)
        列編輯器一次只能處理一行,現在除了寫程式外幾乎沒有人在用了。
        以下指令皆會啟動列編輯器:

            e, ed, ex, edit

        其中e, ed 沒有提示號,ex, edit的提示號是冒號':' 因為沒什麼用,所以只
        要知道不小心執行了怎麼出來就可以了。用^D或q 或q!可退出之。

    B. 全螢幕編輯器
        全螢幕編輯器可以使用游標移動至文字檔任何地方,做各種修改,也較自然。
        UNIX的標準編輯器是vi。其他的編輯器為網路上免費的編輯器。

            vi     VIsual editor,特色是顯示較快、游標移動也較快,不易學習。

            joe    Joe's own version of editor,本來是作者的上課作業,但是現
                    在以發展成一個成熟、穩定、方便使用的編輯器。

            emacs  Editor MACroS,最初由MIT 人工智慧實驗室流傳出來,是UNIX上
                    除了vi外最常見的編輯器。它的按鍵幾乎成了UNIX下移動游標的
                    標準。功能很強、也不是很好學。

            Jove   Jxxx's own version of Emacs,我們可以說jove是另一個emacs
                    編輯器的仿製品。但是jove編輯器沒有emacs 那麼強的擴充功能
                    ,也比較小巧玲瓏。

四、vi的使用
        vi有兩種模式,輸入模式與命令模式。剛進入vi時是處於命令模式。在命令模
    式中可以告訴vi要怎麼樣移動游標,要改哪些字,對正在編輯的文字檔做什麼處理
    。此時鍵盤上的每個鍵都可以是命令。在輸入模式則vi把所有的按鍵都當成輸入,
    不做處理。

    1. 進入輸入模式的方法
        想打幾個字到螢幕上就要先進入輸入模式。以下幾個命令皆可進入輸入模式:
        (注意大小寫)

        i   insert mode,由游標前面插入
        a   append mode,由游標後面插入
        o   open a new line and  insert
        A   append from end of line
        I   insert from begin of line

         按下列幾個鍵試試看:(先按i再按hello)

            ihello
    2. 從輸入模式跳回命令模式的方法:按鍵
        每次進入輸入模式就可以打一段文字,在輸入模式下只能用^H及^U等基本終端
        機編輯功能,按完 後就不能退回修改了。要修改必須用 跳回命
        令模式。

    3. 命令模式
        在命令模式下才能移動游標、作刪除的工作
        A. 移動游標

                           上
                左 h   j   k   l  右
                       下

             承上例,打完ihello後按一次然後四個h回到第一行。

        B. 快速移動游標

                w -- move a word                ^B - page up (backword)
                b -- move back a word           ^D - move down half a page
                ^F - page down (forward)        ^U - move up half a page

            另外可以在這些命令之前加數字,表示重複幾次。

              10j  表示向下 10 行
              10^F 表示向下 10 頁

        C. 刪除與Undo(還原)

                x -- 刪除一個字
                dd - 刪除一行
                u -- 還原上一個指令的影響(undo)

              3x  表示刪除三個字
              d8d 刪除八行

        D. 檔案處理
            在命令模式下

                ZZ  -- save & quit
                :w! -- write (save) unconditionally
                :wq -- write & quit
                :w filename -- 把檔案存到 filename 這個檔去
                :q  -- quit
                :q! -- do not save and quit
                :e filename -- edit
                :r filename -- read in a file

        E. Ex Mode

                : 使 vi 暫時進入 ex 命令模式
                Q 使 vi 退回 ex Mode

            在 ex 下用 vi 命令可回到 vi mode

        F. 搜尋
            按斜線'/'可以對本文搜尋。

                 /hello  尋找含有hello的字串。

        G. vilearn
            vi的內容太多太雜,316室的工作站有個'程式'叫vilearn可以有效率的學
            習vi的使用。

五、joe的使用
        joe使用很簡單,按CTRL-K H 就可以把按鍵印出來。比較特殊的是joe 提供區
    塊功能,可以把某區塊標示起來,然後做拷貝。此功能叫Block Commands。另外
    joe 也可以一次編輯數個檔案。(Windows)

六、Jove & Emacs
        Emacs 非常的強,甚至可以在Emacs 裡面寫E-mail,讀News,下UNIX的命令。
    Emacs 的主要訴求就是作這些事的時候按鍵都相同。
        進Emacs 後鍵盤的輸入就是文字檔的內容。Emacs 的命令大部分以CTRL- 鍵開
    頭,有些鍵是以Meta鍵開頭

    例:
        方向鍵可以用之外,
        CTRL-P   上,previous line   CTRL-N  下,next line
        CTRL-B   左,backword        CTRL-F  右,forward
                   (注意:emacs的backword/forward與vi不同)
        CTRL-D   delete
        DEL      backspace
        CTRL-V   Page down
        META-V   Page UP

        各位一定會好奇,Meta怎麼按?所謂的META鍵並非每一種鍵盤都有。在工作站
    前,空白鍵旁有個小菱形的鍵即是。如果沒有META鍵的話,META-V 要按成
    。
        在Emacs內有一點要注意的是,Emacs認為刪除游標左邊的字要用 鍵,而
    不是我們的直覺,鍵。原因就是鍵其實就是CTRL-H。而Emacs 內CTRL-H是
    用來顯示求助訊息的。

        CTRL-H b    列出目前按鍵的組合有哪些功能
        CTRL-H t    啟動emacs的教導使用程式

        jove沒有這個功能,但是有個外部程式叫teachjove。
        Emacs 的命令很多,很複雜,萬一不小心誤按了命令,可以按CTRL-G取消。
    CTRL-G在Emacs 內任何時刻都代表中斷、取消的意思。
        結束emacs可用(不存檔案)。
        Emacs/Jove按鍵不容易在講義上描述,以上的描述可提供各位初步的概念,以
    及在Emacs 內求生、以及全身而退的方法,大家有興趣可以下emacs 命令到Emacs
    的世界探險。X windows的所有編輯按鍵皆和Emacs 一樣,熟悉一點Emacs的按鍵用
    處蠻多的。

七、info系統
        這裡並不想介紹info的使用,只是讓大家知道此系統的存在而已。在emacs 內
    按CTRL-H I或者在命令列下info指令就可以進入了。info系統是一個求助系統,比
    man 方便,讀起來也較方便。但是資料庫不大,只包含了Emacs 及一些程式發展工
    具的使用方法。

□其他檔案處理的方法

本節介紹UNIX處理檔案的一些程式

一、壓縮檔
    一個檔案太大、不常用,可以把它壓縮起來,以節省空間。指令為
    compress/uncompress或gzip/gunzip。相關的程式有zcat, gzcat, zmore。

      有份報告叫report,用compress壓過後叫report.Z,用gzip壓過後叫
            report.gz,要看這份報告可以用'zmore report'看。

二、尋找字串
    尋找檔案內是否有所要的字串

      grep "字串" 檔案
            cat 檔案 | grep 字串

    尋找字串的方法很多,比如說我想找所有以M開頭的行。此時必須引進pattern的觀
    念。以下是一些簡單的範例,以及說明:

        ^M          以M開頭的行,^表示開始的意思
        M$          以M結尾的行,$表示結束的意思
        ^[0-9]      以數字開始的行,[]內可列舉字母
        ^[124ab]    以1,2,4,a,或b開頭的行
        ^b.503      句點表示任一字母
        *           星號表示0個以上的字母(可以沒有)
        +           加號表示1個以上的字母
        \.          斜線可以去掉特殊意義

                ypcat passwd | grep ^b  列出大學部有申請帳號者名單
                    ypcat passwd | grep ^s  列出交換學生申請帳號者名單
                    ypcat passwd | grep '^b.503' 列出電機系各年級...
                    grep '^\.' myfile.txt   列出所有以句點開頭的行

三、nroff標準的UNIX簡易排版指令。
    所謂的排版就是在文章間加入一些控制指令,讓nroff 這個程式讀。nroff 就會依
    照我們想要的方式把文章印出。相關的指令有tbl 表格產生器,eqn 數式產生器,
    以及pic 繪圖語言。有蠻多英文的UNIX書籍就是用這套程式印出來的。另外有個程
    式叫作troff ,其接受的命令與nroff 幾乎一樣,但是它的輸出比較高級,可以作
    為照相排版用。以下為一些小例子,首先用編輯器編寫以下檔案,命名為clock。

        ┌───── clock  ──────┐
        │.ce                           │
        │clock                         │
        │.sp 2                         │
        │<自己寫一段文章,不用對齊>    │
        │<段與段間用空白行隔開>        │
        └───────────────┘

    然後用以下的命令可以得到輸出:

        % nroff clock | more    預視
        % nroff clock | lpr     輸出到印表機

    nroff 的排版指令很多,有興趣的請自己參考書籍,因為它只能處理英文而已。

四、TeX/LaTeX
    高級的排版程式,不是UNIX附的。主要用來做高品質的輸出,特別是數學符號的處
    理。國內倚天公司有PC版的 LaTeX,可以處理中文。(其實網路上也有免費的 TeX
    中文版,但是沒有人安裝,也不知道字形好不好看)

五、awk
    awk 可視為超強的grep。或者說awk 是一個簡易的資料庫處理工具。

     ypcat passwd | awk -F: '{print $1}' | more
            印出所有的使用者,passwd檔的第一欄。

     ypcat passwd | awk -F: '$1 ~ /^b.503/ {print $1}' | more
            印出電機系的使用者。

六、尋找檔案find

    find . -name hello -print          尋找目前目錄及所有的子目錄內叫hello的
                                       檔案。
    find . -ctime +7 -print            找出七天內未被更動的檔案
    find . -size +2000m -print         找出大小超過2000 bytes的檔案
    find /tmp -user b1234567 -print    在/tmp下屬於b1234567的檔案
    find . -name '*.c' -exec rm {} \;  刪除所有的.c檔