コマンド:ls / etc sort | grep d *は結果を生成しませんが、ls / etc sort |

コマンド:ls / etc sort | grep d *は結果を生成しませんが、ls / etc sort |

今夜私はパイプと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*ppすべてと一致

なぜgrep d*何もリストされないのですか?

これはおそらくd現在のディレクトリに 。具体的には、ファイル名がと仮定しますdichotomy。シェルはそれを拡張して引数d*としてdichotomy渡しますgrep

grep dichotomy

おそらくこれが実行されたときに結果が出ない理由ですgrep d*

複数のファイルが1つのglobと一致する場合はd*どうなりますか?

次のコマンドを検討してください。

grep d*

このglobに一致するファイルが複数ある場合はdmesg daemon.logsumと言いますdpkg.log。シェルはd*これらのファイルのアルファベット順のリストに展開されます(ロケールによって異なります)。これにより、以下が発生する可能性があります。

grep daemon.log dmesg dpkg.log

daemon.logこのコマンドは、dmesg文字列が存在するかどうかをファイルとファイルを検索しますdpkg.log。文字列がこのファイルに表示されない場合、出力はありません。

おすすめ記事