上篇的例子都是找檔案
這次玩一下command | grep [option] pattern
dpkg -l | grep -i "python"
利用dpkg -l
列出所有安裝的deb package, 然後透過管線傳給grep -i python
-i
表示忽略大小寫
find . -name "*.png" | grep -i "ithome"
想準確搜尋amd
dpkg -l | grep -i "amd"
會發現amd64這樣也被找出來, 但其實我們要的不是這些.
這時利用-w
找到字串的完整匹配,
就是並非是字串中間有出現該字就算, 而是要字面本身就等於搜尋字串
dpkg -l | grep -iw "amd"
利用find
找出當前目錄下所有檔名結尾是.png的檔案, 透過管線傳給grep -i "ithome"
找出檔名有ithome的png檔案.
有時候會想要查詢, 匹配到的該行的前後幾行, 查看日誌時總是如此
這時能搭配-A
after , -B
before
# 準備假資料
cat > grepText.txt <<EOF
10
11
12
13 ithome
14
15
EOF
cat grepText.txt| grep -A 1 -B 2 "ithome"
我們把匹配到ithome該行的後1行與前2行, 也一起顯示出來
還有一種是-C
, 把匹配到該行為中心點, 前後都顯示出來
cat grepText.txt| grep -C 1 "ithome"
計算匹配項的總數, 搭配-c
, 這很類似於wc
這指令
ip addr | grep -c inet6
計算出有幾組ipv6的ip
顯示匹配行的行號, 搭配-n
cat grepText.txt| grep -n "ithome"
最前面的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
可以看到-o
的匹配到2次,因為同一行出現2次, 都會納入計算
沒-o
的, 就是該行匹配到第一次, 就沒納入計算了
反向匹配-v
invert-match
這個我蠻常用的, 用來過濾
一些訊息
cat grepText.txt| grep -vin "ithome"
這裡就把沒匹配到ithome(不分大小寫)的行給顯示出來, 並顯示行號
grep提供非常多option, 各種組合下, 基本可應付各種場景.
我自己蠻常是查找日誌內, 有沒有我不知道的錯誤訊息類型, 我就會透過-v
做反向表列.
能否用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