54
VBird (2005/08/18) Linux基基--Bash Shell 1 Linux 基基基基 Chapter 11 Bash Shell VBird 2005/08/18

Linux 基礎學習

  • Upload
    warner

  • View
    71

  • Download
    0

Embed Size (px)

DESCRIPTION

Linux 基礎學習. Chapter 11 Bash Shell VBird 2005/08/18. 內容. Shell 的角色 Bash 指令下達與特色 Bash 的變數功能 命令別名與歷史指令 Shell 使用的環境 資料流重導向 管線命令. Shell 的角色. Shell 的角色(續). Shell 用來溝通 user 與 kernel ! 目前常見的 shell Bourne shell (/bin/sh) Bourne again shell (/bin/bash, Linux 預設 ) - PowerPoint PPT Presentation

Citation preview

Page 1: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 1

Linux 基礎學習

Chapter 11

Bash ShellVBird 2005/08/18

Page 2: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 2

內容 Shell 的角色 Bash 指令下達與特色 Bash 的變數功能 命令別名與歷史指令 Shell 使用的環境 資料流重導向 管線命令

Page 3: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 3

Shell 的角色

Page 4: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 4

Shell 的角色(續) Shell 用來溝通 user 與 kernel ! 目前常見的 shell

Bourne shell (/bin/sh) Bourne again shell (/bin/bash, Linux 預設 ) Korn-shell (/bin/ksh) C-Shell (/bin/csh) 圖形介面也是一種 shell

可以在不同的 shell 之間變換! 系統可用的 shell 均記錄在 /etc/shells 內

若有系統帳號不想讓他登入,可使用特殊 shell 。

Page 5: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 5

Shell 的角色(續) 何時才進入 Shell ?

BIOS MBR (loader & kernel) init & scripts /bin/login 輸入帳號密碼後,依據 /etc/passwd 的設定給予 shell

用 finger (user account) 查詢使用者的 shell 用 chsh 修改 /etc/passwd 內的使用者 shell 設定

Page 6: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 6

Bash 指令下達與特色 Command [option] [parameters]

範例: ls –l /home 每一行的最前面為『指令』,後續才接 option 與 parameter 指令與 option 及 parameter 之間需要用一個或多個空白鍵隔

開 Paramter 不會是指令,通常是檔名或者其他等等 大小寫是不一樣的 按下 Enter 按鍵後,該指令會立刻執行! 可使用跳脫符號 (\) 將指令寫在第二行 跳脫符號的用途,還可用來跳脫特殊字元的特殊意義! 可使用 ; 來連接兩個指令的下達 輸出的內容可使用 > 來傳導到檔案或裝置當中!

Page 7: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 7

Bash 指令下達與特色(續) 檔名與指令補齊 (Filename completion) 變數功能 (Variable) 命令別名 (Command aliases) 指令歷史紀錄 (Command history) 命令稿執行 (Shell programming) 工作控制 (Job control) 萬用字元 (wildcard chars)

Page 8: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 8

Bash 指令下達與特色(續) Bash 的內建指令:

type [-tpa] name 參數:

不加任何參數時,則 type 會顯示出那個 name 是外部指令還是 bash 內建的指令!

-t :當加入 -t 參數時, type 會將 name 以顯示這些字眼 file :表示為外部指令; alias :表示該指令為命令別名所設定的名稱; builtin :表示該指令為 bash 內建的指令功能;

-p :如果後面接的 name 為指令時,會顯示完整檔名 ( 外部指令 ) 或顯示為內建指令;

-a :會將由 PATH 變數定義的路徑中,將所有含有 name 的指令都列出來,包含 alias

Page 9: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 9

Bash 指令下達與特色(續) Bash 的內建指令:(續)

例題: 系統上的 ls 指令的所有路徑;

type -a ls cd 這個指令是內建的?還是外部的?

type cd / type -t cd 如何利用 type 查詢指令的路徑 ( 類似 which )

type -P ls

Page 10: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 10

