四劍客
在Shell程式設計工具中,四劍客工具的使用更加的廣泛,Shell程式設計四劍客包括:find、sed、grep、awk,熟練掌握四劍客會對Shell程式設計能力極大的提升。
四劍客之Find工具實戰,Find工具主要用於作業系統檔案、目錄的查詢,其語法引數格式為:
find path -option [ -print ] [ -exec -ok command ] { } \;
其option常用引數詳解如下:
-name filename #查詢名為filename的檔案;
-type b/d/c/p/l/f #查是塊裝置、目錄、字元裝置、管道、符號連結、普通檔案;
-size n[c] #查長度為n塊[或n位元組]的檔案;
-perm #按執行許可權來查詢;
-user username #按檔案屬主來查詢;
Find工具-name引數案列:
find /data/ -name “*.txt” #查詢/data/目錄以.txt結尾的檔案;
find /data/ -name “[A-Z]*” #查詢/data/目錄以大寫字母開頭的檔案;
find /data/ -name “test*” #查詢/data/目錄以test開頭的檔案;
Find工具-type引數案列:
find /data/ -type d #查詢/data/目錄下的資料夾;
find /data/ ! -type d #查詢/data/目錄下的非資料夾;
find /data/ -type l #查詢/data/目錄下的連結檔案。
find /data/ -type d|xargs chmod 755 -R #查目錄型別並將許可權設定為755;
find /data/ -type f|xargs chmod 644 -R #查檔案型別並將許可權設定為644;
Find工具-size引數案列:
find /data/ -size +1M #查檔案大小大於1Mb的檔案;
find /data/ -size 10M #查檔案大小為10M的檔案;
find /data/ -size -1M #查檔案大小小於1Mb的檔案;
02Shell程式設計四劍客之SED
SED是一個非互動式文字編輯器,它可對文字檔案和標準輸入進行編輯,標準輸入可以來自鍵盤輸入、文字重定向、字串、變數,甚至來自於管道的文字,與VIM編輯器類似,它一次處理一行內容,Sed可以編輯一個或多個檔案,簡化對檔案的反覆操作、編寫轉換程式等。
在處理文字時把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),緊接著用SED命令處理緩衝區中的內容,處理完成後把緩衝區的內容輸出至螢幕或者寫入檔案。
逐行處理直到檔案末尾,然而如果列印在螢幕上,實質檔案內容並沒有改變,除非你使用重定向儲存輸出或者寫入檔案。其語法引數格式為:
sed [-Options] [‘Commands’] filename;
sed工具預設處理文字,文字內容輸出螢幕已經修改,但是檔案內容其實沒有修改,需要加-i引數即對檔案徹底修改;
x #x為指定行號;
x,y #指定從x到y的行號範圍;
/pattern/ #查詢包含模式的行;
/pattern/pattern/ #查詢包含兩個模式的行;
/pattern/,x #從與pattern的匹配行到x號行之間的行;
x,/pattern/ #從x號行到與pattern的匹配行之間的行;
x,y! #查詢不包括x和y行號的行;
r #從另一個檔案中讀檔案;
w #將文字寫入到一個檔案;
y #變換字元;
q #第一個模式匹配完成後退出;
l #顯示與八進位制ASCII碼等價的控制字元;
常用SED工具企業演練案列:
替換jfedu.txt文字中old為new:
sed ‘s/old/new/g’ jfedu.txt
列印jfedu.txt文字第一行至第三行:
sed -n ‘1,3p’ jfedu.txt
列印jfedu.txt文字中第一行與最後一行:
sed -n ‘1p;$p’ jfedu.txt
刪除jfedu.txt第一行至第三行、刪除匹配行至最後一行:
sed ‘1,3d’ jfedu.txt
sed ‘/jfedu/,$d’ jfedu.txt
刪除jfedu.txt最後6行及刪除最後一行:
for i in `seq 1 6`;do sed -i ‘$d’ jfedu.txt ;done
sed ‘$d’ jfedu.txt
刪除jfedu.txt最後一行:
sed ‘$d’ jfedu.txt
通常而言,SED將待處理的行讀入模式空間,指令碼中的命令逐行進行處理,直到指令碼執行完畢,然後該行被輸出,模式空間請空;然後重複剛才的動作,檔案中的新的一行被讀入,直到檔案處理完備。
如果使用者希望在某個條件下指令碼中的某個命令被執行,或者希望模式空間得到保留以便下一次的處理,都有可能使得sed在處理檔案的時候不按照正常的流程來進行。這時可以使用SED高階語法來滿足使用者需求。總的來說,SED高階命令可以分為三種功能:
N、D、P:處理多行模式空間的問題;
H、h、G、g、x:將模式空間的內容放入儲存空間以便接下來的編輯;
:、b、t:在指令碼中實現分支與條件結構。
在jfedu.txt每行後加入空行,也即每行佔永兩行空間,每一行後邊插入一行空行、兩行空行及前三行每行後插入空行:
sed ‘/^$/d;G’ jfedu.txt
sed ‘/^$/d;G;G’ jfedu.txt
sed ‘/^$/d;1,3G;’ jfedu.txt
將jfedu.txt偶數行刪除及隔兩行刪除一行:
sed ‘n;d’ jfedu.txt
sed ‘n;n;d’ jfedu.txt
在jfedu.txt匹配行前一行、後一行插入空行以及同時在匹配前後插入空行:
sed ‘/jfedu/{x;p;x;}’ jfedu.txt
sed ‘/jfedu/G’ jfedu.txt
sed ‘/jfedu/{x;p;x;G;}’ jfedu.txt
在jfedu.txt每行後加入空行,也即每行佔永兩行空間,每一行後邊插入空行:
sed ‘/^$/d;G’ jfedu.txt
在jfedu.txt每行後加入空行,也即每行佔永兩行空間,每一行後邊插入空行:
sed ‘/^$/d;G’ jfedu.txt
在jfedu.txt每行前加入順序數字序號、加上製表符\t及.符號:
sed = jfedu.txt| sed ‘N;s/\n/ /’
sed = jfedu.txt| sed ‘N;s/\n/\t/’
sed = jfedu.txt| sed ‘N;s/\n/\./’
刪除jfedu.txt行前和行尾的任意空格:
sed ‘s/^[ \t]*//;s/[ \t]*$//’ jfedu.txt
列印jfedu.txt關鍵詞old與new之間的內容:
sed -n ‘/old/,/new/’p jfedu.txt
列印及刪除jfedu.txt最後兩行:
sed ‘$!N;$!D’ jfedu.txt
sed ‘N;$!P;$!D;$d’ jfedu.txt
合併上下兩行,也即兩行合併:
sed ‘$!N;s/\n/ /’ jfedu.txt
sed ‘N;s/\n/ /’ jfedu.txt
03Shell程式設計四劍客之AWK
AWK是一個優良的文字處理工具,Linux及Unix環境中現有的功能最強大的資料處理引擎之一,以Aho、Weinberger、Kernighan三位發明者名字首字母命名為AWK,AWK是一個行級文字高效處理工具,AWK經過改進生成的新的版本有Nawk、Gawk,一般Linux預設為Gawk,Gawk是 AWK的GNU開源免費版本。
AWK基本原理是逐行處理檔案中的資料,查詢與命令列中所給定內容相匹配的模式,如果發現匹配內容,則進行下一個程式設計步驟,如果找不到匹配內容,則 繼續處理下一行。其語法引數格式為,AWK常用引數、變數、函式詳解如下:
awk ‘pattern + {action}’ file
AWK基本語法引數詳解:
單引號’ ‘是為了和shell命令區分開;
大括號{ }表示一個命令分組;
pattern是一個過濾器,表示匹配pattern條件的行才進行Action處理;
action是處理動作,常見動作為Print;
使用#作為註釋,pattern和action可以只有其一,但不能兩者都沒有。
AWK內建變數詳解:
FS 分隔符,預設是空格;
OFS 輸出分隔符;
NR 當前行數,從1開始;
NF 當前記錄欄位個數;
$0 當前記錄;
$1~$n 當前記錄第n個欄位(列)。
常用AWK工具企業演練案列:
AWK列印硬碟裝置名稱,預設以空格為分割:
df -h|awk ‘{print $1}’
AWK以空格、冒號、\t、分號為分割:
awk -F ‘[ :\t;]’ ‘{print $1}’ jfedu.txt
AWK以冒號分割,列印第一列,同時將內容追加到/tmp/awk.log下:
awk -F: ‘{print $1 >>”/tmp/awk.log”}’ jfedu.txt
列印jfedu.txt檔案中的第3行至第5行,NR表示列印行,$0表示文字所有域:
awk ‘NR==3,NR==5 {print}’ jfedu.txt
awk ‘NR==3,NR==5 {print $0}’ jfedu.txt
列印jfedu.txt檔案中,長度大於80的行號:
awk ‘length($0)>80 {print NR}’ jfedu.txt
AWK引用Shell變數,使用-v或者雙引號+單引號即可:
awk -v STR=hello ‘{print STR,$NF}’ jfedu.txt
STR=”hello”;echo| awk ‘{print “‘${STR}'”;}’
Awk統計伺服器狀態連線數:
netstat -an | awk ‘/tcp/ {s[$NF]++} END {for(a in s) {print a,s[a]}}’
netstat -an | awk ‘/tcp/ {print $NF}’ | sort | uniq -c
04Shell程式設計四劍客之GREP
全面搜尋正則表示式(Global search regular expression(RE) ,GREP)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。
Unix/Linux的grep家族包括grep、egrep和fgrep,其中egrep和fgrep的命令跟grep有細微的區別,egrep是grep的擴充套件,支援更多的re元字元, fgrep是fixed grep或fast grep簡寫,它們把所有的字母都看作單詞,正則表示式中的元字元表示其自身的字面意義,不再有其他特殊的含義,一般使用比較少。
目前Linux作業系統預設使用GNU版本的grep。它功能更強,可以透過-G、-E、-F命令列選項來使用egrep和fgrep的功能。其語法格式及常用引數詳解如下:
grep -[acinv] ‘word’ Filename
Grep常用引數詳解如下:
-a 以文字檔案方式搜尋;
-c 計算找到的符合行的次數;
-i 忽略大小寫;
-n 順便輸出行號;
學習Grep時,需要了解萬用字元、正則表示式兩個概念,很多讀者容易把彼此搞混淆,萬用字元主要用在Linux的Shell命令中,常用於檔案或者檔名稱的操作,而正則表示式用於文字內容中的字串搜尋和替換,常用在AWK、GREP、SED、VIM工具中對文字的操作。
萬用字元型別詳解:
* 0個或者多個字元、數字;
? 匹配任意一個字元;
# 表示註解;
| 管道符號;
;多個命令連續執行;
正則表示式詳解:
* 前一個字元匹配0次或多次;
. 匹配除了換行符以外任意一個字元;
.* 代表任意字元;
^ 匹配行首,即以某個字元開頭;
$ 匹配行尾,即以某個字元結尾;
\(..\) 標記匹配字元;
[] 匹配中括號裡的任意指定字元,但只匹配一個字元;
[^] 匹配除中括號以外的任意一個字元;
常用GREP工具企業演練案列:
grep -c “test” jfedu.txt 統計test字元總行數;
grep -i “TEST” jfedu.txt 不區分大小寫查詢TEST所有的行;
grep -n “test” jfedu.txt 列印test的行及行號;
grep -v “test” jfedu.txt 不列印test的行;
grep “test[53]” jfedu.txt 以字元test開頭,接5或者3的行;
grep “^[^test]” jfedu.txt 顯示輸出行首不是test的行;
grep “[Mm]ay” jfedu.txt 匹配M或m開頭的行;
grep “K…D” jfedu.txt 匹配K,三個任意字元,緊接D的行;
關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。