我有 2 个几乎相同的grep
s:
[Alex@localhost tmp]$ grep /bin/bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
AlexL:x:500:500::/home/AlexL:/bin/bash
user1:x:501:501:user1 12345:/home/user1:/bin/bash
与
[AlexL@localhost tmp]$ grep /bin/*sh /etc/passwd
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:AlexL:x:500:500::/home/AlexL:/bin/bash
/etc/passwd:user1:x:501:501:user1 12345:/home/user1:/bin/bash
在第二个查询中,我得到了每行匹配的文件名前缀。我知道为了获得相同的结果,我需要将-h
选项放在 2nd 中grep
,但我的问题是:
为什么他们返回不同的输出? 我应该添加更多东西吗?
该任务包括从/etc/passwd
真实用户(没有守护程序和系统用户)检索。
使用:CentOS 6.4,grep gnu 2.6.3版本
答案1
你的外壳会膨胀/bin/*sh
。所以,你真正在做的是
grep /bin/bash /bin/dash /bin/rbash /bin/rzsh /bin/sh /bin/zsh /etc/passwd
即在、、、、 、等/bin/bash
文件中查找该字符串。/bin/dash
/bin/rbash
/bin/rzsh
/bin/sh
/bin/zsh
/etc/passwd
(与 的输出进行比较echo /bin/*sh /etc/passwd
。)
由于需要搜索多个文件,因此grep
会报告在哪个文件中找到了该字符串。
您想要的是引用您的搜索词,这样它就不会被 shell 扩展,并使用正确的正则表达式:
grep '/bin/.*sh' /etc/passwd