linux环境下查找包含指定内容的文件及其所在行数
2023-09-11 14:16:59 时间
前言
在linux系统下搜索文件一般情况下一个命令就搞定了,之前搜索文件的时候一直使用find
,今天排查问题时想查一个函数的调用者在哪个文件中,发现不会写了,搜了一下发现使用grep
命令就可以实现,改变了我对grep
命令的理解,原来使用grep
命令的情况通常是作为结果的过滤函数,比如ps aux | grep gameserver
,这次发现他居然还可以直接用来搜索,其实也是过滤的一种。
使用方法
这里直接给出命令的写法,简单替换搜索内容就可以使用,也方便自己后续查找使用(例如查找包含stream
的文件):
grep -rn 'stream' . --include='*.cpp'
命令解析
上述命令是一种比较常用的写法,就是在当前目录下(一定要注意那个.
)查找包含stream
的文件,并显示其所在的行,搜索的文件类型是.cpp
,其实--include=
后面的内容是遵循glob
语法的,详细的就不展开了,简单来说就是支持通配符,而查找选项-rn
中的r
表示递归查找,其中的n
表示显示行号,此外还可以使用选项-i
表示忽略大小写,下面简单展示一下3个选项的功能:
-r
:只递归查找不显示行号
[albert@localhost#18:17:41#/home/albert/test]$grep -r 'stream' . --include='*.cpp'
./testPtr.cpp:#include <iostream>
./crab-server/code/main/crab.cpp:#include <iostream>
./testConstructor.cpp:#include <iostream>
./smartptr/auto_ptr.cpp:#include <iostream>
./io.cpp:#include <fstream>
./io.cpp: ofstream logfile("./logs/players_distribution.txt", ios::out);
./ptr.cpp:#include <iostream>
./gdbtest/main.cpp:#include <iostream>
./test_t.cpp:#include <iostream>
./testshareptr.cpp:#include <iostream>
-rn
:递归查找并显示行号
[albert@localhost#18:17:48#/home/albert/test]$grep -rn 'stream' . --include='*.cpp'
./testPtr.cpp:4:#include <iostream>
./crab-server/code/main/crab.cpp:3:#include <iostream>
./testConstructor.cpp:1:#include <iostream>
./smartptr/auto_ptr.cpp:4:#include <iostream>
./io.cpp:1:#include <fstream>
./io.cpp:9: ofstream logfile("./logs/players_distribution.txt", ios::out);
./ptr.cpp:4:#include <iostream>
./gdbtest/main.cpp:1:#include <iostream>
./test_t.cpp:1:#include <iostream>
./testshareptr.cpp:4:#include <iostream>
-rni
:递归查找显示行号并且忽略大小写
[albert@localhost#18:17:53#/home/albert/test]$grep -rni 'stream' . --include='*.cpp'
./testPtr.cpp:4:#include <iostream>
./crab-server/code/main/crab.cpp:3:#include <iostream>
./testConstructor.cpp:1:#include <iostream>
./epoll_cs_demo/testfd.cpp:5: int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/testfd.cpp:8: listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/testfd.cpp:11: listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/testfd.cpp:14: listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/testfd.cpp:21: listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/testfd.cpp:25: listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/client.cpp:18: int client_fd = socket(AF_INET, SOCK_STREAM, 0);
./epoll_cs_demo/server.cpp:24: int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./smartptr/auto_ptr.cpp:4:#include <iostream>
./io.cpp:1:#include <fstream>
./io.cpp:9: ofstream logfile("./logs/players_distribution.txt", ios::out);
./network/zgetaddrinfo.cpp:37: hints.ai_socktype = SOCK_STREAM;/* Stream socket */
./linux_version/client.cpp:15: int client_fd = socket(AF_INET, SOCK_STREAM, 0);
./linux_version/server.cpp:15: int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
./ptr.cpp:4:#include <iostream>
./gdbtest/main.cpp:1:#include <iostream>
./test_t.cpp:1:#include <iostream>
./testshareptr.cpp:4:#include <iostream>
总结
- 查找指定内容的简单命令:
grep -rn 'stream' . --include='*.cpp'
- 这个grep有很多附加的参数,看了文档之后发现了一个点,原来用法:
egrep
即grep -E
,fgrep
即rep -F
,但是egrep
和fgrep
现在都不建议使用了,无论是man手册还是--help
选项中都提到了这一点
相关文章
- linux环境中,如何将一个大文件拆分成多个小文件?
- linux环境中 1秒内 创建一个超级大文件(100G)的方法
- linux环境中如何删除文件的前n行?
- Linux 文件与目录管理
- linux中查找最近或今天修改过的文件
- Linux之创建、删除文件及目录命令touch、echo、mkdir、rm、rmdir
- linux 文件size
- Linux限制ssh登录次数,防止暴力破解
- Linux的用户相关文件
- 基于linux环境的MP3文件转WAV文件实例解析
- dd- Linux必学的60个命令
- 转 windows下安装pycharm并连接Linux的python环境 以及 windows 下notepad ++编辑 linux 的文件
- Linux学习之路三:重要概念之Linux系统层次结构
- Linux多线程实例练习 - pthread_create()
- linux 下用find命令查找文件,rm命令删除文件
- linux系统编程:自己动手写一个cp命令
- linux command ------ 内容文件查找命令 find
- linux问题——linux下误用rm删除文件解决方案
- 【嵌入式Linux学习】6、交叉编译环境的搭建,单文件编译Hello Linux!
- linux桌面快捷方式——.desktop文件
- Linux文件颜色
- [加入用户]解决useradd 用户后没有加入用户Home文件夹的情况,Linux改变文件或文件夹的訪问权限命令,linux改动用户password,usermod的ysuum安装包。飞
- C#读取文件或者字符流的最后几行,类似linux的tail命令-OK
- linux小技巧--改变文件或目录权限与用户、用户组
- linux学习之防火墙,查看Linux防火墙状态,开启/关闭Linux防火墙,Linux防火墙开放5236端口
- Linux 之 文件搜索命令
- linux du查看文件所占大小
- LInux 系统上的库文件的生成和使用