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

<<:  EP 03 - Hash ID 计算

>>:  鬼故事 - 总有刁民想害朕

Dependency injection

谈到 Android 的 dependency injection (DI),大家一定会想到 Dag...

5 开始把结构写成程序吧!

昨天我们使用这两个 struct 来代表整个游戏的状态,那我们今天就实际的来定义他们 在开始之前 在...

2021法遵科技与电脑稽核专题竞赛-贺云科大、逢甲、北商大、中正、致理科大、亚洲科大等学校队伍获奖,培育智慧法遵与AI稽核人才迈向国际~

本次专题竞赛,由国际电脑稽核教育协会(ICAEA)、国立中正大学会计与资讯科技学系、国立政治大学产学...

[Day09] - 未知网址的弹跳视窗 - is 属性

早上查看文章时 , 发现贴到昨天的资料 本鲁立马作文章修改 , 如造成 邦友 的不便 , 请各位海...

[Java Day29] 6.6. 抽象类别

教材网址 https://coding104.blogspot.com/2021/06/java-a...