zl程序教程

您现在的位置是:首页 >  其它

当前栏目

grep的用法

用法 grep
2023-09-11 14:18:56 时间

 

查看日志:

cat  日志文件  | grep -A/B/C 行数   ‘搜索的内容/关键字’

cat jetty_stdout.log  | grep -A 1000 '15017472573983'

cat jetty_stdout.log  | grep -C 1000 '15017472573983'

 

grep命令的格式:

grep   [options]   PATTERN  [FILE]

其中:
1,pattern是用正则表达式书写的模式。
2,FILE是要查找的文件,可以是用空格间隔的多个文件,省略FILE时表示在标准输入中查找

常用参数:

-E :采用规则表示式去解释样式。
-c:只显示匹配行的次数。

-i:搜索时不区分大小写。
-n:输出匹配行的行号。
-v:输出不匹配的行(反向选择)。

-?:同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。

-c,--count:只打印匹配的行数,不显示匹配的内容。
-f File,--file=File:从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
-i,--ignore-case:忽略大小写差别。
-q,--quiet:取消显示,只返回退出状态。0则表示找到了匹配的行。
-l,--files-with-matches:打印匹配模板的文件清单。
-L,--files-without-match:打印不匹配模板的文件清单。
-n,--line-number:在匹配的行前面打印行号。
-s,--silent:不显示关于不存在或者无法读取文件的错误信息。
-v,--revert-match:反检索,只显示不匹配的行。
-w,--word-regexp:如果被\<和\>引用,就把表达式做为一个单词搜索。
-V,--version:显示软件版本信息。

-b,--byte-offset:打印匹配行前面打印该行所在的块号码。

-h,--no-filename:当搜索多个文件时,不显示匹配文件名前缀。

-A NUM:同时输出匹配行的后NUM行。
-B NUM:同时输出匹配行的前NUM行。
-C NUM:同时输出匹配行的前,后各NUM行。

说明:
A:FILE可是使用shell的通配符的多个文件中查找PATTERN。
B:通常必须用单引号将整个模式PATTERN括起来。
C:grep命令不会对输入文件进行任何修改或影响,可以使用输出重定向将结果存文文件。

grep使用举例:
#在文件myfile中查找包含指定的字符串的行
#如果使用grep命令查找指定的字符串(不使用正则表达式),PATTERN可以不用单引号括起来
# grep osmond myfile

#在文件myfile1,myfile2,myfile3中查找指定的字符串的行
# grep 'osmond' myfile1 myfile2 myfile3

#在当前目录的所有文件中查找包含指定的字符串的行
# grep 'osmond' *

#在当前的目录的所有文件中查找包含字符*的行
# grep '*' *

#在文件myfile中查找包含字符$的行
#为了强制shell将\$(单反斜杠和美元符号)传递给grep命令,必须要使用\\(双反斜杠)
#\(单反斜杠)字符课通知grep命令将其后的(本例中的$)视最为原义字符而不是#元字符。
#如果使用fgrep命令,则可以不必使用反斜杠之类的转义符
# grep \\$  myfile
# grep '\$' myfile
# fgrep '$' myfile
# fgrep  $  myfile

#匹配myfile中所有的空行
# grep '^$' myfile

#显示myfile中第一个字符为字母的所有行
# grep '^[a-zA-Z]' myfile

#在文件myfile中查找首字母不是#的行(即过滤掉注释行)
# grep -v  '^#' myfile

#显示在myfile中至少有5个连续的小写字符的字符串的行
# grep '[a-z]\{5\}' myfile

#在文件myfile中查找包含日期格式(yyyy-mm-dd)的行
# grep '[12][0-9]\{3\}-[01][0-9]-[0-3][0-9]' myfile

#在文件myfile中查找与abc或xyz字符串匹配的所有行
# egrep 'abc|xyz' myfile

#如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*)
#这些字符后面紧跟着另外一个es(\1),找到就显示该行
# grep 'w\(es)t.*\1' myfile
# egrep 'w(es)t.*\1' myfile

#通过管道过滤ls输出的内容,值显示以1开头的行
# ls -l | grep '^1'

#通过管道过滤ls输出的行,只显示可写的文件或目录的行
# ls -l | grep '[-d].w..w..w.'

#通过管道过滤ls输出的结果,只显示以~或-或.bak结尾的行
# ls | egrep '(~|-|.bak)$'

#显示awk目录下面所有.txt文件中的总字符字节
# grep '^.' *.txt | wc -c //不包括空行

#显示awk目录下面所有.txt文件中的总字符字节

# grep '^' *.txt | wc -c //包括空行

#显示awk目录下面所有.txt文件中的奇数行的总字符字节

#grep '^' *.txt | awk 'NR % 2 == 1'|wc -c

#显示awk目录下面所有.txt文件中的偶数行的总字符字节

#grep '^' *.txt | awk 'NR % 2 == 0'|wc -c

#把a.txt  b.txt中的奇数行写到文件c.txt文件中

#grep '^' a.txt b.txt |awk 'NR % 2 == 1' > c.txt

#把目录下面.txt中的奇数行写到文件tt.txt文件中

#grep '^' *.txt |awk 'NR % 2 == 1'>tt.txt

$ ls -l | grep '^a'通过管道过滤ls -l输出的内容,只显示以a开头的行。$ grep 'test' d*显示所有以d开头的文件中包含test的行。$ grep 'test' aa bb cc显示在aa,bb,cc文件中匹配test的行。$ grep '[a-z]\{5\}' aa显示所有包含每个字符串至少有5个连续小写字符的字符串的行。$ grep 'west.*\1' aa如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。

下面的例子中我们假定在文件phone.txt中包含以下的文本,——其格式是姓加一个逗号,然后是名,然后是一个制表符,然后是电话号码:

Francis, John           5-3871
Wong, Fred              4-4123 
Jones, Thomas           1-4122 
Salazar, Richard        5-2522