shell腳本之工具

        在學習了shell腳本的基本語法,命令,符號之後,接下來要看的就是shell腳本使用的所有工具了。

        在shell腳本中,工具的使用簡化了所要編寫的代碼。接下來就介紹幾個shell下經常使用的工具。

    1、sort

    sort工具的常用語法就是將文件的每一行作爲一個單位,相互比較,比較原則是從首字符向後,依次按ASCII碼值進行比較,默認是升序。

    sort工具常用的一些選項:

  • -r選項:將文件按降序排列;
  • -u選項:它的作用很簡單,就是在輸出行中去除重複行;
  • -n選項:以數值來排序;

  • -t選項:可以設定間隔符;
  • -k選項:指定了間隔符之後,就可以用-k來指定列數進行排序;
  • -f選項:會將小寫字母都轉換爲大寫字母來進行比較,亦即忽略大小寫;
  • -c選項:會檢查文件是否已排好序,如果亂序,則輸出第一個亂序的行的相關信息,最後返回1
  • -C選項:會檢查文件是否已排好序,如果亂序,不輸出內容,僅返回1
  • -b選項:會忽略每一行前面的所有空白部分,從第一個可見字符開始

  

    2、uniq

    uniq工具作用效果是爲消除相鄰的重複行,如果重複行不再相鄰的位置,就不會消除,因此,uniq工具一般與sort工具聯合使用。


    uniq工具常用的一些選項:

  • -c選項: 顯示輸出中,在每行行首加上本行在文件中出現的次數。它可取代-u和-d選項。
  • -d選項: 只顯示重複行
  • -u選項: 只顯示文件中不重複的各行。

 

   uniq工具的應用:求兩個文件的交集、並集、補集。


 3、paste

      paste單詞的字面意思是粘貼。該命令主要用來將多個文件的內容合併。paste工具按行將不同文件行信息放在一行。缺省情況下, paste連接時,用空格或tab鍵分隔新行中不同文本。

      通常我們把一行稱爲一條文本記錄,每一行有多少列由列分隔符決定;按照列分隔符可以將一行分爲多個域;進行行列劃分時,應該考慮兩個因素:行分隔符和列分隔符;行分隔符一般有\n,列分隔符爲空格,tab

  

     paste工具的常用選項:

  •     -d選項: 指定域分隔符;
  •     -s選項: 將每個文件合併成行而不是按行粘貼

   

   

    - 確實是該命令的一個選項。對每一個(-),從標準輸入中讀一次數據。默認使用空格或者tab作域分隔符,該選項可以定製輸出格式。

   4、cut

     cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。 如果不指定 File 參數,
     cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一。

  • -b選項 :以字節爲單位進行分割
  • -c 選項:以字符爲單位進行分割。

     

     對於英文字符-c和-b差別不大,但對於漢字類的字符差別就出來了

      

     用-c則會以字符爲單位,輸出正常;而-b只會以字節(8位二進制位)來計算,輸出就是亂碼。這裏的字符,不是我們C當中的佔有一個字節的字符!可以簡單理解成,漢字是由多個字節組成的多字節字符!
  • -d 選項:自定義分隔符,默認爲製表符。
  • -f 選項:與-d一起使用,指定顯示哪個區域。
    

 5、xargs(***)

      xargs命令是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它擅長將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令參數xargs也可以將單行或多行文本輸入轉換爲其他格式,例如多行變單行,單行變多行。xargs的默認命令是echo,空格是默認定界符。這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構建單行命令的重要組件之一。

       xargs工具的使用:

  • 默認是對文件進行格式化輸出,將多行輸入轉成單行輸出;
  • -n選項:指定列數,並多行輸出
  • -d選項: 自定義一個域分隔符,將特定列打散,並指定格式輸出

  

     將格式化的字符串作爲命令行參數傳遞給其他命令,組裝完成批量任務。


      xargs的一個選項-I,使用-I指定一個替換字符串{},這個字符串在xargs擴展時會被替換掉,當-I與xargs結合使用,每一個參數命令都會被執行一次.

      

     Ls / |xargs -I {} touch {}.log   創建ls下的所有文件並且以.log結尾
    -print0 :不再按照空格等字符作爲文件名結束標誌,而變成以NULL結尾。
    -0:告訴xargs,給xargs傳參的字符不以空格爲結束標誌

   6、grep

 grep工具的常用選項:

  • -V 顯示不匹配的
  • -r/R  遞歸方式搜索
  • -q 安靜模式匹配
  •  -i  忽略大小寫
  • -n 顯示匹配結果以及匹配結果的行號
  • -o: 只輸出文件中匹配到的部分

  7、sed(*****)

       sed是一種流編輯器,它是文本處理中功能很強大的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space)接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。

       簡單來說,sed就是一個按行處理文件的文本編輯器。對每一行先進行正則匹配,再進行相應的處理,匹配失敗就不用進行處理。

       sed默認按照Basic規範基本匹配!

     (1)sed工具的命令格式

  • sed [options] 'command'  file(s)
  • sed [options]  -f  scriptfile  file(s)

     (2)基本使用

  • Sed   /pattern/p: 打印匹配pattern和不匹配的行  (/pattern/:正則表達式)
  • Sed  -n  /pattern/p: 打印匹配pattern的行 ,不顯示未匹配的行

    

      在使用p命令需要注意,sed是把待處理文件的內容連同處理結果一起輸出到標準輸出的,因此p命令表示除了把文件內容打印出來之外還額外打印一遍匹配pattern的行 ,要想只輸出處理結果,應加上-n選項,這種用法相當於grep命令。

  • Sed   /pattern/d: 刪除匹配pattern的行

    

       sed命令不會修改原文件,刪除命令只表示某些行不打印輸出,而不是從原文件中刪去。 如果要影響源文件,需要使用-i 選項。

    

  •  sed   /pattern/s/pattern1/pattern2/: 查找符合pattern的行,將該行第一個匹配pattern1的字符串替換爲pattern2
  • sed   /pattern/s/pattern1/pattern2/g:查找符合pattern的行,將該行所有匹配pattern1的字符串替換爲pattern2
    

       同樣是替換,帶g或者不帶g有什麼區別?

    

    已匹配字符串標記&,可以表示匹配pattern1之後的所有字符。子串匹配標記\1,\2...\n

    \(..\) 用於匹配子串,對於匹配到的第一個子串就標記爲\1,依此類推匹配到的第二個結果就是\2,我們通過對標籤進行重組,從而完成數據逆置。

  • 定址
      定址用於決定對哪些行進行編輯。地址的形式可以是數字、正則表達式、或二者的結合。如果沒有指定地址,sed將處理輸入文件的所有行.    

  •     退出狀態

    

      sed不像grep一樣,不管是否找到指定的模式,它的退出狀態都是0。只有當命令存在語法錯誤時,sed的退出狀態纔不是0。

      Sed 不能用if判斷,而grep可以使用if判斷退出碼。

