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的情况。