一. grep指令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expr
格式: grep [options] pattern files
option: 选项 如: -n 行号 -i 不区分大小写 -c 数量
pattern :需要匹配的字符串或者其正则表达式,如果包含除字符外的其它内容需要用‘’包起来
files:文件名,支持多个文件同时 (可以是aaa*.txt,或/路径/*)
简单例子:
查看文件users.txt中包含name="xiaoming"的行,并打印行号
grep -n 'name="xiaoming"' users.txt
grep -n 'name="xiaoming"' user*.txt
| 是管道,常与grep配合使用
格式:|grep [options] pattern (以管道前的输出为grep的输入,不用加文件名)
一般来说, 如果要在一个具体存在的文件中查找, 那么用 grep, 例如
grep "main" test.txt,用来搜索 test.txt 里是否包含字串 main
如果要在搜索一个命令的输出中是否包含某个字符串,那么用 | grep, 比如
ps -ef|grep
cat aa.log|grep 'main'
常用参数:
-c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
-E :或(使得grep后的条件可以出现多个,多个条件间用'|'分隔)
--color=auto :可以将找到的关键词部分加上颜色的显示
二. grep 的常用 OPTION使用样例
查询包含字符“error”的行
cat log.txt|grep ‘error’
查询包含字符“error”的数量
cat log.txt|grep -c ‘error’
查询包含字符“error”的 前后10行
cat log.txt|grep ‘error’ -C 10 (-A后10行,-B前10行)
查询包含字符“error”的行并重定向到一个newlog.txt
cat log.txt|grep ‘error’ >>newlog.txt
查询包含字符“error”的压缩包中文件行并重定向到一个newlog.txt
zcat log.gz|grep ‘error’ >>newlog.txt
查询包含字符“error”的压缩包中文件行,并将每一行以#分割为两部分取第二部分重定向到一个newlog.txt
zcat log.gz|grep ‘error’|cut -d# f2>>newlog.txt
查询包含字符“error”的压缩包中文件行,并将每一行以#分割为两部分取除去第一部分以外的所有内容并重定向到一个newlog.txt
zcat log.gz|grep ‘error’|cut -d# f2->>newlog.txt
查看日志中 状态 字段 Status 既不是open 也不是 Close的行
cat aa.log|grep -v -E 'Status="open"|Status="close"'|grep --color Status
注意:外层用单引号‘’ ,字符串中原有的双引号保留
搜寻某目录(tmp)所有符合的文件的行,包含其子目录中的文件
grep -r '[a-z]\{5\}' /opt/app/tmp
grep -r 后边跟着的为正则表达式‘pattern ’ ,而Linux正则表达式与Java相似,下面具体讲解
三. grep Pattern 正则表达式样例
grep [options] pattern files
^ | 只匹配行首 |
$ | 只匹配行尾 |
* | 一个单字符后紧跟*,匹配0个或多个此单字符 |
[] | 匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用[1-5]代替[12345] |
\ | 用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有含义。 |
. | 匹配任意单字符 |
pattern\{n\} | 用来匹配前面pattern出现次数。n为次数 |
pattern\{n,\} | 含义同上,但次数最少为n |
patter\{n,m\} | 含义同上,但pattern出现次数在n与m之间 |
61353
[user1@vm-vmw87551-app]/opt/log$zcat txt1.gz|grep 'TicketNumber="999[0-9]\{10\}"'|wc -l
0
[user1@vm-vmw87551-app]/opt/log$zcat txt1.gz|grep 'TicketNumber=\"999[0-9]\{11\}\"'|wc -l
61353