8、模式空間/保持空間

         sed在正常情況下,將處理的行讀入模式空間(pattern space),腳本中的“sed-command(sed命令)”就一條接着一條進行處理,直到腳本執行完畢。然後該行被輸出,模式(pattern space)被清空;接着,在重複執行剛纔的動作,文件中的新的一行被讀入,直到文件處理完畢。 一般情況下,數據的處理只使用模式空間(patternspace),按照如上的邏輯即可完成主要任務。但是某些時候,使用通過使用保持空間(hold space),還可以帶來意想不到的效果。

模式空間:可以想成工程裏面的流水線,數據直接在它上面進行處理。

保持空間:可以想象成倉庫,我們在進行數據處理的時候,作爲數據的暫存區域。(只能存儲數據,而不能對數據進行處理和修改)

正常情況下,如果不顯示使用某些高級命令,保持空間不會使用到!

sed高級命令

  • g: 將hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除
  • G: 將hold space中的內容append到pattern space\n後
  • h: 將pattern space中的內容拷貝到hold space中,原來的hold space裏的內容被清除
  • H:將pattern space中的內容append到hold space\n後
  • d: 刪除pattern中的所有行,並讀入下一新行到pattern中
  • D: 刪除multiline pattern中的第一行,不讀入下一行
  • x:交換保持空間和模式空間的內容
  • N:將下一行添加到pattern space中
  • n:讀取下一行到pattern space

   測試用例:

    1>給每行結尾添加一行空行

    2>用sed模擬出tac的功能(倒序輸出)

   

    3>追加匹配行到文件尾

    4>行列轉化

   

   5>打印奇數行/偶數行

   

    6>求1~100的求和


