1、SHELL編程Grep語句案例實戰
1)Find是Linux操作系統文件和目錄的路徑檢索、查詢工具,而Grep是Linux系統下文本文件內容檢索或者匹配工具,Grep稱為全局正則表達式檢索工具,在企業中被廣泛的采用。
2)Grep工具的語法格式:
grep -option(參數) ‘word’(關鍵詞) file(文本文件);
Option參數:
-a(文本方式) -c(統計) -i(忽略大小寫) -n(行號) -v(反選) -o(僅匹配) -w(詞組) -A(匹配之后) -B(匹配之前) -C(匹配前后)
3)Grep企業案例實戰一,查找/etc/passwd文件中是否存在www用戶信息,命令操作如下:
grep root /etc/passwd grep "root" /etc/passwd grep -w "^root" /etc/passwd grep -i "root" /etc/passwd
4)Grep企業案例實戰二,ifconfig看到網卡信息,只查看IP地址所在行信息,命令操作如下:
ifconfig|grep netmask ifconfig|grep -w inet ifconfig|grep -w 255
ifconfig|grep -E "172|127"ifconfig|grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
#創建三個文件,並且往文件中分別寫入不同的代碼;
for i in `seq 1 3`;do touch jf$i.txt;echo jfedu jf$i >jf$i.txt;echo cat jf$i.txt;cat jf$i.txt;echo ----------;done
5)通配符類型詳解:
* 0個或者多個字符、數字; ? 匹配任意一個字符; # 表示注解; | 管道符號; ; 多個命令連續執行; & 后台運行指令; ! 邏輯運算非; [ ] 內容范圍,匹配括號中內容; { } 命令塊,多個命令匹配。
6)正則表達式詳解:
* 前一個字符匹配0次或多次; . 匹配除了換行符以外任意一個字符;.* 代表任意字符; ^ 匹配行首,即以某個字符開頭; $ 匹配行尾,即以某個字符結尾; \(..\) 標記匹配字符; [] 匹配中括號里的任意指定字符,但只匹配一個字符; [^] 匹配除中括號以外的任意一個字符; \ 轉義符,取消特殊含義; \< 錨定單詞的開始; \> 錨定單詞的結束; {n} 匹配字符出現n次; {n,} 匹配字符出現大於等於n次; {n,m} 匹配字符至少出現n次,最多出現m次; \w 匹配文字和數字字符,不匹配符號; \W \w的反置形式,匹配一個或多個非單詞字符,匹配 符號; \b 單詞鎖定符; \s 匹配任何空白字符; \d 匹配一個數字字符,等價於[0-9]。
7)常用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的行; grep "[A-Z][9]D" jfedu.txt 匹配大寫字母,緊跟9D的字符行; grep "T\{2,\}" jfedu.txt 打印字符T字符連續出現2次以上的行; grep "T\{4,6\}" jfedu.txt 打印字符T字符連續出現4次及6次的行; grep -n "^$" jfedu.txt 打印空行的所在的行號; grep -vE "#|^$" jfedu.txt 不匹配文件中的#和空行; grep --color -ra -E "db|config|sql" * 匹配包含db或者config或者 sql的文件; grep --color -E "\<([0-9]{1,3}\.){3}([0-9]{1,3})\>" jfedu.txt 匹配 IPV4地址
2、SHELL編程Awk語句案例實戰
Awk主要是用於對文本文件進行處理,通常是逐行處理,其語法參數格式為,AWK常用參數、變量、函數詳解如下:
awk 'pattern + {action}' file
(1) AWK基本語法參數詳解:
單引號' '是為了和shell命令區分開; 大括號{ }表示一個命令分組; pattern是一個過濾器,表示匹配pattern條件的行才進行Action處理; action是處理動作,常見動作為Print; 使用#作為注釋,pattern和action可以只有其一,但不能兩者都沒有。
(2) AWK內置變量詳解:
FS 分隔符,默認是空格; OFS 輸出分隔符; NR 當前行數,從1開始; NF 當前記錄字段個數; $0 當前記錄; $1~$n 當前記錄第n個字段(列)。
(3) AWK內置函數詳解:
gsub(r,s):在$0中用s代替r; index(s,t):返回s中t的第一個位置; length(s):s的長度; match(s,r):s是否匹配r; split(s,a,fs):在fs上將s分成序列a; substr(s,p):返回s從p開始的子串。
(4) AWK常用操作符,運算符及判斷符:
++ -- 增加與減少( 前置或后置); ^ ** 指數( 右結合性); ! + - 非、一元(unary) 加號、一元減號; + - * / % 加、減、乘、除、余數; < <= == != > >= 數字比較; && 邏輯and; || 邏輯or; = += -= *= /= %= ^= **= 賦值。
(5) AWK與流程控制語句:
if(condition) { } else { }; while { }; do{ }while(condition); for(init;condition;step){ }; break/continue。
常用AWK工具企業演練案列:
(1) AWK打印硬盤設備名稱,默認以空格為分割:
df -h|awk '{print $1}'
(2) AWK以空格、冒號、\t、分號為分割:
awk -F '[ :\t;]' '{print $1}' jfedu.txt
(3) AWK以冒號分割,打印第一列,同時將內容追加到/tmp/awk.log下:
awk -F: '{print $1 >>"/tmp/awk.log"}' jfedu.txt
(4) 打印jfedu.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域:
awk 'NR==3,NR==5 {print}' jfedu.txt awk 'NR==3,NR==5 {print $0}' jfedu.txt
5) 打印jfedu.txt文件中的第3行至第5行的第一列與最后一列:
awk 'NR==3,NR==5 {print $1,$NF}' jfedu.txt
6) 打印jfedu.txt文件中,長度大於80的行號:
awk 'length($0)>80 {print NR}' jfedu.txt
7) AWK引用Shell變量,使用-v或者雙引號+單引號即可:
awk -v STR=hello '{print STR,$NF}' jfedu.txt
STR="hello";echo| awk '{print "'${STR}'";}'
8) AWK以冒號切割,打印第一列同時只顯示前5行:
cat /etc/passwd|head -5|awk -F: '{print $1}'
awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
9) Awk指定文件jfedu.txt第一列的總和:
cat jfedu.txt |awk '{sum+=$1}END{print sum}'
10) AWK NR行號除以2余數為0則跳過該行,繼續執行下一行,打印在屏幕:
awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
11) AWK添加自定義字符:
ifconfig eth0|grep "Bcast"|awk '{print "ip_"$2}'
12) AWK與if組合實戰,判斷數字比較:
echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'
13) AWK與數組組合實戰,統計passwd文件用戶數:
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
14) awk分析Nginx訪問日志的狀態碼404、502等錯誤信息頁面,統計次數大於20的IP地址。
awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'
15) 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