2

我正在使用Solaris 5.10并在Bash Shell上工作。我有一个 shell 脚本,其中以下语句不起作用

ssh 172.18.16.55 "df -h" |grep -w /data1

当我将/data1替换为data1(即删除“/”)时,它工作正常。

我有另一个类似下面的声明,它工作正常。

ssh 172.18.16.55 "df -h" |grep -w /dev/dsk/c1t0d0s0

据我了解,第一次出现的“/”(正斜杠)没有被 shell 脚本识别。我想知道shell脚本中“/”的意义是什么?以下是我的输出。

root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep '/data1\>'
/dev/md/dsk/d50         84G    59G    24G    71%    /data1

root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep -w /data1

不打印任何东西。


root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep /data1
/dev/md/dsk/d50         84G    59G    24G    71%    /data1
4

2 回答 2

3

您确定返回的输出df -h实际上包含字符串/data1吗? grep如果找不到字符串,则不会打印任何内容。

编辑为了让答案更容易找到,他的问题是grep没有考虑/data1一个词。

于 2011-12-28T06:20:01.780 回答
2

grep-w选项告诉将模式匹配为“单词”,即在它之前和之后使用“单词边界”。我认为正在发生的事情是 grep 的单词边界概念与您的期望不符。

您可以使用\<and\>显式匹配单词边界。

以下是在 Solaris 9 系统上运行的一些示例:

% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep -w /data1
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '\</data1\>'
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '/data1\>'  
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% 

显然 Solarisgrep不认为空格和/字符之间的边界是单词边界。

我建议运行man grep,并且可能遵循一些“另见”参考,以了解这是如何记录的。(我自己尝试过这样做,但我可以访问的 Solaris 系统目前有问题。)

如果您想将此命令用作合理可移植脚本的一部分,则需要注意这是 GNUgrep行为不同的区域。我在使用 GNU 的 Linux 系统上得到以下信息grep

% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep -w /data1
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '\</data1\>'
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '/data1\>'  
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% 

请注意,如果您向我们展示了您期望匹配的确切行,您的问题会更容易回答。

于 2011-12-28T06:40:30.007 回答