为了账号安全,请及时绑定邮箱和手机立即绑定

grep使用标准正则表达式有什么注意事项?

grep使用标准正则表达式有什么注意事项?

慕丝7291255 2019-04-08 11:19:20
history|grepssh是正常的,可以找到字符串里面带ssh的命令,但是history|grep'^ssh'不对,history|grep-e'^ssh'、history|grep-i'^ssh'都不对。。而且还是不正常退出的。到底grep里的正则表达式有什么不一样的呢?网上搜的时候好像直接用history|grep'^ssh'就可以了,不明白我这是个什么情况。。。ubuntu和Mac上都试过了。。➜zhutou@localhost:~>grep--versiongrep(BSDgrep)2.5.1-FreeBSD
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

首先我使用的grep版本
grep--version
GNUgrep2.6.3
Copyright(C)2009FreeSoftwareFoundation,Inc.
LicenseGPLv3+:GNUGPLversion3orlater
Thisisfreesoftware:youarefreetochangeandredistributeit.
ThereisNOWARRANTY,totheextentpermittedbylaw.
不过应该和题主的区别不大。
简单看下grep的help帮助文档,
[honwhy@localhost~]$grep--help
Usage:grep[OPTION]...PATTERN[FILE]...
SearchforPATTERNineachFILEorstandardinput.
PATTERNis,bydefault,abasicregularexpression(BRE).
Example:grep-i'helloworld'menu.hmain.c
Regexpselectionandinterpretation:
-E,--extended-regexpPATTERNisanextendedregularexpression(ERE)
-F,--fixed-stringsPATTERNisasetofnewline-separatedfixedstrings
-G,--basic-regexpPATTERNisabasicregularexpression(BRE)
-P,--perl-regexpPATTERNisaPerlregularexpression
-e,--regexp=PATTERNusePATTERNformatching
由于历史原因grep刚开始支持的正则表达式比较有限,你会看到-E这个选择,如果使用grep-E就能够使用扩展的正则表达式了,grep-E也相当于egrep;要使用grep-e这种形式,正确的方式grep-e='*[0-9]\{1,\}ssh'实在抱歉,在普通正则表达式模式下,不知道怎么匹配空白。
1.history|grep'^ssh'这个不对是因为history输出每行有空白字符+数字+空白字符,然后才是历史命令,^ssh没有匹配到ssh开头的记录。
2.history|grep-e'^ssh'语法问题
3.history|grep-i'^ssh'加了-i参数,只是表示匹配过程中忽略大小写。
要找历史记录中以ssh开头(而且不能是ssh-keygen这种形式的,这个是我加的假设),推荐一下做法
1.使用扩展的正则表达式
egrep'^\s+[0-9]+\s+ssh\>($|)'我表示以后再也不给自己挖坑了,
有哪位大神告诉我为什么egrep'^\s+[0-9]+\s+\>ssh\>'为什么不行,为什么还要匹配ssh-keygen的情况。
2.将前面的行数去掉
history|cut-c8-,只不过你或许要考虑history|cut-c8-|grep^ssh也会匹配到ssh-keygen的情况。
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 476 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信