Bash 的變數功能 變數的意義:

利用變數的定義,可以設定您的工作環境,例如語系檔、系統時間、指令執行路徑等等,方便使用!

以一個變數名稱,帶入『變數內容』來操作變數。 變數的讀取:

echo $variable echo ${variable}

簡易變數的設定、讀取與取消: name=VBird echo $name unset name echo $name ( 未設定的變數,預設為『空的字串』 )

Page 11: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 11

Bash 的變數功能(續) 變數的設定方式

變數與變數內容以等號『 = 』來連結; 等號兩邊不能直接接空白字元; 變數名稱只能是英文字母與數字,但是數字不能是開頭字元; 若有空白字元可以使用雙引號『 “ 』或單引號『 ‘ 』來將變數內容

結合起來 必要時需要以跳脫字元『 \ 』來將特殊符號 ( 如 Enter, $, \, 空白

字元 , ' 等 ) 變成一般符號; 在一串指令中,還需要藉由其他的指令提供的資訊,可以使用 quote

『 ` command` 』; 若該變數為擴增變數內容時,則需以雙引號及 $ 變數名稱 如:『 "$

PATH":/home 』繼續累加內容; 若該變數需要在其他子程序執行,則需要以 export 來使變數變成環

境變數, 如『 export PATH 』; 通常大寫字元為系統預設變數,自行設定變數可以使用小寫字元,

方便判斷 ( 純粹依照使用者興趣與嗜好 ) ; 取消變數的方法為:『 unset 變數名稱』。

Page 12: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 12

Bash 的變數功能(續) 設定變數:

是否可以設定 12name 這個變數? 不行 設定 name 內容為你的大名: name=VBird 如何設定 name 為 『 VBird‘s Tsai 』 這個字串?

name=VBird\’s\ Tsai name=“VBird’s Tsai”

在 PATH 內多加一個 /home/dmtsai/bin 的目錄: PATH=“$PATH”:/home/dmtsai/bin

在 name 的內容中,多加 dm 兩個字母 name=${name}dm / name=“$name”dm

uname -r 可以秀出目前的核心版本,系統核心版本的路徑在 /lib/modules 底下,請問如何一串指令寫出目前核心檔案放置的路徑?

cd /lib/modules/`uname -r`

Page 13: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 13

Bash 的變數功能(續) 設定變數:

剛剛設定好了 name 這個變數,我想要使用 myname 這個變數來將 name 這個內容引用成: myname is $name ,該如何設定?

myname=“myname is $name” myname=‘myname is $name’ myname=`myname is $name`

查詢系統內 crontab 檔案,並輸出這些檔案的屬性! ls -l `locate crontab`

Page 14: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 14

Bash 的變數功能(續) 環境變數:

用來定義系統環境的變數,例如 PATH, HOME 等; 可以被子程序利用的變數亦被稱為『環境變數』 查閱環境變數可用 env 指令查閱; 常見的環境變數:

HOME (代表 ~ ) HISTSIZE PATH (更多說明在下一頁 ) MAIL ( 使用者 mail box) LANG RANDOM ( 與 /dev/random 有關 , 介於 1~32767 之間 )

Page 15: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 15

Bash 的變數功能(續) PATH 環境變數的意義

目錄與目錄用 : 分隔 不能有空白字元 搜尋的順序很重要 最好不要有 . 存在 PATH 當中 相對路徑與絕對路徑的差異?

絕對路徑一定由 / 開始寫起 ex> /root/bin 有的時候絕對路徑要比較可靠的多!

指令的搜尋 (which) 也與 path 有關! 請找出 ls 在哪裡?

Page 16: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 16

Bash 的變數功能(續) 環境變數:(續)

更多的變數可使用 set 來查閱出所有的已設定變數; COLOR HISTFILE PWD / OLDPWD PS1

更多功能變數,請參考下頁 $ (本 bash 程序的 PID) ? ( 上個指令執行後的回傳值 ) PPID (本 bash 的上層 PID)

Page 17: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 17

Bash 的變數功能(續) PS1 內的變數意義:

\d :代表日期,格式為 Weekday Month Date ,例如 "Mon Aug 1" \H :完整的主機名稱。 \h :僅取主機名稱的第一個名字。 \t :顯示時間,為 24 小時格式,如: HH:MM:SS \T :顯示時間, 12 小時的時間格式! \A :顯示時間, 24 小時格式, HH:MM \u :目前使用者的帳號名稱; \v : BASH 的版本資訊; \w :完整的工作目錄名稱。家目錄會以 ~ 取代; \W :利用 basename 取得工作目錄名稱,列出最後一個目錄名。 \# :下達的第幾個指令。 \$ :提示字元,如果是 root 時,提示字元為 # ,否則就是 $ 囉~ 練習:

若要顯示如下: [root@linux /home/dmtsai 16:50 #12]# 則 PS1 為? PS1='[\u@\h \w \A #\#]\$ '

Page 18: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 18

Bash 的變數功能(續) 環境變數與自訂變數的差異

自訂變數 (local variable) 所有變數均僅存在於目前所在的 shell 行程當中,當離開此 shell

時,該變數將無法存取。 環境變數 (export variable)

作業系統分配一記憶區塊給 shell ,此區域之變數可讓子程序存取 利用 export var 可將 var 這個變數寫到該記憶區塊中 當載入另一個 shell 時 (離開原本的 shell ) ,子 shell 可將父 sh

ell 的環境變數所在的記憶區塊導入自己的環境變數區塊中 最常用在程式之間的互相呼叫! 查閱可用 env, export 等

Page 19: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 19

Bash 的變數功能(續) 語系方面的變數

i18N 的變數項目如下 (locale) LANG : 主語言環境 LC_CTYPE : 字元辨識 LC_NUMERIC : 數字系統的顯示 LC_TIME : 時間系統的顯示 LC_COLLATE : 字串比較、排序 LC_MONETARY : 幣值格式的顯示 LC_MESSAGES : 訊息顯示,如功能表、錯誤訊息 LC_ALL : 語言環境整體設定

Page 20: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 20

Bash 的變數功能(續) 語系方面的變數

若 LC_XX 沒有設定,預設以 LANG 或 LC_ALL 的設定來取代

列出所有可用語言: locale -a

locale 放置的目錄: /usr/lib/locale

可修訂的系統設定檔: /etc/sysconfig/i18n LANG="en_US.UTF-8" SUPPORTED="zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16“

不修改語系下變換此次指令顯示語系的方法: LANG=C ls -al /root

Page 21: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 21

Bash 的變數功能(續) 變數的鍵盤輸入: read [-pt] variable

參數: -p :後面可以接提示字元! -t :後面可以接等待的『秒數!』範例: 建立一變數名稱為 atest ,讓使用者自行輸入;

read atest 同上,但顯示: input your name 字樣,且定義在三十秒內完成

read -t 30 -p “Input your name: “ atest

宣告變數類型: declare a=3; b=5; c=$a+$b 結果為? 若用 declare -i 宣告,結果為? 數值計算亦可用 $((計算內容 )) 來取代!

Page 22: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 22

Bash 的變數功能(續) 使用者在系統的資源限制: ulimit [-SHacdflmnpstuv] [配額 ]

-H : hard limit ,嚴格的設定,必定不能超過設定的值; -S : soft limit ,警告的設定,可以超過這個設定值, -a :列出所有的限制額度; -c :可建立的最大核心檔案容量 (core files) -d :程序資料可使用的最大容量 -f :此 shell 可以建立的最大檔案容量 ,單位為 Kbytes -l :可用於鎖定 (lock) 的記憶體量 -p :可用以管線處理 (pipe) 的數量 -t :可使用的最大 CPU 時間 ( 單位為秒 ) -u :單一使用者可以使用的最大程序 (process) 數量。 列出所有限制的值: ulimit -a 限制可使用檔案為 200M : ulimit -f 200000

( 一般使用者僅能減小,不能加大! )

Page 23: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 23

命令別名與歷史指令 命令別名:

語法: alias aliasname=‘command’ alias, unalias 練習:

讓 lm 等於下達 ls -al | more ; lm=‘ls -al | more’ 與 alias lm=‘ls -al | more’ 有何不同? 目前系統有多少命令別名? 如何取消 ls 的命令別名? 設定 cls 也可以清除螢幕; 設定 dir 也可以顯示檔案;

Page 24: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 24

命令別名與歷史指令(續) 歷史指令:

察看歷史指令: history [n] 僅列出 n 比紀錄 history [-c] 消除在記憶體當中的紀錄 history [-raw] [filename]

r :將在 filename 當中的記錄讀到記憶體內; a :將記憶體的紀錄,增加入 filename 內 w :將記憶體的資料寫入 filename 內。

記錄的歷史指令筆數變數: HISTSIZE 歷史指令設定多寡的益處 /缺點?

記錄檔: ~/.bash_history ( 登入時會先讀入 ) ; 何時寫入記錄檔中? ( 預設登出才寫入 )

Page 25: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 25

命令別名與歷史指令(續) 歷史指令:(續)

歷史指令記錄的應用: !number 執行第 number 個指令; !! 執行剛剛下達過的指令 ( 上一個 ) ; !vi 執行『最近』執行的 vi 為開頭的指

Page 26: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 26

Shell 使用的環境設定 系統登入 tty 時,會使用到的提示字元檔:

/etc/issue \d 本地端時間的日期; \l 顯示第幾個終端機介面; \m 顯示硬體的等級 (i386/i486/i586/i686...) ; \n 顯示主機的網路名稱; \o 顯示 domain name ; \r 作業系統的版本 (相當於 uname -r) \t 顯示本地端時間的時間; \s 作業系統的名稱; \v 作業系統的版本。

/etc/issue.net /etc/motd 練習:讓提示字元顯示登入處為第幾個 tty ?且登入後顯示

一些歡迎訊息!

Page 27: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 27

Shell 使用的環境設定(續) Bash Shell 登入時,讀取的環境設定檔案:

/etc/profile /etc/profile.d/*.sh

~/.bash_profile, ~/.bash_login, ~/.profile (login shell) ~/.bashrc (non-login shell) /etc/bashrc

系統設定檔: /etc/profile :

規範: PATH 、 USER 、 MAIL 、 HOSTNAME 、 HISTSIZE 等變數,同時設定引用 /etc/profile.d/*.sh 及 /etc/inputrc 鍵盤

/etc/bashrc umask 與 PS1 等資料。

/etc/sysconfig/i18n : 引用語系資料檔

Page 28: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 28

Shell 使用的環境設定(續) 建議設定檔放置於個人設定檔內:

~/.bash_login 主要放置登入時會使用到的各項變數,如 PATH, HISTSIZE,

LANG 其他 alias 等等; ~/.bashrc

最後被讀取到的檔案,所以,可以考慮將所有的資料都寫入這裡。

不過若有 echo 的訊息時,則『每執行 shell script 時,都會重新讀取 ~/.bashrc ,所以,會重複顯示訊息,而非登入時顯示而已。

~/.bash_logout 登出後,還要系統幫忙進行的工作!

Page 29: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 29

Shell 使用的環境設定(續) 設定檔內容的正式使用:

登出後再登入,讓 bash shell 重新讀取一次設定檔; 使用 source 或者是 . 來讀取設定檔:

source ~/.bashrc . ~/.bashrc

若有多個文案內容中,各項變數均不相同,可以撰寫多個環境設定檔,分別 source 即可!

Page 30: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 30

Shell 使用的環境設定(續) Shell 的按鍵環境使用:

stty -a : eof : End of file 的意思,代表『結束輸入』。 erase : 向後刪除字元, intr : 送出一個 interrupt ( 中斷 ) 的訊號給目前正在 run 的程序 kill : 刪除在目前指令列上的所有文字; quit : 送出一個 quit 的訊號給目前正在 run 的程序; start : 在某個程序停止後,重新啟動他的 output stop : 停止目前螢幕的輸出; susp : 送出一個 terminal stop 的訊號給正在 run 的程序。

/etc/inputrc

Page 31: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 31

Shell 使用的環境設定(續) 一些字符的意義:

? 一定有一個 * 零個或多個 [a-z] 範圍區間,為 a-z 之間的所有字母『僅取一個』 [!a-z] 反向選擇 [a-zA-Z]同上!

練習: cd /usr/X11R6/bin (/usr/X11/bin) ls xc* ls xc[alo]* ls xc[!o]* ls xc*l*

Page 32: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 32

Shell 使用的環境設定(續) Bash 的子命令

$(command) `command`

ls /lib/modules/`uname –r`

Page 33: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 33

資料流重導向

Page 34: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 34

資料流重導向 以指令的角度來觀察:

處理的訊息,稱為 standard input, STDIN 處理後,輸出的訊息 standard output, STDOUT 有時候有錯誤訊息 standard error, STDERR

特殊字符與裝置: >, >> STDOUT 2>, 2>> STDERR <, << STDIN /dev/null device

Page 35: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 35

資料流重導向(續) 用 ls 將 /root 與 /temp 底下的檔案資訊輸出

1. 僅正確資料到: /tmp/rootfile

2. 正確到 /tmp/rootfile 錯誤到 /tmp/rootfile_no

3. 同時傳送到 /tmp/rootfile ls –l /root /temp > /tmp/rootfile ls –l /root /temp > /tmp/rootfile 2> /tmp/rootfile_no ls –l /root /temp > /tmp/rootfile 2>&1

Page 36: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 36

資料流重導向(續) 將 /etc/passwd, /etc/group 的資料全部都放置到 /tmp/account

檔案內?那個是對的? cat /etc/passwd > /tmp/account; cat /etc/group > /tmp/account cat /etc/passwd > /tmp/account; cat /etc/group >> /tmp/account

利用 cat 建立一個檔案,檔名為 /tmp/catfile ,內容為: I am VBird cat > /tmp/catfile ( 記得 [ctrl]+d 的用途! )

利用 cat 讀取 /etc/passwd cat < /etc/passwd

如例題二,如發現輸入內容含有 exit 則結束輸入! cat > /tmp/catfile <<exit

Page 37: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 37

資料流重導向(續) 資料流重導向的常見使用時機:

當螢幕輸出的資訊很重要,而且我們需要將他存下來的時候 背景執行中的程式,不希望他干擾螢幕正常的輸出結果時; 一些系統的例行命令(例如寫在 /etc/crontab 中的檔案)的

執行結果,希望他可以存下來時; 一些執行命令,我們已經知道他可能的錯誤訊息,所以想以

『 2> /dev/null 』將他丟掉時; 錯誤訊息與正確訊息需要分別輸出時。

Page 38: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 38

資料流重導向(續) 判斷有無錯誤發生的變數

echo $?

命令的執行判斷: Command1 ; command2 不考慮 command1 的執行結果 Command1 && command2command1 的結果必須要正確 Command1 || command2 command1 的結果必須為錯誤!

練習: 若 /tmp/testing 不存在,才用 touch 建立 若 /tmp/testing 存在,且為檔案,就刪除他! 以 ls 測試 /tmp/vbirding 是否存在,若存在則顯示 “ exist” ,若不存在,則顯示 “ not exist” ! (注意 && 與 || 的順序! )

Page 39: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 39

資料流重導向(續) 說明底下的意義:

foo1 && foo2 || foo3 > foo4 foo1, foo2, foo3, foo4 各為指令 / 檔案或裝置? 執行的流程為何?

若 foo1 執行結果為 stdout 接著執行 foo2 ,若 foo2 有 stderr ,才執行 foo3 > fo

o4 ,否則就結束該串指令; 若 foo1 執行結果為 stderr ,則略過 foo2 ,執行 foo3 > fo

o4 。

Page 40: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 40

管線命令 利用 | 處理前一個指令輸出的『訊息』 僅處理『 standard out 』!

ls /home /root /usr | less

Page 41: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 41

管線命令(續) 取出一行文字當中的某一個內容: cut

cut -d'分隔字元 ' -f fileds cut -c 字元區間 參數:

-d :後面接分隔字元。與 -f 一起使用; -f :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出 -c :以字元 (characters) 的單位取出固定字元區間;

範例: 將 PATH 變數取出,我要找出第三個路徑 將 export 輸出的訊息,取得第 12 字元以後的所有字串 用 last 將這個月登入者的資訊中,僅留下使用者大名

Page 42: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 42

管線命令(續) 分析『行』,並一關鍵字取出整行: grep

-a :將 binary 檔案以 text 檔案的方式搜尋資料 -c :計算找到 '搜尋字串 ' 的次數 -i :忽略大小寫的不同,所以大小寫視為相同 -n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 ‘搜尋字串’ 內容的那一行! 範例:

將 last 當中,有出現 root 的那一行就取出來 與範例一相反,只要沒有 root 的就取出! 在 last 的輸出訊息中,只要有 root 就取出,並且僅取第一欄

Page 43: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 43

管線命令(續) 將資料進行排序: sort [-t] [-k] [nr]

-f :忽略大小寫的差異,例如 A 與 a 視為編碼相同; -b :忽略最前面的空白字元部分; -M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n :使用『純數字』進行排序 ( 預設是以文字型態來排序的 ) ; -r :反向排序; -u :就是 uniq ,相同的資料中,僅出現一行代表; -t :分隔符號,預設是 tab 鍵; -k :以那個區間 (field) 來進行排序的意思, 範例:

個人帳號都記錄在 /etc/passwd 下,請將帳號進行排序。 /etc/passwd 內容是以 : 來分隔的,我想以第三欄來排序,

該如何? 利用 last ,將輸出的資料僅取帳號,並加以排序

Page 44: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 44

管線命令(續) 將重複資料『行為單位』進行去除: uniq [-ic]

參數: -i :忽略大小寫字元的不同; -c :進行計數

範例: 使用 last 將帳號列出,僅取出帳號欄,進行排序後僅取出一位 呈上題,如果我還想要知道每個人的登入總次數呢?

wc [-lwm] -l :僅列出行; -w :僅列出多少字 ( 英文單字 ) ; -m :多少字元; 範例:

那個 /etc/man.config 裡面到底有多少相關字、行、字元數? 我知道使用 last 可以輸出登入者,但是 last 最後兩行並非帳號

內容,那麼請問,我該如何以一行指令串取得這個月份登入系統的總人次?

Page 45: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 45

管線命令(續)

tee

file

ScreenStandard input

Page 46: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 46

管線命令(續) tee [-a] file

-a :以累加 (append) 的方式,將資料加入 file 當中! 範例:

可以讓我們將 last 的輸出存一份到 last.list 檔案中; 將 ls -l /home 的資料存一份到 ~/homefile ,同時螢幕也有輸出

訊息! 呈上題,如果 ls -l /root 也要記錄到 ~/homefile ?

Page 47: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 47

管線命令(續) tr 刪除或取代字元

-d :刪除訊息當中的 SET1 這個字串; -s :取代掉重複的字元! 範例: 範例一:將 last 輸出的訊息中,所有的小寫變成大寫字元:

last | tr '[a-z]' '[A-Z]'

範例二:將 /etc/passwd 輸出的訊息中,將冒號 (:) 刪除 cat /etc/passwd | tr -d ':'

範例三:將 DOS 檔案的斷行字元 ^M 符號刪除: cat /home/test/dostxt | tr -d '\r' > dostxt-noM

Page 48: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 48

管線命令(續) col [-x]

參數: -x :將 tab 鍵轉換成對等的空白鍵

範例: cat -A /etc/man.config

此時會看到很多 ^I 的符號,那就是 tab cat /etc/man.config | col -x | cat -A | more

Page 49: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 49

管線命令(續) join [-ti12] file1 file2

參數: -t : join 預設以空白字元分隔資料,並且比對『第一個欄位』的資

料,如果兩個檔案相同,則將兩筆資料聯成一行 -i :忽略大小寫的差異; -1 :這個是數字的 1 ,『第一個檔案要用那個欄位來分析』的意思

-2 :代表『第二個檔案要用那個欄位來分析』的意思。 範例:

用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄

join -t ':' /etc/passwd /etc/shadow 我們知道 /etc/passwd 第四個欄位是 GID ,那個 GID 記錄在 /et

c/group 當中的第三個欄位,請問如何將兩個檔案整合 join -t ':' -1 4 /etc/passwd -2 3 /etc/group

Page 50: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 50

管線命令(續) paste [-d] file1 file2

參數: -d :後面可以接分隔字元。預設是以 [tab] 來分隔的! - :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。

範例: 將 /etc/passwd 與 /etc/shadow 同一行貼在一起

paste /etc/passwd /etc/shadow 先將 /etc/group 讀出 ( 用 cat) ,然後與範例一貼上一起!且僅取出

前三行 cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3

Page 51: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 51

管線命令(續) expand [-t] file

參數: -t :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個

空白鍵取代。我們也可以自行定義一個 [tab] 按鍵代表多少個字元呢!

範例: 範例一:將 /etc/man.config 內行首為 MANPATH 的字樣就取

出;僅取前三行; grep '^MANPATH' /etc/man.config | head -n 3

呈上,如果我想要將所有的符號都列出來? ( 用 cat) grep '^MANPATH' /etc/man.config | head -n 3 |cat -A

呈上,我將 [tab] 按鍵設定成 6 個字元的話? grep '^MANPATH' /etc/man.config | head -n 3 | expand -t 6 - | cat -A

Page 52: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 52

管線命令(續) split [-bl] file PREFIX

參數: -b :後面可接欲分割成的檔案大小,可加單位,例如 b, k, m 等; -l :以行數來進行分割。

範例: 我的 /etc/termcap 有七百多 K ,若想要分成 300K 一個檔案時?

cd /tmp; split -b 300k /etc/termcap termcap

如何將上面的三個小檔案合成一個檔案,檔名為 termcapback cat termcap* >> termcapback

使用 ls -al / 輸出的資訊中,每十行記錄成一個檔案 ls -al / | split -l 10 - lsroot

Page 53: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 53

管線命令(續) xargs [-0epn] command

參數: -0 :如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元

時,這個 -0 參數可以將他還原成一般字元。 -e :這個是 EOF (end of file) 的意思。後面可以接一個字串! -p :在執行每個指令的 argument 時,都會詢問使用者的意思; -n :後面接次數,每次 command 指令執行時,要使用幾個參數。 當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔! 範例:

將 /etc/passwd 內的第一欄取出,僅取三行,使用 finger 這個指令將每個 帳號內容秀出來

同上,但是每次執行 finger 時,都要詢問使用者是否動作? 將所有的 /etc/passwd 內的帳號都以 finger 查閱,但一次僅查閱五個帳號

同上,但是當分析到 lp 就結束這串指令?

Page 54: Linux  基礎學習

VBird (2005/08/18) Linux --Bash Shell基礎 54

管線命令(續) 關於減號 - 的用途

在管線命令當中,常常會使用到前一個指令的 stdout 作為這次的 stdin , 某些指令需要用到檔案名稱 ( 例如 tar) 來進行處理時,該 stdin 與 stdout 可以利用減號 "-" 來替代

ex> tar -cvf - /home | tar -xvf - 上面這個例子是說:『我將 /home 裡面的檔案給他打包,但打包的資料不是紀錄到檔案,而是傳送到 stdout ; 經過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。