我的目标是精确匹配 solaris 和 linux 上的 hosts 文件中的字符串 snmpmanager
以下命令在 Linux (red-hat 5.1) 上运行,但不在 SunOS 上运行,请建议如何使语法适合 solaris?
来自 solaris 操作系统的示例
grep -icE '(^|[[:space:]])snmpmanager($|[[:space:]])' /etc/hosts
grep: illegal option -- E
在我修复它之后
egrep -i '(^|[[:space:]])snmpmanager($|[[:space:]])' /etc/hosts
or egrep -i '(^|[\s])snmpmanager($|\s])' /etc/hosts
or egrep -i '(^|[\t])snmpmanager($|\t])' /etc/hosts
但我没有得到任何匹配输出(但 snmpmanager 已在主机文件中定义)??
我的主机文件
10.170.10.5 loghost
10.170.10.61 Master SyslogSer vip Tcc NtpServer1 NtpServer2 snmpManager snmpManagerPA1 snmpManagerPA2
答案1
我认为标准 Solaris (e)grep 不理解语法,[[:space:]]
因此您必须使用类似
egrep -i (^| |<-TAB->)snmpmanager($| |<-TAB->)
哪里<-TAB->
Ctrl-VTab
如果您使用 /usr/xpg4/bin/egrep,那么它会按预期工作。
/usr/xpg4/bin/egrep -i '([[:space:]])snmpmanager($|[[:space:]])' /etc/hosts
答案2
使用egrep -ic
而不是grep -icE
。请注意,-i 使匹配不区分大小写,这可能是也可能不是您想要的,具体取决于您对“完全匹配”的定义
答案3
传统上(例如在 Solaris 中)有三个替代版本grep
:还有egrep
、fgrep
和rgrep
。
根据 POSIX,这三种变体现在作为选项包含在以下版本中grep
:
egrep
相当于grep -E
fgrep
相当于grep -F
rgrep
相当于grep -r
因此,通过您的调用,您需要这样做:
egrep -ic '(^|[[:space:]])snmpmanager($|[[:space:]])' /etc/hosts
(假设没有其他错误。)
答案4
Solaris 11 中的 grep 手册页指出/usr/xpg4/bin/grep
如果我们想使用,-E
我尝试过它,并且它在我的情况下有效。
/usr/xpg4/bin/grep -E "DisplayConnect[[:space:]]*/etc/issue" /etc/proftpd.conf
DisplayConnect /etc/issue