java程序部署在linux服务器上,我们经常会看日志、搜日志、日常巡检、修改服务器启动的脚本、修改配置文件等,涉及到linux档案的与目录的管理、查阅,压缩与解压,vim编辑器、bash与shell script、档案的权限等方面的内容,本文将介绍其中日志搜索最常用的grep的日常用法。
grep :global search regular expression(RE) and print out the line,全局正则式搜索并打印,这是一个强大的文本搜索命令,可以帮我们搜索日志中想要的内容
用法:grep [option] 关键字 要搜索的文件
例如:grep 'Exception' account.log -i --col 搜索account.log中Exception关键字的,不区分大小写并高亮关键字
常用参数:
grep -c 计算搜索到的次数
-i 忽略大小写
-n 显示行号
-v 搜出没有关键字的那行
-l 多文件查询时只输出包含匹配文件的文件名
-w 只匹配单词而不是单词中的一部分,如bea而不是beautiful
--col 高亮显示匹配到的文本
-C number 显示匹配到文本的上下 如:-C10 显示匹配到文本的上下5行共10行
正则表达式:
[]代表其中一个,是一个,比如想搜索test或者taste的时候,用grep 't[ae]st' account.log,也可以使用通配符grep 't?st' account.log想搜a-z的英文单词的时候,用grep '[a-z]' account.log,-代表连续编号,同理大写的是[A-Z] 数字是[0-9] 如果想要大写小写和数字的话是[a-z A-Z 0-9]
[^]反向选择,比如oo前面不带g的,grep '[^g]oo' account.log,再比如oo前面不想要小写的grep '[^a-z]oo' account.log,也可以用grep [^[:alnum]]oo' account.log表示,最后附上了一幅图说明一些表示法
^行首字符,比如想搜索以the为开头的行的行,那么用grep '^the' account.log,比如以小写字符开头的行的行,grep '^[a-z]' account.log,此处注意!^在[]外和在[]里是不一样的,前者代表行首,[^]代表反向
$行尾字符,比如想找出来行尾结束符是.小数点的那一行,grep '\.$' account.log,注意.小数点需要转义
\转义,忽略正则表达式中本来的意思
. 任意一字符,小数点表示任意一字符,比如想找以g??d的单词,可以用grep 'g..d' account.log, 其中gd中间一定有2个字符
* 重复字符,重复前一个0到无穷多次 比如:拥有1个o或者多个o的字符,grep 'o*' account.log 比如:拥有1个多多个的,grep 'oo*' account.log 这个里面的第一个o是一定会有的,第二个o代表0次或无穷次,同样拥有多个o的就用'ooo*' 比如:得到g....g中间无穷多个字符这样的字符,那么需要用grep 'g.*g' account.log
{} 连续字符范围 , 限制一个字符有多少个 比如:连续5个o的,grep 'o\{5\}' account.log 注意此处{ } 要转义!同理,{2,5}代表2-5个,{2,}代表2个以上,注意转义!
注意,正则表达式中的字符与一般指令的通配符意义不一样,如*在正则中代表重复字符,在通配符中代表任意多个
还可以用grep进行多文件处理:
例如:grep 'Exception' account1.log account2.log 搜索account1.log和account2.log 文件中所有带Exceptiong关键字的
grep 'Exception' account* 搜索以account开头的所有的日志,一般日志会以日期来命名,在这种搜索多文件的时候,会在前面列出文件名
grep Exception -l ./* 搜索当前目录下所有文件中包含Exception的,只列出文件的名字