2

私はSolaris 5.10を使用しており、 Bash Shellで作業しています。次のステートメントが機能しないシェルスクリプトがあります

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

/data1data1に置き換える(つまり、「/」を削除する) と、正しく動作します。

以下のような別のステートメントがあり、正常に機能しています。

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

私の理解によると、「/」(スラッシュ)の最初の出現はシェルスクリプトによって認識されていません。シェルスクリプトの「/」の意味を知りたいですか? 以下は私の出力です。

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 システムは現在問題を抱えています。)

grepこのコマンドを適度に移植可能なスクリプトの一部として使用する場合は、これが GNU の動作が異なる領域であることを認識する必要があります。Linux システムで GNU を使用すると、次のようになります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 に答える