Shell
何爲Shell,就是用戶和操作系統核心交互的工具,用戶通過Shell向操作系統發送指令,來支配系統中的硬軟件設備。
在Linux上使用的Shell有很多,其中最爲廣泛的要數Bash(BourneAgain Shell,簡稱sh),一般Linux都是以這個爲預設的Shell。 想知道現在用的是什Shell,可以 [echo $SHELL]
History
查看命令歷史。要執行歷史命令,只需要[! n]
type
[type command]來查詢命令是否bash的內建命令,加[-a],如果是內建命令如[type–a cd]就會顯示“cd is a shell builtin”,如果不是,就會顯示其路徑位置。
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
ls
列出文件和目錄的內容,一般用[ ls-ltr]
-1 每列僅顯示一個文件或目錄名稱。 原來是並排顯示的,現在每個文件爲一行。
-l 使用詳細格式列表。
-a或--all 顯示所有文件和目錄,包括隱藏文件。
-A或--almost-all 同-a,只是不顯示.和..
-c 以更改時間排序,顯示文件和目錄。
-d或--directory 顯示目錄名稱而非其內容。
-h或--human-readable 用"K","M","G"來顯示文件和目錄的大小。
-H或--si 此參數的效果和指定"-h"參數類似,但計算單位是1000Bytes而非1024Bytes。
-r或--reverse 反向排序。
-R或--recursive 遞歸處理,將指定目錄下的所有文件及子目錄一併處理。
-m 用","號區隔每個文件和目錄的名稱。
-S 用文件和目錄的大小排序。
-t 用文件和目錄的更改時間排序。
-b或--escape 顯示脫離字符。
-B或--ignore-backups 忽略備份文件和目錄。
-C 以又上至下,從左到右的直行方式顯示文件和目錄名稱。
-D或--dired 用Emacs的模式產生文件和目錄列表。
-f 此參數的效果和同時指定"aU"參數相同,並關閉"lst"參數的效果。
-F或--classify 在執行文件,目錄,Socket,符號連接,管道名稱後面,各自加上"*","/","=","@","|"號。
-g 次參數將忽略不予處理。
-G或--no-group 不顯示羣組名稱。
-i或--inode 顯示文件和目錄的inode編號。
-I<範本樣式>或--ignore=<範本樣式> 不顯示符合範本樣式的文件或目錄名稱。
-k或--kilobytes 此參數的效果和指定"block-size=1024"參數相同。
-L或--dereference 如遇到性質爲符號連接的文件或目錄,直接列出該連接所指向的原始文件或目錄。
-n或--numeric-uid-gid 以用戶識別碼和羣組識別碼替代其名稱。
-N或--literal 直接列出文件和目錄名稱,包括控制字符。
-o 此參數的效果和指定"-l"參數類似,但不列出羣組名稱或識別碼。
-p或--file-type 此參數的效果和指定"-F"參數類似,但不會在執行文件名稱後面加上"*"號。
-q或--hide-control-chars 用"?"號取代控制字符,列出文件和目錄名稱。
-Q或--quote-name 把文件和目錄名稱以""號標示起來。
-s或--size 顯示文件和目錄的大小,以區塊爲單位。
-T<跳格字符>或--tabsize=<跳格字數> 設置跳格字符所對應的空白字符數。
-u 以最後存取時間排序,顯示文件和目錄。
-U 列出文件和目錄名稱時不予排序。
-v 文件和目錄的名稱列表以版本進行排序。
-w<每列字符數>或--width=<每列字符數> 設置每列的最大字符數。
-x 以從左到右,由上至下的橫列方式顯示文件和目錄名稱。
-X 以文件和目錄的最後一個擴展名排序。
--block-size=<區塊大小> 指定存放文件的區塊大小。
--color=<列表格式> 培植文件和目錄的列表格式。
--full-time 列出完整的日期與時間。
壓縮備份
壓縮和解壓縮,都是會把原來的文件刪掉,除非加參數
一般Linux上的壓縮格式--------------------------
*.Z compress 程序壓縮的檔案;
*.bz2 bzip2 程序壓縮的檔案;
*.gz gzip 程序壓縮的檔案; GNU zip
*.tar tar 程序打包的數據,並沒有壓縮過;
*.tar.gz tar 程序打包的檔案,其中並且經過 gzip 的壓縮
gzip zcat
-c :將壓縮的數據輸出到屏幕上,可透過數據流重導向來處理;
-d :解壓縮的參數;
-t :可以用來檢驗一個壓縮檔的一致性~看看檔案有無錯誤;
-# :壓縮等級,-1 最快,但是壓縮比最差、-9最慢,但是壓縮比最好!預設是 -6
$ zcat test.gz 將內容解壓後顯示,相當於[zip cat]
$ gzip -d test.gz 解壓
$ gzip -9 -c test> test_tmp.gz 一般壓縮後都是在源文件後加.gz,除非>指定。
tar 打包
gzip只能壓縮單個文件,而如果要壓縮整個目錄,可以通過tar來完成。同時,tar 可以配合gzip,同時整合並壓縮。
-c :建立一個壓縮檔案的參數指令 (create的意思);
-x :解開一個壓縮檔案的參數指令!
-t :查看 tarfile 裏面的檔案!
【c/x/t 僅能存在一個,不可同時存在,因爲不可能同時壓縮與解壓縮】
-z :是否需要用 gzip 壓縮?
-j :是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示log
-f :使用檔名,在f之後要立即接檔名,不要再加參數!
例如『 tar -zcvfP tfile sfile』要寫成『 tar -zcvPftfile sfile』
-p :使用原檔案的原來屬性 (被打包的檔案將不會依據使用者的身份來改變權限)
-P :可以使用絕對路徑來壓縮
-N :比後面接的日期(yyyy/mm/dd)還要新的纔會被打包進新建的檔案中!一般用於備份,因爲有時候只要備份較新的檔案,舊的已經備份過了,就沒有必要再重新操作。
將整個 /etc目錄下的檔案全部打包成爲/tmp/etc.tar
$ tar -cvf destZip.tar srcDir 僅打包,不壓縮;
$ tar -zcvf destZip.tar.gz srcDir 打包後,以 gzip 壓縮;
$ tar -tvf destZip.tar 查看打包目錄文件;如果是壓縮過的,要加z
在 /home 當中,比 2005/06/01 新的檔案才備份
$ tar -N '2005/06/01' -zcvf home.tar.gz /home
只想要解壓/tmp/etc.tar.gz 內的 etc/passwd
$ tar -zxvf /tmp/etc.tar.gz etc/passwd
我要備份 /home, /etc ,但不要 /home/dmtsai
$ tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
cpio 備份-數據量重導向 P336
透過數據流重導向的方法來將檔案進行輸出/輸入的一個方式
o :將數據 copy 輸出到檔案或裝置上
-i :將數據自檔案或裝置copy 出來系統當中
-t :查看 cpio 建立的檔案或裝置的內容
-c :一種較新的portable format 方式儲存
-v :讓儲存的過程中文件名稱可以在屏幕上顯示
-B :讓預設的 Blocks 可以增加至 5120bytes ,預設是 512 bytes !
這樣的好處是可以讓大檔案的儲存速度加快(請參考 i-nodes 的觀念)
-d :自動建立目錄!由於cpio 的內容可能不是在同一個目錄內,
如此的話在反備份的過程會有問題! 這個時候加上 -d 的話,
就可以自動的將需要的目錄建立起來了!
-u :自動的將較新的檔案覆蓋較舊的檔案!
文檔處理
文件使用慣例
文件使用慣例,用空格,Tab等隔開,但是由於連續空字段不好區分,所以一般使用冒號: ,如 /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SDStack:/var/run/avahi-daemon:/sbin/nologin
通過:來分隔,字段意思分別是:用戶名,加密後密碼,用戶id,用戶組id,用戶姓名,根目錄,登陸的shell
cp
複製文件或目錄
-r 或-R (recur) 遞歸,把目錄下面的所有文件和目錄都複製
-s或--symbolic-link 對源文件建立符號連接,而非複製文件。
-a或--archive 此參數的效果和同時指定"-dpR"參數相同。
-b或--backup 刪除,覆蓋目標文件之前的備份,備份文件會在字尾加上一個備份字符串。
-d或--no-dereference 當複製符號連接時,把目標文件或目錄也建立爲符號連接,並指向與源文件或目錄連接的原始文件或目錄。
-f或--force 強行復制文件或目錄,不論目標文件或目錄是否已存在。
-i或--interactive 覆蓋既有文件之前先詢問用戶。
-l或--link 對源文件建立硬連接,而非複製文件。
-p或--preserve 保留源文件或目錄的屬性。
-P或--parents 保留源文件或目錄的路徑。
-S<備份字尾字符串>或--suffix=<備份字尾字符串> 用"-b"參數備份目標文件後,備份文件的字尾會被加上一個備份字符串,預設的備份字尾字符串是符號"~"。
-u或--update 使用這項參數後只會在源文件的更改時間較目標文件更新時或是 名稱相互對應的目標文件並不存在,才複製文件。
-v或--verbose 顯示指令執行過程。
-V<備份方式>或--version-control=<備份方式> 用"-b"參數備份目標文件後,備份文件的字尾會被加上一個備份字符串,這字符串不僅可用"-S"參數變更,當使用"-V"參數指定不同備份方式時,也會產生不同字尾的備份字串。
-x或--one-file-system 複製的文件或目錄存放的文件系統,必須與cp指令執行時所處的文件系統相同,否則不予複製。
mv
移動目錄或者文件,重命名也是通過這種方式實現的。[默認下,目標文件遇到重名,直接覆蓋]
-b或--backup 若需覆蓋文件,則覆蓋前先行備份。
-f或--force 若目標文件或目錄與現有的文件或目錄重複,則直接覆蓋現有的文件或目錄。
-i或--interactive覆蓋前先行詢問用戶。
-S<附加字尾>或
--suffix=<附加字尾> 與-b參數一併使用,可指定備份文件的所要附加的字尾。
-u或--update 在移動或更改文件名時,若目標文件已存在,且其文件日期比源文件新,則不覆蓋目標文件。
-v或--verbose 執行時顯示詳細的信息。
rm
刪除文件和目錄,如果是非空目錄的話,不能直接刪除,要用-r。
-r或-R或--recursive 遞歸處理,將指定目錄下的所有文件及子目錄一併處理。
-i或--interactive刪除既有文件或目錄之前先詢問用戶。
-d或--directory 直接把欲刪除的目錄的硬連接數據刪成0,刪除該目錄。
-f或--force 強制刪除文件或目錄。
-v或--verbose 顯示指令執行過程。
ln
爲某一個文件在另外一個位置建立一個鏈接,這個命令最常用的參數是-s,具體用法是:ln -s srcFile destFile。
當我們需要在不同的目錄,用到相同的文件時,我們不需要複製兩個文件,而只要創建一個,然後在另一個目錄下創建一個連接(link),這兩個文件就同步了,兩邊都同時接受修改,不必重複的佔用磁盤空間。例如:ln -s /bin/less /usr/local/bin/less
Linux/Unix 檔案系統中,有所謂的連結(link),我們可以將其視爲檔案的別名,而連結又可分爲兩種 : 硬連結(hard link)與軟連結(symbolic link)。
和Java的強引用弱引用有點像,這裏的硬連接就相當於強引用,只要一個file存在強連接,就不會被刪除回收,真正刪除一個文件,是要把這個文件下所有強連接都rm纔算刪除掉。而且不同的連接可以有不同的名字,這個和強引用很像吧!
軟連接和java的弱引用很像,雖然引用掛在上面,但是和文件的刪除回收沒有關係,只要源文件被刪除,那麼軟連接也就失效了。而如果只是刪除軟連接的話,源文件是不會受到影響的。
硬連結是存在同一個檔案系統中,而軟連結卻可以跨越不同的檔案系統。不論是硬連結或軟鏈結都不會將原本的檔案複製一份,只會佔用非常少量的磁碟空間。
-f : 鏈結時先將與 dist 同檔名的檔案刪除
-d : 允許系統管理者硬鏈結自己的目錄
-i : 在刪除與 dist 同檔名的檔案時先進行詢問
-n : 在進行軟連結時,將dist 視爲一般的檔案
-s : 進行軟鏈結(symboliclink) 【默認建立硬鏈接】
-v : 在連結之前顯示其檔名
-b : 將在鏈結時會被覆寫或刪除的檔案進行備份
-S SUFFIX :將備份的檔案都加上 SUFFIX的字尾
-V METHOD :指定備份的方式
vi
vi是Linux上正規的文本編輯器,所有版本的Linux都有,所以通用性很強。
基本上 vi 共分爲三種模式,分別是『一般模式』、 『編輯模式』與『指令列命令模式』三種!
如果vi一個不存在的file,下面會提示[NewFile],輸入內容後:wq會自動創建這個文件;否則不創建。
一般模式:
vi剛進去的時候是一般模式,移動光標進行閱讀,可以處理刪除、複製、粘貼等等的動作。 不過粘貼後自動進入--INSERT--狀態
編輯模式:
在一般模式下,按下『i, I, o,O, a, A, r, R』等字母之後纔會進入編輯模式。
如果要回到一般模式時, 則必須要按下『Esc』這個按鍵即可退出編輯模式。
指令列命令模式:
在一般模式當中,輸入『 : 或 / 或 ? 』就可以將光標移動到最底下那一行。[:]是用來輸入指令的,如[:wq]保存退出; 而[/][?]是用於搜索的,如查找work可以寫成[/word]
一般模式下--------------------------------------
如果想要多次移動的話,可以在方向前添加數字,如向下移動30行,可以使用"30↓"。
空格和→等效,都是向右移動。[0]移動到行首,[$]移動到行尾
[G]移動到文件最後一行,[nG]移動到n行,和eclipse的Ctrl+L等效。[gg]移動到文件第一行。
[H]移動到當前屏幕第一行,[L]移動到當前屏幕最後一行。
[x]向後刪除,相當於[del];[X]向前刪除,相當於退格鍵。[nx][nX]刪除多個。
★[dd]刪除當前行,相當於eclipse的Ctrl+D;[ndd]刪除n行;[d0] 刪除至行首;[d$]刪除至行尾;[d1G]刪除到第一行;[dG]刪除到最後一行。
★[yy]複製當前行,[nyy]複製n行;[y0]複製到行首;[y$]複製到行尾;[y1G]複製到第一行;[yG]複製到最後一行。
[p]把複製內容粘貼到光標下一行;[P]上一行。
[u]還原;[Ctrl+r]重做;相當於Ctrl+Z/Y
[.]重複上一個動作。
命令模式[:]下-------------------------------------
[:w]保存文件;[:w newFile]另存爲newFile;[:n1,n2 w newFile]把n1行到n2行的內容保存到newFile中。
[:r otherFile]把otherFile的內容插入的光標處。
[:set nu]顯示行號;[:setnonu]取消顯示行號。 :set能設置很多vi的狀態
[!]有強制的意思,如[:q!]就是不保存直接退出;[:w!]就是強制寫入只讀文件,當然是在有權限的前提下;[:e!]強制還原到原來打開時候的文件。
命令模式[/][?]下-------------------------------------
[/word]搜索word字符,按[n]表示上一個,[N]表示下一個。
[:1,s/first/second/g]把第一行的”first”替換成”second”。如果把[g]改成[gc]就需要確認,每按一次y替換一個,很方便直觀。
第一行到第五行[:1,5s/first/second/g],第一行到最後一行[:1,$s/first/second/g]
vi還有暫存盤的功能。當我們編輯一個file的時候,在同一個目錄會保存一個名爲.XXXX.swp的隱藏文件,用來臨時保存我們的修改。一旦系統掛了,下次重新vi這個file的時候,系統就會問你是否要恢復『Recovery』,你輸入[R]後就會回到這個臨時文件中,原來修改的東西都會在了。
vim
vim是vi的加強版,現在很多系統都直接把vim覆蓋vi。如果你使用 vi 後,卻看到畫面的右下角有顯示目前光標所在的行列號碼,那麼您的 vi 已經被 vim 所取代了。
vim的優點在於:具有顏色顯示的功能,並且還支持許多的程序語法 (syntax),因此,當您使用 vim 編輯程序時( 不論是 C 語言,還是 shell script ),我們的 vim 將可幫您直接進行『程序除錯 (debug)』的功能! 而且還會記錄你的操作,下次重新打開的時候會保持原來的狀態,這些信息會記錄在~/.viminfo中
[v] 字符選擇,會將光標經過的地方反白選擇!
[V] 行選擇,會將光標經過的行反白選擇!
[Ctrl+v] 區塊選擇,可以用長方形的方式選擇資料
[y] 將反白的地方複製起來
[d] 將反白的地方刪除掉
cat
cat是concatenate的簡寫,顯示或連結一般的ascii文本文件。類似DOC中的type。
$ cat text 顯示text這個文件
$ cat file1 file2 依次顯示file1,file2的內容
$ cat file1 file2>file3
more/ less
more用於顯示較大的文件,只顯示第一屏,等你按任何的一個鍵以後,才繼續顯示。
而less除了有more的功能以外,還可以用方向鍵往上或網下的滾動文件,讓你隨意瀏覽,閱讀文章時,less是個非常好的選擇。
換行
Linux和DOS的換行符是不同的,DOS使用的斷行字符爲 ^M$ ,我們稱爲 CR 與 LF 兩個符號。而在Linux底下,則是僅有LF ($)這個斷行符號。
如果沒有經過轉換,在Windows編輯後直接拉到Linux,在Linux底下的指令在開始執行時,他的判斷依據是『Enter』,由於 DOS 的斷行符號是 CRLF ,也就是多了一個^M的符號出來所以會導致無法執行,就會報”… ^M …”的錯誤。
可以通過命令來轉換:
$ dos2unix[-kn] file [newfile]
$ unix2dos[-kn] file [newfile]
也可以通過tr命令來刪除^M,即dos的換行符'\r'(詳見下面tr):
$ cat .dostxt | tr -d '\r' >dostxt-noM
cut 列
cut可以進行列的分割,所以縱向分析log或者文件的時候很方便,就像用excel分析,可以取特定的列,也可以取特定的縱向位置的字符串。
-d :後面接分隔字符。與 -f 一起使用;
-f :依據 -d 的分隔字符將一段訊息分割成爲數段,用 -f 取出第幾段的意思;
-c :以字符(characters) 的單位取出固定字符區間;
一般比較很難保證長度一樣,所以-c一般用的不多。
$ ls -l | cut -d ' ' -f 1 列表後,以’ ’分割開,取第一列。 就是權限列
drwxr-xr-x.
drwxrwxr-x.
grep 行
egrep:擴展查找,正則匹配
fgerp:快速查找,非正則匹配
grep:最早的文本匹配 -E等效於egrep;-F等效於fgerp
可以指定匹配模式:-e pat-list -f pat-list-file
-a :將 binary 檔案以 text 檔案的方式搜尋數據
-c :找到結果的數目
-i :忽略大小寫的不同,所以大小寫視爲相同
-l 顯示匹配模式,而不是打印匹配行
-n :順便輸出行號
-v :反向選擇,顯示不匹配的行
$ ls -l | cut -d ' ' -f 1 | grep 'd'
drwxr-xr-x.
drwxr-xr-x.
$ ls -l | grep -v'jscai' 查找沒有jscai字段的
tr
用來刪除一段訊息當中的字符,或是進行字符的替換,常常用來取代檔案中的怪異符號!
-d :刪除訊息當中的 SET1這個字符串;
-s :取代掉重複的字符!
$ ls 源文件名
ls.txt sortNew.txt
$ ls | tr '[t,x]' '[a,b]' 把[t,x]依次替換成[a,b]
ls.aba soraNew.aba
$ ls | tr '[a-z]' '[A-Z]' 同理大小寫替換,使用 []可以特定替換,或者範圍替換。
$ ls | tr -d '[s,t]' -d刪除特定字符串,也可以用[]
l.x orNew.x
範例二:將 /etc/passwd 輸出的訊息中,將冒號(:) 刪除
[root@linux ~]#cat /etc/passwd | tr -d ':'
範例三:將 DOS 檔案的斷行字符 ^M 符號刪除:
[root@linux ~]#cat /home/test/dostxt | tr -d '\r' > dostxt-noM
# 那個 /r 指的是 DOS 的斷行字符,關於更多的字符,請參考 man tr
col/expand
col把tab轉換成空格: $ cat /etc/test.txt | col -x
expand -t n(n爲數字),把tab轉換成n個空格
join 處理兩個相關文件的合併,有相同數據行,合併在一起 P406
paste 直接把兩行貼在一起,中間以tab隔開
sort
sort可以根據不同的標準來排序。 【ls是默認以名字順序排序的】
-f : 忽略大小寫的差異,例如 A 與 a 視爲編碼相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字來排序,例如JAN, DEC 等等的排序方法;
-n :使用『純數字』進行排序(預設是以文字型態來排序的);
-r :反向排序;
-u :就是 uniq ,相同的數據中,僅出現一行代表;
-t :分隔符,預設是 tab 鍵;
-k :以那個區間 (field) 來進行排序,一般都和-t一起使用
$ ls -l | sort -t ' ' -k 5 以’ ’分割後的第五列排序
-rw-rw-r--. 1 redhat redhat 0 Oct 20 07:54 show
-rw-rw-r--. 1 redhat redhat 10 Oct 18 20:09 ab2
-rw-rw-r--. 1 redhat redhat 12 Oct 18 20:07 test
drwxrwxr-x. 2 redhat redhat 4096 Oct 12 20:16 bin
split
根據文件的大小或者行數,來分割成幾個文件
-b :後面可接欲分割成的檔案大小,可加單位,例如 b, k, m 等;
-l :以行數來進行分割。
$ split -b 300k /etc/termcap xxx 分成300k一個的小文件
會以xxxaa,xxxab, xxxac 等方式來建立小檔案的!
uniq
-i :忽略大小寫字符的不同;
-c :進行計數
uniq能去重結果裏面的內容,如下面,我去重列表中的第二列數據。但是明顯有兩個1,這是因爲沒有連在一起,如果想要徹底去掉,就需要先排序
$ ls -l | cut -d ' ' -f 2 | uniq
1
2
1
4
wc wordCount
如果我想要知道/etc/man.config 這個檔案裏面有多少字?多少行?多少字符的話,可以怎麼做呢?其實可以利用 wc 這個指令來達成喔
-l :僅列出行;
-w :僅列出多少字(英文單字);
-m :多少字符;
$ ls | wc -l 一般這個還是很常用的
文件搜索
在 Linux 底下也有相當優異的搜尋系統呦!通常 find 不很常用的!因爲速度慢之外,也很操硬盤!
通常我們都是先使用 whereis或者是locate來檢查,如果真的找不到了,才以find來搜尋!爲什麼呢?因爲Linux 系統會將系統內的所有檔案都記錄在一個數據庫檔案裏面,而whereis 與 locate 是利用數據庫來搜尋,所以相當的快速。而find是直接搜尋硬盤,所以花銷很大。
which尋找可執行文檔,在$PATH的路徑下查找;
whereis會把相關的文檔都列舉出來
find
$ find [PATH][option] [action]
其中action是[-exec],後面可以加其他指令來對結果進行進一步處理: -exec command
名字相關:
find/home/redhat –name test 在”/home/redhat”下查找名字爲test的文件
其中test名字可以使用通配符,如’*est’
類型相關:
-type TYPE :搜尋檔案的類型爲TYPE $ find /home/redhat –typed
(類型主要有:f一般檔案;d目錄;b/c裝置檔案;l連結檔;s socket;p FIFO等。
時間相關:
-atime n :在n天之前的『一天之內』被access過的檔案;
-ctime n :在n天之前的『一天之內』被change過狀態的檔案;
-mtime n :在n天之前的『一天之內』被modification過的檔案;
-newer file :只要比file的updateDate新,都要列出來。
擁有者相關:
Owner : -uid userId -user ownerName -nouser
Group : -gid groupId -group groupName -nogroup
查找owner爲redhat的文件 : $ find /home/redhat –user redhat
權限相關:
-perm mode :搜尋檔案屬性『剛好等於』mode,這個mode爲類似chmod的屬性值,舉例來說,-rwsr-xr-x 的屬性爲 4755 !
-perm -mode :搜尋檔案屬性『必須要全部囊括 mode 的屬性』的檔案,舉例來說,我們要搜尋-rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,當一個檔案的屬性爲 -rwsr-xr-x ,亦即 4755 時,也會被列出來。
-perm +mode :搜尋檔案屬性『包含任一mode 的屬性』的檔案,舉例來說,我們搜尋-rwxr-xr-x ,亦即 -perm +755 時,但一個檔案屬性爲 -rw------- 也會被列出來,因爲他有 -rw.... 的屬性存在!
大小相關:
-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:
c: 代表 byte, k: 代表 1024bytes。
IO 標準輸入輸出
標準的輸入輸出就是程序的數據來源、去向以及錯誤輸出。
UNIX默認的標準輸入輸出和錯誤輸出都是終端。我們可以通過cat來體驗,如果輸入cat,然後再輸入一句話,就會馬上看到一樣的輸出。
$ cat
$ Hello World
Hello World
read 鍵盤輸入
read [-pt] variable
-p :後面可以接提示字符!
-t :後面可以接等待的秒數,不會一直等待使用者!
如果直接跟一個變量,就會把鍵盤輸入存入變量:$ read readVar
$ read -p "What do you wantto say: " -t 30 something
Hello World
$ echo $something
Hello World
I/O重定向
I/O重定向就是,你重新安排從哪裏輸入,或者輸出到哪裏。
< 改變程序的輸入,program <file,就是將program的輸入改成file
$ tr -d '\r' < dos-file.txt
> 改變程序的輸出,program >file,就是將program的輸出改成file。
> 在文件不存在時,會新建一個;如果已存在就會覆蓋舊的。
$echo "Hi" > ioReDirect.txt
$ echo "Hello" > ioReDirect.txt
>> 附加到文件末尾:如果不存在則新建;已存在,則附加到文件末尾。
$ echo "World" >> ioReDirect.txt 我們也能看到,echo是自帶的換行符
注意,此處執行命令的重定向,其實是分兩個標準流Stdout和Stderror,分別對應1和2,默認只是把正確信息1流入,錯誤信息2需要指定。
$ ls -l > show.txt 能把列表信息打印到show.txt中。
$ ls -l suibian > show.txt 此時列舉不存在的文件,show.txt中就沒有打印信息。
$ ls -l suibian 2>show.txt 需要指定2,才能把錯誤信息流入文件。
$ ls -l suibian >show.txt 2> error.txt 所以,全面地可以out和err兩個都寫。
$ ls –l suibian > show.txt 2>&1 這樣是1和2都輸出都同一個地方,2到1嘛。
另外要體體垃圾桶“/dev/null”,我們有什麼不想要就可以輸出到裏面。
管道
| 建立管道,改變I/O,program_1 |program_2就是將program_2的輸入改成program_1的輸出,建立一個虛擬的“管道”把兩個文件連接起來,比使用臨時文件快上10倍。
構造管道時,應該試着讓每個階段的數據量更少,過濾減少數據量移動,提高效率。例如在sort前,先grep一下,減少操作的數據量。
當然可以連接多個文件。而且還可以把各類工具串在一塊使用。
cat word.txt | sort> sortWord.txt 把單詞排個序,然後輸出到sortWord.txt中。
Apple
Boy
Cat
Dog
tr 轉換字符 : -c –C –d –s 類似於replace()和trim(),
可以進行大小寫轉換,刪除字符,濃縮字符
tr -d'o' < trOld.txt | sort > trNew.txt
Apple
By
Cat
Dg
- 減號 管線命令
管線命令在 bash 的連續的處理程序中是相當重要的!另外,在 log file 的分析當中也是相當重要的一環。
另外,在管線命令當中,常常會使用到前一個指令的 stdout 作爲這次的 stdin ,某些指令需要用到文件名稱 (例如 tar) 來進行處理時,該stdin與stdout可以利用減號 "-" 來替代。
$ tar-cvf - /home | tar -xvf -
將 /home 裏面的檔案給他打包,但打包的數據不是紀錄到文件,而是傳送到stdout;經過管線後,將數據傳送給後面的 tar -xvf - 。
前面的-是輸出到stdout,後面的-則是從stdin中取,因此,我們就不需要使用 file 了!
tee
我們通過>和<來重導向數據,但是數據要不就流入文件,不再顯示到屏幕 > < ;要不就顯示在屏幕,而不流入文件 echo。這裏的tee就是在傳入文件的同時在屏幕上顯示。
-a :以累加 (append)的方式,將數據加入 file 當中!
$ ls -l | tee ls.txt
-rw-rw-r--. 1 redhat redhat 115 Oct 26 23:38 ls.txt
-rw-rw-r--. 1 redhat redhat 18 Oct 26 23:37 sortNew.txt
df /du
df (disk free)顯示磁盤的相關信息,如磁盤的文件系統與使用情形。語法:df [option]
du顯示當前目錄下,文件和目錄的大小,默認只顯示目錄,-a把文件也顯示出來。du顯示的是目錄和文件大小,而df顯示的是磁盤。
兩者的參數幾乎相同,一般[-ah]就夠用了。
參數:
-a或--all 包含全部的文件系統。
--block-size=<區塊大小> 以指定的區塊大小來顯示區塊數目。
-h或--human-readable 以可讀性較高的方式來顯示信息。
-H或--si 與-h參數相同,但在計算時是以1000Bytes爲換算單位而非1024 Bytes。
-i或--inodes 顯示inode的信息。
-k或--kilobytes 指定區塊大小爲1024字節。
-l或--local 僅顯示本地端的文件系統。
-m或--megabytes 指定區塊大小爲1048576字節。
--no-sync 在取得磁盤使用信息前,不要執行sync指令,此爲預設值。
-P或--portability 使用POSIX的輸出格式。
--sync 在取得磁盤使用信息前,先執行sync指令。
-t<文件系統類型>或--type=<文件系統類型> 僅顯示指定文件系統類型的磁盤信息。
-T或--print-type 顯示文件系統的類型。
-x <文件系統類型>或--exclude-type=<文件系統類型> 不要顯示指定文件系統類型的磁盤信息。
ps進程
查看進程命令,運用該命令可以確定有哪些進程正在運行和運行地狀態、進程 是否結束、進程有沒有僵死、哪些進程佔用了過多地資源等等。
也可以用top, 顯示CPU等系統資源的佔用情況
ps -l 顯示進程佔用資源 ps -l PID 能直接查詢一個指定線程的情況
ps a 顯示現行終端機下的所有程序,包括其他用戶的程序。
ps -A 顯示所有程序。
ps c 顯示每個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。
ps -e 此參數的效果和指定"A"參數相同。
ps e 列出程序時,顯示每個程序所使用的環境變量。
ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關係。
ps -H 顯示樹狀結構,表示程序間的相互關係。
ps -N 顯示所有的程序,除了執行ps指令終端機下的程序之外。
ps s 採用程序信號的格式顯示程序狀況。
ps S 列出程序時,包括已中斷的子程序資料。
ps -t 指定終端機編號,並列出屬於該終端機的程序的狀況。
ps u 以用戶爲主的格式來顯示程序狀況。
ps x 顯示所有程序,不以終端機來區分。
最常用 : ps –ef | grep “XXX”, 查找目標進程,然後再配合kill來殺掉。
kill -9 [PID] 強迫終止進程
Linux中大小寫敏感
more就是先讀一部分,按回車繼續顯示。可以在打開文件的時候使用,也可以通過管道來使用,如[ls –l |more]
less
echo會自動在行末帶上換行\n
而printf不會自帶換行符,使用方式和C中的類似。
PS1 提示符
提示符PS1就是命令行的最前邊的[ … ],可以通過設定來顯示不同的樣子:
[redhat@localhost ~]$ PS1='[\u@\h \w \A #\#]\$ '
[redhat@localhost ~ 21:30 #47]$
\d :代表日期,格式爲Weekday Month Date,例如 "Mon Aug 1"
\H :完整的主機名稱。舉例來說,鳥哥的練習機 linux.dmtsai.tw ,那麼這個主機名稱就是 linux.dmtsai.tw
\h :僅取主機名稱的第一個名字。以上述來講,就是 linux 而已, .dmtsai.tw 被省略。
\t :顯示時間,爲 24 小時格式,如:HH:MM:SS
\T :顯示時間,12 小時的時間格式!
\A :顯示時間,24 小時格式, HH:MM
\u :目前使用者的賬號名稱;
\v :BASH 的版本信息;
\w :完整的工作目錄名稱。家目錄會以 ~ 取代;
\W :利用 basename 取得工作目錄名稱,所以僅會列出最後一個目錄名。
\# :下達的第幾個指令。
\$ :提示字符,如果是root 時,提示字符爲 # ,否則就是 $ 囉~
$?
問號也是一個特殊的變量,裏面存放了“上一個執行的指令的返回值”,就是執行一條指令後,通過這個變量可以獲取執行的狀態,如果成功返回0,否則爲非0數,如下:
$ echo $SHELL
/bin/bash
$ echo $?
0
$ 12name=VBird
bash: 12name=VBird: command not found
$ echo $?
127
alias 別名
alias / unalias,可以自己來定義一些別名來簡化命令,通過alias命令能查詢現有的別名,定義:alias lm='ls -al'
$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias vi='vim'
執行跟蹤
通過set -+x來開關跟蹤功能,打開後會打印當前執行的命令。
$ set -x
++ printf '\033]0;%s@%s:%s\007' redhat localhost '~/jscai/bin'
$ pwd
+ pwd
/home/redhat/jscai/bin
++ printf '\033]0;%s@%s:%s\007' redhat localhost '~/jscai/bin'
$ set +x
+ set +x
參考《鳥哥的Linux私房菜》:http://download.csdn.net/detail/tiwerbao/6564193