🎀 关于博主👇🏻👇🏻👇🏻
🥇 作者简介: 热衷于知识探索和分享的技术博主。
💂 csdn主页::【奇妙之二进制】
✍️ 微信公众号:【Linux 世界】🎉精彩专栏:
🎓 【面向工作git基础教程】
🧡 【C++11新特性深入剖析】
📚【shell脚本编程基础与实战】
🌎【Linux网络编程面试演练】
✍️ 【C++编译工具cmake入门到精通】
…💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 💪坚持创作,热衷分享,初心未改,继往开来!
文章目录
grep 指令用于查找文件里匹配指定模式的字符串,如果发现某文件的内容符合所指定的pattern,预设 grep 指令会把含有样式的那一行打印出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
实例
1、在当前目录中,查找后缀有 .cpp 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *.cpp
2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
3、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
grep的高级用法是开启-E选项。
4、grep -E 同时匹配多个关键字–或关系
grep -E "word1|word2|word3" file.txt
5、-E和-v可以一起使用
grep -E -v "test|good" *.cpp
6、grep会打印包含匹配pattern的一整行,如果我们期望只打印匹配的pattern,使用-o选项
7、-w可以实现完整单词匹配,也很有用。例如:
$ grep -w "hello" *.cpp
包含helloworld的行是不会显示的,因为只会匹配含有hello单词的行,单词意味着其前后要有空格间隔。
8、-A n
A是after的意思 除了显示匹配行,还会显示匹配行后面n行。
-B n
B是before的意思 除了显示匹配行,还会显示匹配行前面n行。
-C n
C是after的意思 显示匹配行上下各n行。
9、–exclude-dir=GLOB 递归搜索时排除匹配模式的目录
10、–exclude-from=FILE 排除匹配模式的文件。
11、-n 顺带输出匹配行的行号
$ grep -n "test" *.cpp 127
3:test good
12、以某个单词开头/结尾的行
grep -E "^hello" *.cpp
grep -E "world$" *.cpp
13、不是以某个字母开头/结尾的行
grep -E "[^#]" *.cpp
14、.是特殊字符,表示匹配一个单词。
下面的正则表达式查找 IP 地址 192.168.1.254 将不能获得预期的结果:
grep '192.168.1.254' /etc/hosts
其中三个点都需要被转义:
grep '192\.168\.1\.254' /etc/hosts