linux常用指令之一:grep与正则使用样例


一. grep指令

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

 格式: 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

忽略子目录:-d

grep -r 后边跟着的为正则表达式‘pattern ’ ,而Linux正则表达式与Java相似,下面具体讲解

三. grep Pattern 正则表达式样例

grep [options] pattern files

Linux 正则表达式

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户

(一)、入门实例
1. 显示所有包含每个字符串至少有5个连续小写字符的字符串的行
test.txt

grep '[a-z]\{5\}' test.txt


(二)、正则中特殊含义字符
^ 只匹配行首
$ 只匹配行尾
* 一个单字符后紧跟*,匹配0个或多个此单字符
[] 匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用[1-5]代替[12345]
\ 用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有含义。
. 匹配任意单字符
pattern\{n\} 用来匹配前面pattern出现次数。n为次数
pattern\{n,\} 含义同上,但次数最少为n
patter\{n,m\} 含义同上,但pattern出现次数在n与m之间

(三)、复杂实例

1. 列出包含字符Z的行
cat tmp.txt | grep 'Z' 
或 cat tmp.txt | grep '[Z]' 
2. 列出包含b或B中任意一个字符的
more tmp.txt | grep '[bB]' 
3. 列出所有以Msg开始的行
more tmp.txt | '^Msg'
4. 列出所有以END或emd结束的行
more tmp.txt | grep -i 'END$'
5. 列出所有以E某D或e某d结束的行
more tmp.txt | grep -i 'E*D$'
6.列出所有包含ABCDEF中任意连续3字符的行
more tmp.txt | grep '[A-F]\{\3}'
7. 分别查找票号是999开头,后接10位数字,和后接11位数字的行的个数
[user1@vm-vmw87551-app]/opt/log$zcat txt1.gz|grep 'TicketNumber="999[0-9]\{11\}"'|wc -l
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

总结:双引号不需要转义,转了也没事。

7. 综合例子解析$结束符
文件:tmp:txt
---------file begin----------------
111<flt>ca123a</flt>eee
222<flt>ca123a </flt>ddd
333mmddaa kk
----------file end----------------
1). 查看是否有某行中, 是否包含字符串:‘<FLT>***A’
错误: '<FLT>[0-9]*[a-z]$' : 因为这个$匹配的 一整行的末尾(还是一整行的末尾呢)
错误: '<FLT>*[a-z]' (我也暂时不知道为什么!!哪位大神知道请写在评论里)

正解: grep -i '<FLT>[0-9]*[a-z]'|grep --color FLT
2). 找出以3开头a结尾的一行
/logs/tmp$grep -i '3*a$' tmp.txt
--无输出
/logs/tmp$grep -i '3*k$' tmp.txt
333mmddaa kk
3). 找出包含3*a的字符串的行
grep -i '3*a’ tmp.txt

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值