9、awk(*****)

       sed以行爲單位處理文件,awk比sed強的地方在於不僅能以行爲單位還能以列爲單位處理文件awk缺省的行分隔符是換行,缺省的列分隔符是連續的空格和Tab,但是行分隔符和列分隔符都可以自定義,比如/etc/passwd文件的每一行有若干個字段,字段之間以:分隔,就可以重新定義awk的列分隔符爲:並以列爲單位處理這個文件。

      行分隔符:記錄分隔符
      列分隔符:域分隔符

      awk實際上是一門很複雜的腳本語言,還有像C語言一樣的分支和循環結構,但是基本用法和sed類似,awk命令行的基本形式爲:

    awk option 'script' file1 file2 ... awk option -f scriptfile file1 file2 ... 

       和sed一樣,awk處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,編輯命令可以直接當命令行參數傳入,也可以用-f參數指定一個腳本文件,編輯

  命令的格式爲:

  • /pattern/{actions}
  • condition{actions}

       和sed類似,pattern是正則表達式,actions是一系列操作。awk程序一行一行讀出待處理文件,如果某一行與pattern匹配,或者滿足condition條件,則執行相應的actions,如果一條awk命令只 有actions部分,則actions作用於待處理文件的每一行。

         其實,awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

  awk定製輸入輸出分隔符

  awk默認按照空格作爲分隔符,如果想定製分隔符,常用的方法是使用-F 選項  

  echo "hello:world" | awk -F:  '{print $1}'  hello   以:爲分隔符

   -F 可以支持多種符號進行定製分隔符

   測試用例:

  • awk '{print $0}' file    讀取一條記錄
  • awk '{print $1}' file     第一個域
  • awk '{print $2}' file     第二個域
  • awk '{print $NF}' file     最後一個域   $(NF-1)  倒數第二個域

   BEGIN&END

       BEGIN和END,是awk中兩個極具特色的表達式,可以用他們做文本處理之前的準備工作,之後的收尾工具,極具實用價值,

 基本格式如下:

  • BEGIN{} /REG/{} END{}
  • BEGIN{} condition{} END{}
      任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變量和預置(初始化)變量,使用END來輸出最終結果。統計文本中,成績及格的人數,這裏awk中的變量,語法的使用要格外注意。全部類C!
  • echo "hello:world;hello#bit" | awk -F'[:;#]' '{print $1}'  hello
  • BEGIN & END
  • BEGIN{} /REG/{} END{}
  • BEGIN{} condition{} END{}
        BEGIN{} 裏的內容是在所有的文本處理之前進行,END{}裏面的內容是在所有的動作都完成之後才進行。兩個都進行且只進行一次。
  • awk  ‘BEGIN{count=0;}$2>=60{count++;}END{printf count}’ 統計合格人數

10、awk腳本

       awk出了上面的基本命令行的使用方式之外,還有awk腳本方式,不過基本寫法與命令行相同,語法也是基本類C。

      通過awk腳本,統計產品的檔次,85分以上,優。75~85,良。60~75,中。60分以下,差

     

   awk內置變量

  • ARGC: 命令行參數個數
  • ENVIRON: 支持隊列中系統環境變量的使用
  • FILENAME: awk瀏覽的文件名
  • FNR: 瀏覽文件的記錄數
  • FS: 設置輸入域分隔符,等價於命令行 -F選項
  • NF: 瀏覽記錄的域的個數
  • NR: 已讀的記錄數
  • OFS: 輸出域分隔符
  • ORS: 輸出記錄分隔符
  • RS: 控制記錄分隔符

11、find

       find命令在目錄結構中搜索文件,並執行指定的操作。

       find pathname -options [-print -exec -ok ...]  用於在文件樹種查找文件,並作出相應的處理(可能訪問磁盤)。

  • pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
  • -print: find命令將匹配的文件輸出到標準輸出。 其中print0 我們之前已經見過面了。
  • -exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {} \;,注意{}和\; 之間的空格。
  • -ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

find工具的常見選項:

  • -name: 按照文件名查找文件
  • -perm: 按照文件權限來查找文件。
  • -prune: 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。
  • -depth:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
  • -user: 按照文件屬主來查找文件。
  • -group: 按照文件所屬的組來查找文件。
  • -nogroup: 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在
  • -nouser: 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在
  • -newer file1 ! -newer file2: 查找更改時間比文件file1新但比文件file2舊的文件
  • -type: 查找某一類型的文件,例如:-b: 塊設備文件。
                                                       -d: 目錄。
                                                       -c: 字符設備文件。
                                                       -p: 管道文件。
                                                       -l: 符號鏈接文件。
                                                       -f: 普通文件。
                                                      -size n:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。

       Touch一個已經存在的文件,目錄不會做修改,而touch一個新的文件,相當於更新了目錄。

  • 查看內存信息:cat /proc/meminfo
  • 查看CPU信息:cat /proc/cpuinfo
  • 查看硬盤掛載情況:df  -h 

12、free

free 查看內存信息

-m 以MB爲單位查看內存, -k以KB爲單位
 -/+ buffers/cache 中的used=mem:used-buffers-cached;
-/+ buffers/cache 中的free=mem:free+buffers+cached;
Swap分區:交換空間,一般爲屋裏空間大小的兩倍,太大容易造成效率低下
讀cach,寫buffer
Buffers:緩衝區 
Cached:將文件的屬性cach起來
Wb 寫入緩衝區 ,安全性不高
 wt 寫穿透 ,直接寫入到硬盤。
Iostat -x  
進程的d狀態:表示硬盤的%util率爲100%





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