page contents

linux使用grep条件搜索大文件的行数等操作

最近需要查询大日志文件的时候,每次打开vim,cat之类的都会卡死,但是需要查看符合条件的共有多少行数据,这可愁死我了,下面列出一些常用的匹配查询命令。

attachments-2020-08-hOiOuTEQ5f373956ac8c9.png


一、前言


最近需要查询大日志文件的时候,每次打开vim,cat之类的都会卡死,但是需要查看符合条件的共有多少行数据,这可愁死我了,下面列出一些常用的匹配查询命令。


二、常用的搜索命令


1、grep搜索

                        grep 参数 文件名 | head     //从头查找
			grep 参数 文件名 | wc- l    //查看符合条件的有多少行
			cat 文件名 |grep 参数$	//输出以该参数结尾的行内容


2、实例

(1)根据具体的参数来搜索行数

cat /data/weblogs/xxx.access.log  |grep "GET /pixel.jpg?"|wc -l 
			4102386

(2)部分正则查询

cat /data/weblogs/em.evony.com.access.log |grep "25/Nov/2019:15:[00-59]" |wc -l 
		120

查询25/Nov/2019:15时的所有数据,那么15时后面的分钟数就是00-59

(3)多个条件之间可以使用管道连接,查询同时符合两个条件的行数

cat /data/weblogs/xxx.log |grep "25/Nov/2019:15:[00-59]" |grep "GET /pixel.jpg?"|wc -l 

		120

查询符合条件1或者符合条件2 的行数

cat /data/weblogs/xxx.log |grep -E "25/Nov/2019:15:[00-59] |GET /pixel.jpg?"|wc -l 
			4098135

简写: grep -E "exp1|exp2|exp3" | wc -l
参考:https://blog.csdn.net/lijing742180/article/details/84959963


3、grep是模糊查询

在使用grep搜索端口号的时候,查出来的结果不尽人意,什么牛鬼蛇神都查出来了,例子如下:

netstat -anp |grep -i '80'
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:80                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 10.17.2.50:80               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 216.66.17.189:80            0.0.0.0:*                   LISTEN      -                   
tcp        0      0 10.17.2.50:10050            10.17.13.2:33801            TIME_WAIT   -              

推荐个更好用的,具体查询80端口的使用情况,使用命令:

 netstat -apn | awk '{split($4,arr,":"); if(arr[2] == "80") print $0}'

一步到位,查出来的都是80端口的进程,十分好用。


三、搜索文件中的ip地址


1、匹配ip

grep -Eo '([^0-9]|\b)((1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])\.){3}(1[0-9][0-9]|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])([^0-9]|\b)' xxx.log | sed -nr 's/([^0-9]|\b)(([0-9]{1,3}\.){3}[0-9]{1,3})([^0-9]|\b)/\2/p'|wc -l

31116275

2、查询每个ip出现的次数

grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"  xxx.log |sort|uniq -c

      2 99.203.87.103
      2 99.203.87.142
      4 99.203.87.145
      8 99.203.87.153

前面是出现次数,后面是ip

3、更精准的匹配ip

grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"  xxx.log|wc -l

32929372

4、模糊匹配ip

grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" xxx.log|wc -l

32930309

5、多个条件查询ip,先根据限定条件获取指定的行数,然后再搜索ip的个数

cat xxx.log |grep "25/Nov/2019:15:[00-59]" |grep "GET /pixel.jpg?"|grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|wc -l 
1110

感觉这些查ip的方法都差不错,因为日志文件一直在增大,所以查出来的结果也不一样,查的速度也比较慢,可能是文件太大了,在此记录一下,总有用得着的时候。


attachments-2020-08-vxO22hHO5f3739366c72a.jpg

  • 发表于 2020-08-15 09:24
  • 阅读 ( 884 )
  • 分类:高并发

0 条评论

请先 登录 后评论
Pack
Pack

1159 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1976 文章
  3. Pack 1159 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章