Shell四劍客實操案例

Shell四劍客實操案例

四劍客

在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的行;

關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。

Shell四劍客實操案例