SHELL用法八(Grep語句)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM