在學習了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選項: 將每個文件合併成行而不是按行粘貼
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不像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{}
- echo "hello:world;hello#bit" | awk -F'[:;#]' '{print $1}' hello
- BEGIN & END
- BEGIN{} /REG/{} END{}
- BEGIN{} condition{} 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%