認識與學習 BASH
內容 認識 BASH 這個 Shell Shell 的變數功能 命令別名與歷史命令 Bash Shell 的操作環境 資料流重導向 管線命令 (pipe)
硬體、核心與 Shell 硬體 核心與使用者的相關性圖示
為何要學文字介面的 shell? 文字介面的 shell:大家都一樣! 遠端管理:文字介面就是比較快! Linux 的任督二脈:shell 是也!
系統的合法 shell 與 /etc/shells 功能 /bin/sh (已經被 /bin/bash 所取代) /bin/bash (就是 Linux 預設的 shell) /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,相容於 bash) /bin/tcsh (整合 C Shell ,提供更多的功能) /bin/csh (已經被 /bin/tcsh 所取代) /bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)
Bash shell 的功能 優點有: 命令編修能力 (history) 命令與檔案補全功能:([tab] 按鍵的好處) 命令別名設定功能:(alias) 工作控制、前景背景控制:(job control, foreground, background) 程式化腳本:(shell scripts) 萬用字元:(Wildcard)
Bash shell 的內建命令:type [root@www ~]# type [-tpa] name 選項與參數: :不加任何選項與參數時,type 會顯示出 name 是外部指令還是 bash 內建指令 -t :當加入 -t 參數時,type 會將 name 以底下這些字眼顯示出它的意義: file :表示為外部指令; alias :表示該指令為命令別名所設定的名稱; builtin :表示該指令為 bash 內建的指令功能; -p :如果後面接的 name 為外部指令時,才會顯示完整檔名; -a :會由 PATH 變數定義的路徑中,將所有含 name 的指令都列出來,包含 alias
指令的下達 範例:如果指令串太長的話,如何使用兩行來輸出? [vbird@www ~]# cp /var/spool/mail/root /etc/crontab \ > /etc/fstab /root
Shell 的變數功能 什麼是變數? 變數的可變性與方便性 影響 bash 環境操作的變數 腳本程式設計 (shell script) 的好幫手 程式、變數與不同使用者的關係
變數的取用與設定:echo, 變數設定規則, unset [root@www ~]# echo $variable [root@www ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@www ~]# echo ${PATH}
環境變數的功能 HOME 代表使用者的家目錄。還記得我們可以使用 cd ~ 去到自己的家目錄嗎?或者利用 cd 就可以直接回到使用者家目錄了。那就是取用這個變數啦~ 有很多程式都可能會取用到這個變數的值! SHELL 告知我們,目前這個環境使用的 SHELL 是哪支程式?Linux 預設使用 /bin/bash 的啦! HISTSIZE 這個與『歷史命令』有關,亦即是,我們曾經下達過的指令可以被系統記錄下來,而記錄的『筆數』則是由這個值來設定的。 MAIL 當我們使用 mail 這個指令在收信時,系統會去讀取的郵件信箱檔案 (mailbox)。
PATH 就是執行檔搜尋的路徑啦~目錄與目錄中間以冒號(:)分隔,由於檔案的搜尋是依序由 PATH 的變數內的目錄來查詢,所以,目錄的順序也是重要的喔。 LANG 這個重要!就是語系資料囉~很多訊息都會用到它,舉例來說,當我們在啟動某些 perl 的程式語言檔案時,它會主動的去分析語系資料檔案,如果發現有它無法解析的編碼語系,可能會產生錯誤喔!一般來說,我們中文編碼通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,這兩個編碼偏偏不容易被解譯出來,所以,有的時候,可能需要修訂一下語系資料。這部分我們會在下個小節做介紹的!
RANDOM 這個玩意兒就是『隨機亂數』的變數啦!目前大多數的 distributions 都會有亂數產生器,那就是 /dev/random 這個檔案。我們可以透過這個亂數檔案相關的變數 ($RANDOM) 來隨機取得亂數值喔。在 BASH 的環境下,這個 RANDOM 變數的內容,介於 0~32767 之間,所以,你只要 echo $RANDOM 時,系統就會主動的隨機取出一個介於 0~32767 的數值。萬一我想要使用 0~9 之間的數值呢?呵呵~利用 declare 宣告數值類型,然後這樣做就可以了:
用 set 觀察所有變數 (含環境變數與自訂變數) [root@www ~]# set BASH=/bin/bash <== bash 的主程式放置路徑 BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu") <== bash 的版本啊! BASH_VERSION='3.2.25(1)-release' <== 也是 bash 的版本啊! COLORS=/etc/DIR_COLORS.xterm <== 使用的顏色記錄檔案 COLUMNS=115 <== 在目前的終端機環境下,使用的欄位有幾個字元長度 HISTFILE=/root/.bash_history <== 歷史命令記錄的放置檔案,隱藏檔 HISTFILESIZE=1000 <== 存起來(與上個變數有關)的檔案之指令的最大記錄筆數。 HISTSIZE=1000 <== 目前環境下,可記錄的歷史命令最大筆數。 HOSTTYPE=i686 <== 主機安裝的軟體主要類型。我們用的是 i686 相容機器軟體 IFS=$' \t\n' <== 預設的分隔符號 LINES=35 <== 目前的終端機下的最大行數 MACHTYPE=i686-redhat-linux-gnu <== 安裝的機器類型 MAILCHECK=60 <== 與郵件有關。每 60 秒去掃瞄一次信箱有無新信! OLDPWD=/home <== 上個工作目錄。我們可以用 cd - 來取用這個變數。 OSTYPE=linux-gnu <== 作業系統的類型! PPID=20025 <== 父程序的 PID (會在後續章節才介紹) PS1='[\u@\h \W]\$ ' <== PS1 就厲害了。這個是命令提示字元,也就是我們常見的 [root@www ~]# 或 [dmtsai ~]$ 的設定值啦!可以更動的! PS2='> ' <== 如果你使用跳脫符號 (\) 第二行以後的提示字元也 name=VBird <== 剛剛設定的自訂變數也可以被列出來喔! $ <== 目前這個 shell 所使用的 PID ? <== 剛剛執行完指令的回傳值。
PS1:(提示字元的設定) \d :可顯示出『星期 月 日』的日期格式,如:"Mon Feb 2" \H :完整的主機名稱。舉例來說,鳥哥的練習機為『www.vbird.tsai』 \h :僅取主機名稱在第一個小數點之前的名字,如鳥哥主機則為『www』後面省略 \t :顯示時間,為 24 小時格式的『HH:MM:SS』 \T :顯示時間,為 12 小時格式的『HH:MM:SS』 \A :顯示時間,為 24 小時格式的『HH:MM』 \@ :顯示時間,為 12 小時格式的『am/pm』樣式 \u :目前使用者的帳號名稱,如『root』; \v :BASH 的版本資訊,如鳥哥的測試主機板本為 3.2.25(1),僅取『3.2』顯示 \w :完整的工作目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代; \W :利用 basename 函數取得工作目錄名稱,所以僅會列出最後一個目錄名。 \# :下達的第幾個指令。 \$ :提示字元,如果是 root 時,提示字元為 # ,否則就是 $ 囉~
export:自訂變數轉成環境變數 程序相關性示意圖
影響顯示結果的語系變數 (locale) [root@www ~]# locale -a ....(前面省略).... zh_TW zh_TW.big5 <==大五碼的中文編碼 zh_TW.euctw zh_TW.utf8 <==萬國碼的中文編碼 zu_ZA zu_ZA.iso88591 zu_ZA.utf8 [root@www ~]# locale <==後面不加任何選項與參數即可! LANG=en_US <==主語言的環境 LC_CTYPE="en_US" <==字元(文字)辨識的編碼 LC_NUMERIC="en_US" <==數字系統的顯示訊息 LC_TIME="en_US" <==時間系統的顯示資料 LC_COLLATE="en_US" <==字串的比較與排序等 LC_MONETARY="en_US" <==幣值格式的顯示等 LC_MESSAGES="en_US" <==訊息顯示的內容,如功能表、錯誤訊息等 LC_ALL= <==整體語系的環境 ....(後面省略)....
變數的有效範圍 當啟動一個 shell,作業系統會分配一記憶區塊給 shell 使用,此記憶體內之變數可讓子程序取用 若在父程序利用 export 功能,可以讓自訂變數的內容寫到上述的記憶區塊當中(環境變數); 當載入另一個 shell 時 (亦即啟動子程序,而離開原本的父程序了),子 shell 可以將父 shell 的環境變數所在的記憶區塊導入自己的環境變數區塊當中。
變數鍵盤讀取、陣列與宣告:read, array, declare [root@www ~]# read [-pt] variable 選項與參數: -p :後面可以接提示字元! -t :後面可以接等待的『秒數!』這個比較有趣~不會一直等待使用者啦! 範例一:讓使用者由鍵盤輸入一內容,將該內容變成名為 atest 的變數 [root@www ~]# read atest This is a test <==此時游標會等待你輸入!請輸入左側文字看看 [root@www ~]# echo $atest This is a test <==你剛剛輸入的資料已經變成一個變數內容! 範例二:提示使用者 30 秒內輸入自己的大名,將該輸入字串作為名為 named 的變數內容 [root@www ~]# read -p "Please keyin your name: " -t 30 named Please keyin your name: VBird Tsai <==注意看,會有提示字元喔! [root@www ~]# echo $named VBird Tsai <==輸入的資料又變成一個變數的內容了!
declare / typeset [root@www ~]# declare [-aixr] variable 選項與參數: -a :將後面名為 variable 的變數定義成為陣列 (array) 類型 -i :將後面名為 variable 的變數定義成為整數數字 (integer) 類型 -x :用法與 export 一樣,就是將後面的 variable 變成環境變數; -r :將變數設定成為 readonly 類型,該變數不可被更改內容,也不能 unset 範例一:讓變數 sum 進行 100+300+50 的加總結果 [root@www ~]# sum=100+300+50 [root@www ~]# echo $sum 100+300+50 <==咦!怎麼沒有幫我計算加總?因為這是文字型態的變數屬性啊! [root@www ~]# declare -i sum=100+300+50 450 <==瞭乎??
陣列 (array) 變數類型 範例:設定上面提到的 var[1] ~ var[3] 的變數。 [root@www ~]# var[1]="small min" [root@www ~]# var[2]="big min" [root@www ~]# var[3]="nice min" [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}" small min, big min, nice min
與檔案系統及程序的限制關係:ulimit [root@www ~]# ulimit [-SHacdfltu] [配額] 選項與參數: -H :hard limit ,嚴格的設定,必定不能超過這個設定的數值; -S :soft limit ,警告的設定,可以超過這個設定值,但是若超過則有警告訊息。 在設定上,通常 soft 會比 hard 小,舉例來說,soft 可設定為 80 而 hard 設定為 100,那麼你可以使用到 90 (因為沒有超過 100),但介於 80~100 之間時, 系統會有警告訊息通知你! -a :後面不接任何選項與參數,可列出所有的限制額度; -c :當某些程式發生錯誤時,系統可能會將該程式在記憶體中的資訊寫成檔案(除錯用), 這種檔案就被稱為核心檔案(core file)。此為限制每個核心檔案的最大容量。 -f :此 shell 可以建立的最大檔案容量(一般可能設定為 2GB)單位為 Kbytes -d :程序可使用的最大斷裂記憶體(segment)容量; -l :可用於鎖定 (lock) 的記憶體量 -t :可使用的最大 CPU 時間 (單位為秒) -u :單一使用者可以使用的最大程序(process)數量。
變數內容的刪除、取代與替換 變數內容的刪除與取代 變數設定方式 說明 ${變數#關鍵字} 若變數內容從頭開始的資料符合『關鍵字』,則將符合的最短資料刪除 ${變數##關鍵字} 若變數內容從頭開始的資料符合『關鍵字』,則將符合的最長資料刪除 ${變數%關鍵字} 若變數內容從尾向前的資料符合『關鍵字』,則將符合的最短資料刪除 ${變數%%關鍵字} 若變數內容從尾向前的資料符合『關鍵字』,則將符合的最長資料刪除 ${變數/舊字串/新字串} 若變數內容符合『舊字串』則『第一個舊字串會被新字串取代』 ${變數//舊字串/新字串} 若變數內容符合『舊字串』則『全部的舊字串會被新字串取代』
變數的測試與內容替換 變數設定方式 str 沒有設定 str 為空字串 str 已設定非為空字串 var=${str-expr} var=expr var= var=$str var=${str:-expr} var=${str+expr} var=${str:+expr} var=${str=expr} str=expr var=expr str 不變 var= str 不變 var=$str var=${str:=expr} var=${str?expr} expr 輸出至 stderr var=str var=${str:?expr}
命令別名與歷史命令 命令別名設定:alias, unalias [root@www ~]# alias alias cp='cp -i' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias lm='ls -l | more' alias ls='ls --color=tty' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --show-dot --show-tilde'
歷史命令:history [root@www ~]# history [n] [root@www ~]# history [-c] [root@www ~]# history [-raw] histfiles 選項與參數: n :數字,意思是『要列出最近的 n 筆命令列表』的意思! -c :將目前的 shell 中的所有 history 內容全部消除 -a :將目前新增的 history 指令新增入 histfiles 中,若沒有加 histfiles , 則預設寫入 ~/.bash_history -r :將 histfiles 的內容讀到目前這個 shell 的 history 記憶中; -w :將目前的 history 記憶內容寫入 histfiles 中!
Bash Shell 的操作環境 路徑與指令搜尋順序 1.以相對/絕對路徑執行指令,例如『/bin/ls 』或『./ls 』; 2.由 alias 找到該指令來執行; 3.由 bash 內建的 (builtin) 指令來執行; 4.透過 $PATH 這個變數的順序搜尋到的第一個指令來執行。
bash 的進站與歡迎訊息:/etc/issue, /etc/motd \l 顯示第幾個終端機介面; \m 顯示硬體的等級 (i386/i486/i586/i686...); \n 顯示主機的網路名稱; \o 顯示 domain name; \r 作業系統的版本 (相當於 uname -r) \t 顯示本地端時間的時間; \s 作業系統的名稱; \v 作業系統的版本。
bash 的環境設定檔 login 與 non-login shell login shell:取得 bash 時需要完整的登入流程的,就稱為 login shell。舉例來說,你要由 tty1 ~ tty6 登入,需要輸入使用者的帳號與密碼,此時取得的 bash 就稱為『login shell 』囉; non-login shell:取得 bash 介面的方法不需要重複登入的舉動,舉例來說,(1)你以 X window 登入 Linux 後,再以 X 的圖形化介面啟動終端機,此時那個終端介面並沒有需要再次的輸入帳號與密碼,那個 bash 的環境就稱為 non-login shell了。(2)你在原本的 bash 環境下再次下達 bash 這個指令,同樣的也沒有輸入帳號密碼,那第二個 bash (子程序) 也是 non-login shell 。
/etc/inputrc /etc/profile.d/*.sh 其實這個檔案並沒有被執行啦!/etc/profile 會主動的判斷使用者有沒有自訂輸入的按鍵功能,如果沒有的話,/etc/profile 就會決定設定『INPUTRC=/etc/inputrc』這個變數!此一檔案內容為 bash 的熱鍵啦、[tab]要不要有聲音啦等等的資料!因為鳥哥覺得 bash 預設的環境已經很棒了,所以不建議修改這個檔案! /etc/profile.d/*.sh 其實這是個目錄內的眾多檔案!只要在 /etc/profile.d/ 這個目錄內且副檔名為 .sh ,另外,使用者能夠具有 r 的權限,那麼該檔案就會被 /etc/profile 呼叫進來。在 CentOS 5.x 中,這個目錄底下的檔案規範了 bash 操作介面的顏色、 語系、ll 與 ls 指令的命令別名、vi 的命令別名、which 的命令別名等等。如果你需要幫所有使用者設定一些共用的命令別名時,可以在這個目錄底下自行建立副檔名為 .sh 的檔案,並將所需要的資料寫入即可喔!
/etc/sysconfig/i18n 這個檔案是由 /etc/profile.d/lang.sh 呼叫進來的!這也是我們決定 bash 預設使用何種語系的重要設定檔!檔案裡最重要的就是 LANG 這個變數的設定啦!我們在前面的 locale 討論過這個檔案囉!自行回去瞧瞧先! 反正你只要記得,bash 的 login shell 情況下所讀取的整體環境設定檔其實只有 /etc/profile,但是 /etc/profile 還會呼叫出其他的設定檔,所以讓我們的 bash 操作介面變的非常的友善啦!接下來,讓我們來瞧瞧,那麼個人偏好的設定檔又是怎麼回事?
~/.bash_profile (login shell 才會讀) 2. ~/.bash_login 3. ~/.profile
~/.bashrc (non-login shell 會讀) source :讀入環境設定檔的指令 [root@www ~]# source 設定檔檔名 範例:將家目錄的 ~/.bashrc 的設定讀入目前的 bash 環境中 [root@www ~]# source ~/.bashrc <==底下這兩個指令是一樣的! [root@www ~]# . ~/.bashrc ~/.bashrc (non-login shell 會讀) 依據不同的 UID 規範出 umask 的值; 依據不同的 UID 規範出提示字元 (就是 PS1 變數); 呼叫 /etc/profile.d/*.sh 的設定
其他相關設定檔 /etc/man.config ~/.bash_history 事實上,這個檔案內最重要的其實是 MANPATH 這個變數設定啦!我們搜尋 man page 時,會依據 MANPATH 的路徑去分別搜尋啊!另外,要注意的是,這個檔案在各大不同版本 Linux distributions 中,檔名都不太相同,例如 CentOS 用的是 /etc/man.config ,而 SuSE 用的則是 /etc/manpath.config ,可以利用 [tab] 按鍵來進行檔名的補齊啦! ~/.bash_history 還記得我們在歷史命令提到過這個檔案吧?預設的情況下,我們的歷史命令就記錄在這裡啊!而這個檔案能夠記錄幾筆資料,則與 HISTSIZE 這個變數有關啊。每次登入 bash 後,bash 會先讀取這個檔案,將所有的歷史指令讀入記憶體,因此,當我們登入 bash 後就可以查知上次使用過哪些指令囉。至於更多的歷史指令,請自行回去參考喔!
~/.bash_logout 這個檔案則記錄了『當我登出 bash 後,系統再幫我做完什麼動作後才離開』的意思。你可以去讀取一下這個檔案的內容,預設的情況下,登出時,bash 只是幫我們清掉螢幕的訊息而已。不過,你也可以將一些備份或者是其他你認為重要的工作寫在這個檔案中 (例如清空暫存檔),那麼當你離開 Linux 的時候,就可以解決一些煩人的事情囉!
終端機的環境設定:stty, set eof : End of file 的意思,代表『結束輸入』。 erase : 向後刪除字元, intr : 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序; kill : 刪除在目前指令列上的所有文字; quit : 送出一個 quit 的訊號給目前正在 run 的程序; start : 在某個程序停止後,重新啟動它的 output stop : 停止目前螢幕的輸出; susp : 送出一個 terminal stop 的訊號給正在 run 的程序。
組合按鍵 執行結果 Ctrl + C 終止目前的命令 Ctrl + D 輸入結束 (EOF),例如郵件結束的時候; Ctrl + M 就是 Enter 啦! Ctrl + S 暫停螢幕的輸出 Ctrl + Q 恢復螢幕的輸出 Ctrl + U 在提示字元下,將整列命令刪除 Ctrl + Z 『暫停』目前的命令
萬用字元與特殊符號 符號 意義 * 代表『0 個到無窮多個』任意字元 ? 代表『一定有一個』任意字元 [ ] 同樣代表『一定有一個在括號內』的字元(非任意字元)。例如 [abcd] 代表 『一定有一個字元,可能是 a, b, c, d 這四個任何一個』 [ - ] 若有減號在中括號內時,代表『在編碼順序內的所有字元』。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的! [^ ] 若中括號內的第一個字元為指數符號 (^) ,那表示『反向選擇』,例如 [^abc] 代表 一定有一個字元,只要是非 a, b, c 的其他字元就接受的意思。
符號 內容 # 註解符號:這個最常被使用在 script 當中,視為說明!在後的資料均不執行 \ 跳脫符號:將『特殊字元或萬用字元』還原成一般字元 | 管線 (pipe):分隔兩個管線命令的界定(後兩節介紹); ; 連續指令下達分隔符號:連續性命令的界定 (注意!與管線命令並不相同) ~ 使用者的家目錄 $ 取用變數前置字元:亦即是變數之前需要加的變數取代值 & 工作控制 (job control):將指令變成背景下工作 ! 邏輯運算意義上的『非』 not 的意思! / 目錄符號:路徑分隔的符號 >, >> 資料流重導向:輸出導向,分別是『取代』與『累加』 <, << 資料流重導向:輸入導向 (這兩個留待下節介紹) ' ' 單引號,不具有變數置換的功能 " " 具有變數置換的功能! ` ` 兩個『` 』中間為可以先執行的指令,亦可使用 $( ) ( ) 在中間為子 shell 的起始與結束 { } 在中間為命令區塊的組合!
資料流重導向 什麼是資料流重導向 指令執行過程的資料傳輸情況
命令執行的判斷依據:; , &&, || cmd ; cmd (不考慮指令相關性的連續指令下達) $? (指令回傳值) 與 && 或 || 指令下達情況 說明 cmd1 && cmd2 1. 若 cmd1 執行完畢且正確執行($?=0),則開始執行 cmd2。 2. 若 cmd1 執行完畢且為錯誤 ($?≠0),則 cmd2 不執行。 cmd1 || cmd2 1. 若 cmd1 執行完畢且正確執行($?=0),則 cmd2 不執行。 2. 若 cmd1 執行完畢且為錯誤 ($?≠0),則開始執行 cmd2。
指令依序執行的關係示意圖
管線命令 (pipe) [root@www ~]# ls -al /etc | less 管線命令的處理示意圖
擷取命令:cut, grep cut [root@www ~]# cut -d'分隔字元' -f fields <==用於有特定分隔字元 [root@www ~]# cut -c 字元區間 <==用於排列整齊的訊息 選項與參數: -d :後面接分隔字元。與 -f 一起使用; -f :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出第幾段的意思; -c :以字元 (characters) 的單位取出固定字元區間;
grep [root@www ~]# grep [-acinv] [--color=auto] '搜尋字串' filename 選項與參數: -a :將 binary 檔案以 text 檔案的方式搜尋資料 -c :計算找到 '搜尋字串' 的次數 -i :忽略大小寫的不同,所以大小寫視為相同 -n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行! --color=auto :可以將找到的關鍵字部分加上顏色的顯示喔!
排序命令:sort, wc, uniq sort [root@www ~]# sort [-fbMnrtuk] [file or stdin] 選項與參數: -f :忽略大小寫的差異,例如 A 與 a 視為編碼相同; -b :忽略最前面的空白字元部分; -M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n :使用『純數字』進行排序(預設是以文字型態來排序的); -r :反向排序; -u :就是 uniq ,相同的資料中,僅出現一行代表; -t :分隔符號,預設是用 [tab] 鍵來分隔; -k :以那個區間 (field) 來進行排序的意思
uniq [root@www ~]# uniq [-ic] 選項與參數: -i :忽略大小寫字元的不同; -c :進行計數 範例一:使用 last 將帳號列出,僅取出帳號欄,進行排序後僅取出一位; [root@www ~]# last | cut -d ' ' -f1 | sort | uniq 範例二:承上題,如果我還想要知道每個人的登入總次數呢? [root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c 1 12 reboot 41 root 1 wtmp # 從上面的結果可以發現 reboot 有 12 次,root 登入則有 41 次! # wtmp 與第一行的空白都是 last 的預設字元,那兩個可以忽略的!
wc [root@www ~]# wc [-lwm] 選項與參數: -l :僅列出行; -w :僅列出多少字(英文單字); 範例一:那個 /etc/man.config 裡面到底有多少相關字、行、字元數? [root@www ~]# cat /etc/man.config | wc 141 722 4617 # 輸出的三個數字中,分別代表:『行、字數、字元數』 範例二:我知道使用 last 可以輸出登入者,但是 last 最後兩行並非帳號內容, 那麼請問,我該如何以一行指令串取得這個月份登入系統的總人次? [root@www ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l # 由於 last 會輸出空白行與 wtmp 字樣在最底下兩行,因此,我利用 # grep 取出非空白行,以及去除 wtmp 那一行,在計算行數,就能夠瞭解囉!
雙向重導向:tee [root@www ~]# tee [-a] file 選項與參數: -a :以累加 (append) 的方式,將資料加入 file 當中! [root@www ~]# last | tee last.list | cut -d " " -f1 # 這個範例可以讓我們將 last 的輸出存一份到 last.list 檔案中; [root@www ~]# ls -l /home | tee ~/homefile | more # 這個範例則是將 ls 的資料存一份到 ~/homefile ,同時螢幕也有輸出訊息! [root@www ~]# ls -l / | tee -a ~/homefile | more # 要注意!tee 後接的檔案會被覆蓋,若加上 -a 這個選項則能將訊息累加。
字元轉換命令:tr, col, join, paste, expand [root@www ~]# tr [-ds] SET1 ... 選項與參數: -d :刪除訊息當中的 SET1 這個字串; -s :取代掉重複的字元! col [root@www ~]# col [-xb] 選項與參數: -x :將 tab 鍵轉換成對等的空白鍵 -b :在文字內有反斜線 (/) 時,僅保留反斜線最後接的那個字元
join paste [root@www ~]# join [-ti12] file1 file2 選項與參數: -t :join 預設以空白字元分隔資料,並且比對『第一個欄位』的資料, 如果兩個檔案相同,則將兩筆資料聯成一行,且第一個欄位放在第一個! -i :忽略大小寫的差異; -1 :這個是數字的 1 ,代表『第一個檔案要用那個欄位來分析』的意思; -2 :代表『第二個檔案要用那個欄位來分析』的意思。 paste [root@www ~]# paste [-d] file1 file2 選項與參數: -d :後面可以接分隔字元。預設是以 [tab] 來分隔的! - :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。
expand [root@www ~]# expand [-t] file 選項與參數: -t :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空白鍵取代。 我們也可以自行定義一個 [tab] 按鍵代表多少個字元呢!
分割命令:split [root@www ~]# split [-bl] file PREFIX 選項與參數: -b :後面可接欲分割成的檔案大小,可加單位,例如 b, k, m 等; -l :以行數來進行分割。 PREFIX :代表前置字元的意思,可作為分割檔案的前導文字。
參數代換:xargs [root@www ~]# xargs [-0epn] command 選項與參數: -0 :如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元時,這個 -0 參數 可以將它還原成一般字元。這個參數可以用於特殊狀態喔! -e :這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到 這個字串時,就會停止繼續工作! -p :在執行每個指令的 argument 時,都會詢問使用者的意思; -n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。看範例三。 當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔!
關於減號 - 的用途 [root@www ~]# tar -cvf - /home | tar -xvf -