Bash shell


一、認識bash shell

1、登錄取得的shell就記錄在/etc/passwd這個文件內

  可以使用cat /etc/passwd查看

2、bash shell 功能

  a. 命令記憶能力(history),默認1000個,存在~/.bash_history文件

  b. 命令與文件補全功能(Tab鍵的好處)

    【Tab】接在一串命令的第一個字的后面,則為命令補全

    【Tab】接在一串命令的第二個字以后時,則為文件補齊。

  c. 命令別名設置功能(alias), alias lm='ls -al'

  d. 作業控制、前台、后台控制

  e. 程序腳本(shell script)

  f.  通配符(Wildcard)

 

3、bash shell 的內置命令: type

  語法:type [-tpa] name

  參數:

   type: 不加任何參數時, type會顯示name是外部命令還是bash內置命令

   -t:   當加入-t 參數時, type會將name以下面這些字眼顯示出它的意義:

      file:表示為外部命令;

      alias: 表示該命令為命令別名所設置的名稱

      builtin : 表示該命令為bash內置的命令功能

   -p:  如果后面接的name為外部命令時, 才會顯示完整文件名

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

  type主要在找出“執行文件”而不是一般文件名。所以,這個type也可以用來作為類似which命令的用途

 

二、shell 的變量功能  

  1、變量的顯示與設置: echo, unset

    變量的顯示: echo ---》 echo $variable 或 echo ${varible}

    變量的設置規則:

      a. 變量與變量內容以一個等號“=”來連接,如下所示: myname=sam

      b. 等號兩邊不能直接接空格符

      c. 變量名稱只能是英文字母與數字,但是開頭字符不能是數字

      d. 變量內容若有空格符可使用雙引號" 或單引號 ' 將變量內容結合起來,但是雙引號內的特殊字符如$等,可以保留原本的特性,單引號內的特殊字符則僅為一般字符(純文本)

      e.可用轉義字符“\”將特殊符號變成一般字符

      f. 在一串命令中,還需要通過其他的命令提供的信息,可以使用反單引號。`命令` 或 $(命令),

        特別注意,那個是鍵盤上方數字鍵1左邊那個按鍵,而不是單引號。

      g. 若該變量為了增加變量內容時, 則可用$變量名稱或¥{變量}累加內容,如下:  

        PATH=$PATH:/home/bin

      h. 若該變量需要在其他子進程執行,則需要以export來使變量變成環境變量:

        "export PATH"

      i. 通常大寫字符為系統默認變量,自行設置變量可以使用小寫字符, 方便判斷

        j.取消變量: unset 變量名稱

    子進程: 就是說在我目前這個shell的情況下,去打開另一個新的shell,新的那個shell就是子進程。在一般的狀態下,父進程的自定義變量是無法再子進程內使用的。但是通過export將變量變成環境變量后,就能夠在子進程下面應用了。

 

  2、 環境變量的功能

    查看環境量: env

    常見的環境變量:

      HOME: 代表用戶的主文件夾。

      SHELL: 它告知我們目前這個環境使用的shell是哪個程序?Linux默認使用/bin/bash的

      HISTSIZE: 這個與“歷史命令”有關,即是我們曾經執行過的命令可以被系統記錄下來,而記錄的“條數”則是由這個值來設置的。

      MAIL:當我們使用mail這個命令在收信時系統會去讀取的郵件信箱文件

      PATH: 就是執行文件查找的路徑,目錄 與目錄中間以冒號(:)分隔,由於文件的查找是依序由PATH的變量內的目錄來查詢,所以目錄的順序也是重要的。

      LANG:語系數據

      RANDOM: 這是“隨機數”的變量。在BASH的環境下,這個RANDOM變量的內容介於0~32767

 

    set查看所有變量(含有環境變量與自定義變量)

     a. PS1(提示符的設置):

      這是PS1(數字的1, 不是英文字母),這個東西就是我們的“命令提示符”。當我們每次按下【Enter】鍵去執行某個命令后,最后要在次出現提示符時, 就會主動去讀取這個變量值了。上面PS1內顯示的是一些特殊符號,這些特殊符號可以顯示不同的信息,每個distributions的bash默認的PS1變量內容可能有些區別,你可以用man bash 查詢一下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的版本信息

    \w: 利用basename函數取得工作目錄名稱,所以僅會列出最后一個目錄名

    \#: 執行的第幾個命令

    \$: 提示符,如果是root時,提示符為#, 否則就是$

    例: PS1='[\u@\h \w \A #\#]\$ ' --------》 [root@www /home/dmtsai 16:40 #12]#

 

    b.$(關於本shell的PID)

      “$”本身也是個變量。這個代表的是目前這個Shell的線程號,即是所謂的PID(Process ID)

    c. ? (關於上個執行命令的回傳碼)

      這個變量是上一個執行命令所傳回的值, 當我們執行某些命令時, 這些命令都會回傳一個執行后的代碼。一般來說, 如果成功執行該命令,則會回傳一個0值。如果發生錯誤,則回傳一個非0值。

    d. OSTYPE, HOSTTYPE, MACHTYPE(主機硬件與內核的等級)

  

    export: 自定義變量轉成環境變量

      export 變量名稱

3、影響顯示結果的語系變量(locale)

 

4、變量鍵盤讀取、數組與聲明: read, array, declare

  a. read : 讀取來自鍵盤輸入的變量

    read 【-pt】 variable

    -p: 后面可以接提示符

    -t: 后面可以接等待的“秒數”

  b. declare/typeset

    declare或typeset是一樣的功能,就是聲明變量的類型。

    declare [-aixr] variable

     參數:

      -a: 將后面名為variable的變量定義成為數組(array)類型

      -i: 將后面名為variable的變量定義為整數數字(integer)類型

        -x: 用法與export一樣,就是將后面的variable變成環境變量, 注意將-變成+可以進行“取消”操作,將環境變量變成一般變量

      -r: 將變量設置成為readonly類型,該變量不可被更改內容,也不能重設

 

    由於在默認的情況下面, bash對於變量有幾個基本的定義:

      a. 變量類型默認為“字符串”, 所以若不指定變量類型, 則1+2為一個“字符串”而不是“計算式”,

      b. bash環境中的數值計算, 默認最多僅能到達整數類型,所以1/3結果是0

 

    數組(arry)變量類型

      var[index]=content

      讀取: ${var[index]}

 

5、與文件系統及程序的限制關系: ulimit

   bash可以限制用戶的某些系統資源的,包括可以打開的文件數量、可以使用的CPU時間、可以使用的內存總量等

    ulimit [-SHacdfltu] [配額]

    參數: 

      -H: hard limit 嚴格的設置,必定不能超過這個設置的數值

      -S: soft limit 警告的設置,可以超過這個設置值,但是若超過則有警告信息

      -a: 后面不接任何參數,可列出所有的限制額度

      -c: 當某些進程發生錯誤時,系統可能會將該進程在內存中的信息寫成文件(排錯用), 這種文件就被稱為內核文件。此為限制每個內核文件的最大容量。

      -f: 此shell可以創建的最大文件容量(一般可能設置為2GB)單位為KB

      -d: 進程可使用的最大斷裂內存(segment)容量

      -l: 可用於鎖定(lock)的內存量。

      -t: 可使用的最大CPU時間(單位為秒)

      -u: 單以用戶可以使用的最大進程數量。

 

    注意: 想要復原ulimit的設置最簡單的方法就是注銷再登陸,否則就是得要重新以ulimit設置才行。不過要注意的是一般身份用戶如果以ulimit設置了-f的文件大小,那么他只能繼續減少文件的容量,不能增加文件的容量。

 

6、變量內容的刪除、替代與替換

   變量內容的刪除與替換

    

變量設置方式 說明
${變量#關鍵字} 若變量內容從頭開始的數據符合“關鍵字”, 則將符合的最短數據刪除
${變量##關鍵字} 若變量內容從頭開始的數據符合“關鍵字”, 則將符合的最長數據刪除
${變量%關鍵字} 若變量內容從尾向前的數據符合“關鍵字”,則將符合的最短數據刪除
${變量%%關鍵字} 若變量內容從尾向前的數據符合“關鍵字”, 則將符合的最長數據刪除
${變量/舊字符串/新字符串} 若變量內容符合“舊字符串”, 則第一個舊字符串被新字符串替換
${變量//舊字符串、新字符串} 若變量內容符合“舊字符串”, 則全部舊字符串被新字符串替換

   變量的測試與內容替換

     在某些時刻我們經常需要“判斷”某個變量是某存在,若變量存在則使用既有的設置,若變量不存在則給予一個常用的設置。

      new_var=${old_var-content}

      new_var: 新的變量,主要用來替換舊變量。新舊變量名稱其實經常是一樣的

      old_var: 舊的變量, 被測試的選項

      content: 變量的“內容”

     注: new_var=${old_var:-content}

        加上:后若變量內容為空或者為未設置,度能夠以后面的內容替換

      如果想要將舊變量內容也一起替換掉的話,那么就是用等號(=):

        如: unset str; var=${str=newvar} --->var=newvar, str=newvar

           str="oldvar"; var=${str=newvar}--->var=newvar, str=oldvar

       如果只想知道,如果舊變量不存在時, 整個測試就告知我“有錯誤”,此時就能夠使用問號“?”

       如: var=${str?無此變量}

 

三、命令別名與歷史命令

    1、命令別名設置:alias, unalias

      例: alias rm='rm -i'

        alias 列出所有命令別名

        unalias rm 解除命令別名

    2、歷史命令:history

        history [n]

        history [-c]

        history [-raw] histfiles

      參數:

        n: 數字,是要列出最近的n條命令行的意思

        -c: 將目前的shell中的所有history內容全部消除。

        -a: 將目前新增的history命令新增入histfiles中, 若沒有加histfiles,默認寫入~/.bash_history

        -r: 將histfiles的內容讀到目前這個shell的history記憶中

        -w: 將目前的history記憶內容寫入histfiles中

       有關history的命令:

        !number :執行第幾條命令

        !command : 由最近的命令向前搜尋命令串開頭為command的那個命令,並執行

        !! : 就是執行上一個命令(相當於按up鍵后,按enter鍵)

 

四、Bash Shell的操作環境

   1、路徑與命令查找順序

     基本上,命令運行的順序可以這樣看:

     1、以相對/絕對路徑執行命令,例如: "/bin/ls"或“./ls”

     2、由alias找到該命令來執行

     3、由bash內置的(builtin)命令來執行

     4、通過$PATH這個變量的順序找到的第一個命令來執行

   可以通過type -a command 查看執行順序

  2、bash的登錄與歡迎信息:/etc/issue, /etc/motd

    a. 終端機接口(tty1~tty6)登錄時的登錄界面: /etc/issue登錄界面提示符設置文件

      

 

  issue內的各個代碼意義
\d 本地端時間的日期
\l 顯示第幾個終端機接口
\m 顯示硬件的等級(i386/i486/i586/i686...)
\n 顯示主機的網絡名稱
\o 顯示domain name
\r 操作系統的版本(相當於rname -r)
\t 顯示本地端的時間
\s 操作系統的名稱
\v 操作系統的版本

       如果你想要讓用戶登錄后取得一些信息,例如你想要讓大家都知道的信息,那么可以將信息加入/etc/motd里面去:如下

      

  3、bash的環境配置文件

    (1)、 login與non-login shell

      login shell:取得bash完整的登錄流程中,就稱為login shell.

      non-login shell: 

      

      login shell 只會讀取這兩個配置文件:

        /etc/profile:這是系統整體的設置,最好不要修改此配置文件

        ~/.bash_profile或~/.bash_login或~/.profile: 屬於用戶個人設置

      /etc/profile(login shell才會讀):

        這個文件設置的變量主要有:

          PATH:會依據UID決定PATH變量要不要含有sbin的系統命令目錄

          MAIL: 依據賬號設置好用戶的mailbox到/var/spool/mail/賬號名

          USER: 根據用戶的賬號設置此變量內容

          HOSTNAME: 依據主機的hostname命令決定此變量內容

          HISTSIZE:歷史命令記錄條數

 

      /etc/profile不止會做這些事, 還會去調用外部的設置數據,下面這些數據會依序被調用進來:

        a. /etc/inputrc:  這個文件會主動判斷用戶有沒有自定義輸入的按鍵功能,如果沒有,/etc/profile就會決定設置“INPUTRC=/etc/inputrc”這個變量。此文件內容為bash的熱鍵、【Tab】鍵有沒有聲音等的數據。

        b. /etc/profile.d/*.sh:  只要在/etc/profile.d/這個目錄內且擴展名為.sh,另外用戶能夠具有r的權限,那么該文件就會被/etc/profile調用。這個目錄下面的文件規定了bash操作接口的顏色、語系、ll與ls命令別名、vi的命令別名、which的命令別名等。如果需要幫所有用戶設置一些共享的命令別名時,可以在這個目錄下面自行創建擴展名為.sh的文件,並將所需要的數據寫入即可。

        c. /etc/sysconfig/i18n: 這個文件是由/etc/profile.d/lang.sh調用的。這也是我們決定bash默認使用何種語系的重要配置文件。文件里最重要的就是LANG這個變量的設置。

 

    注意:bash的login shell情況下所讀取的整體環境配置文件其實只有/etc/profile,但是/etc/profile還會調用其他的配置文件。

    其實bash在都玩了整體環境設置的/etc/profile並借此調用其他配置文件后,接下來則是會讀取用戶的個人配置文件。在login shell的bash環境中,所讀取的個人偏好配置文件其實主要有三個,依序分別是:

      ~/.bash_profile, ~/.bash_login, ~/.profile, 其實bash的loginshell設置只會讀取上面三個文件的其中一個,而讀取的順序則是依照上面的順序。

    讀出順序如下:

             

 

 

 

 (2):source: 讀入環境配置文件的命令

    source 配置文件名

    . 配置文件名

    利用source或小數點(.)都可以將配置文件的內容讀進目前的shell環境中。

 (3): non-login shell:

      當你取得non-login shell時, 該bash配置文件僅會讀取~/.bashrc而已

  (4): /etc/bashrc幫我們的bash定義下面的數據:

      根據不同的UID規定umask的值

      依據不同的UID規定提示符(就是PS1變量)

      調用/etc/profile.d/*.sh的設置

  (5)、其他相關配置文件

    a、 /etc/man.config: 這個文件的內容規定了使用man的時候man page的路徑到哪里去尋找。

    b、~/.bash_history: 每次登錄bash后,bash會先讀取這個文件,將所有的歷史命令讀入內存

    c、 ~/.bash_logout: 這個文件記錄當我們注銷bash后系統再幫我們做完什么操作后才離開

 

   4、終端機的環境設置: stty, set

    a、  查閱目前的一些按鍵內容: stty [-a]

      參數: -a : 將目前所有的stty參數列出來

      

  設置熱鍵: 如 stty erase ^h       ^h--->[ctrl]+h

    

  eof: End of file 的意思,代表結束輸入

  erase: 向后刪除字符

  intr: 送出一個interrupt(中斷)信號給目前正在運行的程序

  kill: 刪除在目前命令行上的所有文字

  quit: 送出一個quit的信號給目前正在運行的進程

  start: 在某個進程停止后,重新啟動它的輸出

  stop: 停止目前屏幕的輸出

  susp: 送出一個terminal stop的信號給正在運行的進程

 

  set 可以幫我們設置整個命令輸出/輸入的環境。例如記錄歷史命令、顯示錯誤內容等。

  參數:

    -u: 默認不啟用,若啟用后,當使用未設置時,會顯示錯誤信息。

    -v: 默認不啟用,若啟用后,在訊息被輸出前,會先顯示信息的原始內容

    -x: 默認不啟用,若啟用后,在命令被執行前,會顯示命令內容(前面有++符號)

    -h: 默認啟用,與歷史命令有關

    -H: 默認啟用,與歷史命令有關

    -m: 默認啟用,與工作管理有關

    -B:默認啟用,與括號[]的作用有關

    -C: 默認不啟用,使用>等時, 則若文件存在時,該文件不會被覆蓋。

 

  b 、顯示目前所有的set設置值: echo $- , 默認為himBH

  c、 另外我們還有其他的按鍵設置功能,就是在前一小節提到的/etc/inputrc這個文件里面設置。

   cat /etc/inputrc

 

   d、 bash默認的組合鍵給它匯整如表:

組合按鍵 執行結果
Ctrl+C 終止目前的命令
Ctrl+D 輸入結束(EOF),例如郵件結束的時候
Ctrl+ M 就是Enter
Ctrl + S 暫停屏幕的輸出
Ctrl+ Q 恢復屏幕的輸出
Ctrl+U 在提示符下,將整行命令刪除
Ctrl+ Z 暫停目前的命令

  

  5、通配符與特殊符號

    a、bash中的通配符

      

符號 意義
* 代表0個到無窮多個任意字符
代表一定有一個任意字符
[] 同樣代表一定有一個在中括號內的字符(非任意字符)。例如[abc]代表一定有一個字符,可能是abc中的任一個 
[-] 若有減號在中括號內時,代表在編碼順序內的所有字符,例如[0-9]代表0到9之間的所有數字,因為數字的語系編碼是連續的
[^] 若中括號內的第一個字符為指數符號(^),那表示原向選擇,例如[^abc]代表一定有一個字符,只要是非a,b,c的其他字符就接受的意思

 

  特殊字符:

    

符號 內容
# 批注符號,這個最常被使用在script當中,視為說明。其后的數據均不執行
\ 轉義字符,將“特殊字符或通配符”還原成一般字符
| 管道(pipe), 分隔兩個管道命令的界定
; 連續命令執行分隔符,連續性命令的界定(注意,與管道命令不相同)
~ 用戶的主文件
$ 使用變量前導符,即是變量之前需要加的變量替代值
& 作業控制(job control), 將命令變成背景下工作
!  邏輯運算意義上的“非”的意思
>,>> 數據流重定向,輸出導向,分別是“替換”與“累加”
<,<< 數據重定向, 輸入導向
'' 單引號,不具有變量置換的功能
"" 具有變量置換的功能
`` 兩個“`”中間為可以先執行的命令,也可使用$()
() 在中間為子shell的起始於結束
{} 在中間為命令塊的組合
   

 

五、數據流重定向

  數據重定向: 就是將某個命令執行后要出現在屏幕上的數據傳輸到其他的地方,例如文件或者是設備。

  1、什么是數據流重定向

    standard output 與 standard error output:

    標准輸出指的是命令執行所回傳的正確的信息, 而標准錯誤輸出可理解為命令執行失敗后,所回傳的錯誤信息。

  

  數據重定向可以將standard output(簡稱stdout)與standard error output(簡稱stderr)分別傳送到其他的文件或設備區,分別傳送所用的特殊字符則如下所示:

  a、 標准輸入(stdin): 代碼為0,使用<或<<

  b、 標准輸出(stdout): 代碼為1, 使用>或>>

  c、 標准錯誤輸出(stderr): 代碼為2, 使用2> 或2>>

  

  覆蓋於累加輸出:

    單個>:覆蓋    兩個>(>>): 累加

  

   a、 /dev/null垃圾桶黑洞設備與特殊寫法:

      /dev/null可以吃掉任何導向這個設備的信息。

      如 find /home -name .bashrc 2> /dev/null

    b、將正確與錯誤數據通通寫入同一個文件的正確寫法:

      find /home -name .bashrc >list 2>&1

      find /home ianme .bashrc &>list

   c、 standard input: < 與 <<:

      <: 將原本需要由鍵盤輸入的數據改由文件內容來替代。

        例如: cat >file <~/.bashrc

      <<:代表結束輸入的意思

 

  

 

   2、命令執行的判斷依據: ; , &&, ||

    a、cmd;cmd(不考慮命令相關性的連續命令執行)

     b、$?(命令回傳碼)與&& 或 ||

   
cmd1 && cmd2 若cmd1執行完畢且正確執行($?=0), 則執行cmd2
若cmd1執行完畢且為錯誤($?!=0), 則不執行cmd2
cmd1 || cmd2 若cmd1執行完畢且正確執行($?=0), 則不執行cmd2
若cmd1執行完畢且為錯誤($?!=0), 則執行cmd2

六、管道命令(pipe)     

    管道命令: “|”僅能出來經由前面一個命令傳來的正確信息,也就是standard output的信息,對於stdandard error並沒有直接處理的能力。在每個管道后面接的第一個數據必定是“命令”, 而且這個命令必須要能夠接收standard input的數據才行,這樣的命令才可以是“管道命令”,如less,more, head, tail等都是可以接收standard input的管道命令。

    管道命令主要有兩個比較需要注意的地方:

     管道命令必須要能夠接收來自前一個命令的數據成為standard input繼續處理才行

     管道命令僅會處理standard output, 對於standard error output會予以忽略

 

  2、選取命令: cut, grep

    a、cut命令將一段信息的某一段“切”出來,處理的信息以“行”為單位。

      cut -d '分隔字符' -f fields

      cut -c 字符范圍

     參數:

      -d: 后面接分隔字符, 與-f一起使用

      -f: 依據-d的分隔字符將一段信息切割成為數段,用-f取出第幾段的意思

      -c: 以字符的單位取出固定字符區間

    b、 grep:分析一行信息,若當中有我們所需要的信息,就將該行拿出來,簡單的語法是這樣的

        grep [-acinv] [--color=auto] '查找字符串' filename

        參數:

          -a: 將binary文件以text文件的方式查找數據

          -c: 計算找到‘查找字符串’的次數

          -i: 忽略大小寫的不同,所以大小寫視為相同

          -n: 順便輸出行號

          -v: 反向選擇,即顯示出沒有‘查找符號’內容的那一行

          --color=auto: 可以將找到的關鍵字部分加上顏色顯示

   

  3、排序命令:sort, wc, uniq

    a、sort: 幫我們進行排序,而且可以依據不同的數據類型來排序。例如數字與文字的排序就不一樣。此外排序的字符與語系的編碼有關。

    sort [-fbMnrtuk] [file or stdin]

    參數:

      -f: 忽略大小寫的差異, 例如A與a視為編碼相同

      -b: 忽略最前面的空格符部分

      -M: 以月份的名字來排序,例如JAN, DEC等的排序方法

      -n: 使用“純數字”進行排序(默認是以文字類型排序)

      -r: 反向排序

      -u: 就是uniq,相同的數據中,僅出現一行代表

      -t: 分隔符, 默認是用【tab】鍵來分隔

      -k: 以那個區間(field)來進行排序的意思

    例如: /etc/passwd 內容以: 來分隔,我想以第三列來排序

        cat /etc/passwd | sort -t ':' -k 3

 

  b、uniq

    uniq [-ic]

    參數: 

      -i: 忽略大小寫字符的不同

      -c: 進行計數

  c、 wc

    wc [-lwm]

    參數: 

      -l: 僅列出行

      -w: 僅列出多少字(英文單字)

      -m: 多少字符

    

  3、雙向重定向: tee

    tee會同時將數據流送與文件與屏幕(screen);而輸出到屏幕的,其實就是stdout,可以讓下個命令繼續處理:

    tee [-a] file

    參數:

      -a: 以累加的方式, 將數據加入file當中

     如: ls -l /home | tee ~/homefile | more

        將ls 的數據存一份到~/homefile,同時屏幕也有輸出信息

 

   4、字符轉換命令: tr, col, join, paste, expand

      a、 tr: 可以用來刪除一段信息當中的文字, 或者是進行文字信息的替換

        tr [-ds] SET1 ...

       參數: 

        -d: 刪除信息當中的SET1這個字符串

        -s: 替換掉重復的字符   

       例: 將last輸出的信息中所有的小寫字符變成大寫字符

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

      b、 col: 可以用來進行簡單處理,如將【tab】按鍵替換成為空格鍵

        

        col [-xb]

        參數: 

          -x: 將tab鍵轉換成對等的空格鍵

          -b: 在文字內有反斜杠(/)時, 僅保留反斜杠最后接的那個字符

 

      c、join : 將兩個文件當中有相同數據的那一行加在一起。

        jion [-ti12] file1 file2

        參數:

          -t: join默認以空格符分隔數據,並且對比“第一個字段”的數據

          -i: 忽略大小寫的差異

          -1: 這個是數字的1, 代表第一個文件要用哪個字段來分析的意思

          -2: 代表第二個文件要用哪個字段來分析的意思

        例: /etc/passwd的第四個字段是GID, 那個GID記錄在/etc/group當中的第三個字段,以GID整合兩個文件

     join -t ':' -1 4 /etc/passwd -2 3 /etc/group

   注意: 在使用join之前,你所需要處理的文件應該要先經過排序(sort)處理,否則有些對比的項目會被略過。

      d、 paste: 介質將兩行貼在一起,且中間以【tab】鍵隔開而已

      paste [-d] file1 file2

      參數:

        -d: 后面可以接分隔字符,默認是以【tab】來分隔

        -: 如果file部分寫成-, 表示來自standard iput的數據的意思

 

      e、 expand:  將【tab】按鍵轉成空格鍵, 可以這樣做:

        expand [-t] file

        參數: 

          -t: 后面可以接數字。一般來說,一個【tab】按鍵可以用8個空格鍵替換,我們也可以自行定義一個【tab】代表多少個字符

      注: unexpand: 將空白轉成【tab】命令

 

    5、切割命令:split

      如果你有文件太大,導致一些攜帶式設備無法復制的問題。split可以將一個大文件依據文件大小或行數來切割成為小文件。

    split [-bl] file PREFIX

    參數:

      -b: 后面可接欲切割的文件大小,可加單位,例如b,k, m等

      -l: 以行數來進行切割

      PREFIX: 可作為切割文件的前導文字

    6、參數代換: xargs

      產生某個命令的參數的意思。xargs可以讀入stdin的數據,並且以空格符或斷行字符進行分辨,將stdin的數據分隔成為arguents。

      xargs [-0epn] command

      -0: 如果輸入的stdini含有特殊字符, 例如`, \, 空格鍵字符時, 這個參數可以將它還原成一般字符。這個參數可以用於特殊狀態

      -e: 這個是EOF(end of file)的意思。后面可以接一個字符串,當xargs分析到這個字符串時,就會停止繼續工作

      -p: 在執行每個命令的參數時, 都會詢問用戶的意思

      -n: 后面接次數,每次command命令執行時, 要使用幾個參數的意思

      當xargs后面沒有接任何的命令時, 默認是以echo來進行輸出

    例如:  將/etc/passwd內的第一列取出,僅取三行, 使用finger這個命令將每個賬號內容顯示出來

      cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs finger

 

    7、關於減號-的用途

      在管道命令中,經常會使用到前一個命令的stdout作為這次的stdin,某些命令需要用到文件名來進行處理時,該stdin與stdout可以利用減號“-”來替代,舉例如下:

      tar -cvf - /home | tar -xvf -

      將/home里面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout;經過管道后,將tar -cvf - /home傳送給后面的tar -xvf -后面的這個-則是取用前一個命令的stdout

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM