三劍客詳解

Dusk_Yun發表於2024-08-17

一、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

相關文章