iT邦幫忙

2021 iThome 鐵人賽

DAY 3
1
Software Development

系統與服務雜談系列 第 3

grep - 2 用更多Option

上篇的例子都是找檔案
這次玩一下command | grep [option] pattern

dpkg -l | grep -i "python"

https://ithelp.ithome.com.tw/upload/images/20210907/201049301EyUh1JIJT.png

利用dpkg -l列出所有安裝的deb package, 然後透過管線傳給grep -i python
-i 表示忽略大小寫

find . -name "*.png"  | grep -i "ithome"

https://ithelp.ithome.com.tw/upload/images/20210907/20104930NdqiqbVHmn.png

想準確搜尋amd

dpkg -l | grep -i "amd"

https://ithelp.ithome.com.tw/upload/images/20210917/20104930LFk3vt213Z.png
會發現amd64這樣也被找出來, 但其實我們要的不是這些.
這時利用-w找到字串的完整匹配,
就是並非是字串中間有出現該字就算, 而是要字面本身就等於搜尋字串

dpkg -l | grep -iw "amd"

https://ithelp.ithome.com.tw/upload/images/20210917/20104930aBapmMGWpk.png

利用find找出當前目錄下所有檔名結尾是.png的檔案, 透過管線傳給grep -i "ithome"
找出檔名有ithome的png檔案.

有時候會想要查詢, 匹配到的該行的前後幾行, 查看日誌時總是如此
這時能搭配-Aafter , -Bbefore

# 準備假資料
cat > grepText.txt <<EOF
10
11
12
13 ithome
14
15
EOF

cat grepText.txt| grep -A 1 -B 2 "ithome" 

https://ithelp.ithome.com.tw/upload/images/20210907/20104930v75hYyH1sQ.png
我們把匹配到ithome該行的後1行與前2行, 也一起顯示出來

還有一種是-C, 把匹配到該行為中心點, 前後都顯示出來

cat grepText.txt| grep -C 1 "ithome"

https://ithelp.ithome.com.tw/upload/images/20210907/20104930UYOBlf6E32.png

計算匹配項的總數, 搭配-c, 這很類似於wc這指令

ip addr | grep -c inet6 

https://ithelp.ithome.com.tw/upload/images/20210907/20104930HXef7BCEhD.png
計算出有幾組ipv6的ip

顯示匹配行的行號, 搭配-n

cat grepText.txt| grep -n "ithome"

https://ithelp.ithome.com.tw/upload/images/20210908/20104930MzKozir01d.png
最前面的4:表示是該文件的第4行

想準確知道該匹配字串出現多少次, 而不是算出匹配多少行
可以搭配-o only-matching

# 準備假資料
cat > grepText.txt <<EOF          
10
11
12 ITHOME HOME   
13 ithome home
14thITHOME
15
EOF
echo "有-o"
cat grepText.txt| grep -o "home" | wc -l
echo "沒-o"
cat grepText.txt| grep  "home" | wc -l

https://ithelp.ithome.com.tw/upload/images/20210908/20104930F6XmWexO0b.png
可以看到-o的匹配到2次,因為同一行出現2次, 都會納入計算
-o的, 就是該行匹配到第一次, 就沒納入計算了

反向匹配-vinvert-match
這個我蠻常用的, 用來過濾一些訊息

cat grepText.txt| grep -vin "ithome"

https://ithelp.ithome.com.tw/upload/images/20210908/20104930nWoSdJMsUj.png
這裡就把沒匹配到ithome(不分大小寫)的行給顯示出來, 並顯示行號

本日小結

grep提供非常多option, 各種組合下, 基本可應付各種場景.
我自己蠻常是查找日誌內, 有沒有我不知道的錯誤訊息類型, 我就會透過-v做反向表列.

Question

能否用grep, 去取得https://ithelp.ithome.com.tw/2021ironman這網頁的內容裡面,
有多少筆鐵人參賽者門的文章連結呢?

Ans:

curl -X GET https://ithelp.ithome.com.tw/2021ironman |  grep -c "https://ithelp.ithome.com.tw/articles/"
> 30

上一篇
grep簡介
下一篇
grep - 3 Regex搭配淺談
系列文
系統與服務雜談32

尚未有邦友留言

立即登入留言