history|grep ssh
是正常的,可以找到字符串里面带ssh的命令,
但是history|grep '^ssh'
不对,history|grep -e '^ssh'
、history|grep -i '^ssh'
都不对。。而且还是不正常退出的。
到底grep里的正则表达式有什么不一样的呢?
网上搜的时候好像直接用history|grep '^ssh'
就可以了,不明白我这是个什么情况。。。
ubuntu和Mac上都试过了。。
➜ zhutou@localhost:~ >grep --version
grep (BSD grep) 2.5.1-FreeBSD
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
好吧可以关闭了的样子。。。
history前面有一排序号,序号可以用!n(n代表任意数字)在shell中召唤出来那条命令。。。
因此实际上不存在ssh开头的命令。。。
首先我使用的
grep
版本不过应该和题主的区别不大。
简单看下
grep
的help
帮助文档,由于历史原因
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 -c 8-
,只不过你或许要考虑history | cut -c 8- | grep ^ssh
也会匹配到ssh-keygen
的情况。