今夜私はパイプとgrepで遊んでいます。私はgrepが正規表現を使用していることを知っており、*は前の文字が0回以上表示されることを意味します。したがって、次のコマンドを実行すると、ディレクトリ全体を一覧表示する必要がありますが、何も表示されないことを理解しました。何が起こるのかはコマンドラインのリセットだけです。
[root@LinuxAcademy etc]# ls /etc | sort | grep d*
[root@LinuxAcademy etc]#
ただし、コマンドを再実行してdをpに置き換えると、予想どおりにディレクトリ全体が一覧表示されます。
[root@LinuxAcademy ~]# ls /etc | sort | grep p*
ConsoleKit
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
NetworkManager
X11
...........<<rest of listing not pasted in>>
grep d * ではエラーは発生しませんでしたが、確認のためにstderrをファイルにリダイレクトしましたが、何も印刷されませんでした。
その後、grepが「grep d *」の「d」をオプションやコマンドとして解釈できると思いましたが…それも本当ではないようです。
コマンドを使用するときに何が起こっているのか、なぜ起こるのかを理解するのに役立つ人はいますか?
grep d*
リストには何もありませんか?
ベストアンサー1
正規表現はグローブではありません。
「d」で始まるファイルが欲しいと思います。この場合、以下が必要です。
ls /etc | sort | grep '^d'
何かが間違っています。
次の文の仕組みは、現在のディレクトリのファイルによって異なります。
ls /etc | sort | grep p*
引用符が付けられていないため、シェルはglob拡張を試み、p*
それを任意のファイル名に置き換えます。現在のディレクトリからマッチ。
一致するファイル名がない場合は、リテラルがp*
に渡されますgrep
。正規表現が必要なので、文字がゼロ個以上発生するという意味でgrep
解釈されます。すべては存在するか存在しないので、p*
p
p
すべてと一致。
なぜgrep d*
何もリストされないのですか?
これはおそらくd
現在のディレクトリに 。具体的には、ファイル名がと仮定しますdichotomy
。シェルはそれを拡張して引数d*
としてdichotomy
渡しますgrep
。
grep dichotomy
おそらくこれが実行されたときに結果が出ない理由ですgrep d*
。
複数のファイルが1つのglobと一致する場合はd*
どうなりますか?
次のコマンドを検討してください。
grep d*
このglobに一致するファイルが複数ある場合はdmesg
daemon.log
sumと言いますdpkg.log
。シェルはd*
これらのファイルのアルファベット順のリストに展開されます(ロケールによって異なります)。これにより、以下が発生する可能性があります。
grep daemon.log dmesg dpkg.log
daemon.log
このコマンドは、dmesg
文字列が存在するかどうかをファイルとファイルを検索しますdpkg.log
。文字列がこのファイルに表示されない場合、出力はありません。