Linux常用命令筆記-Shell

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) 來進行處理時,該stdinstdout可以利用減號 "-" 來替代。

 

$ 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章