一、grep基本使用
語法結構:模糊過濾查詢內容
grep '查詢的內容' file
cat file | grep '查詢螢幕上輸出的內容'
參考選項:
r:遞迴過濾檔案的內容
v:取反
w:過濾單詞,以空格分割,精確匹配
i:不區分大小寫
n:過濾到內容的具體行號
c:統計單詞次數
o:檢視匹配過程
E:支援擴充套件正則
A:顯示查詢內容的下N行
B:顯示查詢內容的上N行
C:顯示查詢到內容上下各N行
二、sed
作用:替換
- 內容查詢替換
- 增加內容
- 替換內容
- 刪除內容
- 格式化輸出,反向引用
語法結構:
1、基礎常用:
grep '找誰' file
sed -n '/找誰/動作' file # 模糊過濾,預設輸出所有內容 -n:只列印查詢到內容;預設輸出全部
動作:p--輸出查詢到的內容;d--刪除查詢到內容的行
sed -n 'np' file # 列印輸出第n行的資料
sed 選項引數:-n 取消預設輸出
sed 's#替換誰#替換成誰#g' 替換
2、模糊過濾:
sed -n '/過濾到內容/p' file
sed -n '/開始/,/結束/p' file
引數選項:-r--->支援擴充套件正則
3、sed刪除
sed '3d' file
sed '//d' file
4、sed增加內容
sed '3a 內容' file 在第3行的下面插入內容
sed '3i 內容' file 在第3行處插入內容
sed '3c 內容' file 替換整行內容 (寫shell使用系統最佳化)
sed '3w 1.txt' file 將第3行的內容儲存到檔案中
sed -i '3c 內容' file 將會直接執行(因為有i)
5、sed反向引用
sed 's#()#\1#g' file
案例:
【資料準備】
[root@web01 ~]# head -5 /etc/passwd > test.txt
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1、按照行查詢內容
[root@web01 ~]# sed -n '3p' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2、輸出檔案的2-4行
[root@web01 ~]# sed -n '2,4p' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
3、輸出檔案的最後一行
[root@web01 ~]# sed -n '$p' test.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4、輸出檔案的3~最後一行
[root@web01 ~]# sed -n '3,$p' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5、處理其他命令的輸出
[root@web01 ~]# cat test.txt | sed -n '3p'
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@web01 ~]# ifconfig eth0|sed -n '2p'
inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255
6、刪除原始檔的內容
[root@web01 ~]# sed -i '2,4d' test.txt
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sed '3c 內容' file # 替換整行內容(寫shell使用系統最佳化)
[root@web01 ~]# sed '3c hehe' 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hehe
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8、支援正則,[:/]:表示:或者/或者:/
[root@web01 ~]# sed 's#[:/]# #g' test.txt
root x 0 0 root root bin bash
bin x 1 1 bin bin sbin nologin
daemon x 2 2 daemon sbin sbin nologin
root x 0 0 root root bin bash
adm x 3 4 adm var adm sbin nologin
lp x 4 7 lp var spool lpd sbin nologin
9、反向代理
[root@web01 ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (10.0.0.200) net.*s#\1#g'
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
[root@web01 ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (10.0.0.200) net.*$#\1#g'
10.0.0.200
常用方式:
# 過濾區間範圍進行統計,過濾時間日誌進行切割
# 需求:統計最近2小時的日誌或者過濾昨天一天的日誌
1)日誌切割
mv access.log 2023-10-10-access.log
mv access.log 2020-10-11-access.log
2)取區間範圍統計
[root@oldboy ~]# sed -n '/2023:03:25:14/,/2023:04L00L10/p' access.log
知識點小結:
sed引數選項:
-i 修改原始檔
-r 支援擴充套件正則
-n 取消預設輸出
1.指定行
sed -n '3p' file
sed -n '3,5p' file 區間
2.模糊過濾
sed -n '//p' file
sed -n '//,//p' file
3.sed刪除
sed '3d' file
sed '2,5d' file
sed '//,//d' file
4.sed增加
sed '3c 內容' file
sed '3a' '3i' '3w'
5.sed替換 支援正則 []
sed 's###g' file
sed 's@@@g' file
模式+動作
sed '2s###g' file # 只替換第2行的內容
6.後向引用想要誰就把誰保護起來()
sed -r 's#()()()#\2#g'
使用sed的動作分隔獲取不連續的行
sed -n '2p;4p' test.txt
三、awk基本使用
作用:
- 取行
- 取列
- 運算
- 支援判斷,迴圈,陣列,shell程式設計
- 格式化輸出,配合sort、uniq、head使用
語法結構:
awk '找誰' file
查詢指定的行:awk 'NR==3' file
模糊查詢:awk '/查詢內容/' file
區間:awk '//,//' file
比較表示式:awk '$1=="root"' file
awk '{print $1}' file
awk '找誰{print $1}' file
awk的內建變數
1)NR 儲存著每行的行號
NR==3
NR!=3
NR>3
NR>=3
NR<3
NR<=3
並且:&&
或者:||
2)$0儲存著每行的內容 三劍客處理資料都是按行處理
3),逗號 儲存著空格
4)NF 存著最後一列的列號
注意:在awk的動作中所有的字串都視作變數
awk運算:
BEGIN:讀取檔案之前做的動作
END:讀取完檔案之後做的動作
案例:
【準備環境】
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 1、檢視第三行
[root@web01 ~]# awk 'NR==3' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 2、以冒號分割出最後一列
[root@web01 ~]# awk -F ":" '{print $7}' test.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
# 檢視檔案
[root@web01 ~]# cat 3.txt
root:x:0:0:root:/root:/bin/bash
熊大 100 zs 20
# BEGIN和END都是讀取檔案之前或者之後的動作都對檔案不會有影響,但是{print "ok"}就不一樣了,這屬於有幾行執行幾次
[root@oldboy ~]# awk 'BEGIN{print "開始"}{print "ok"}END{print "error"}' 3.txt
開始
ok
ok
error
[root@oldboy ~]# awk 'BEGIN{print "OK"}'
OK
[root@oldboy ~]# awk 'BEGIN{print 10+10}'
20