web-dev-qa-db-ja.com

コマンド:ls / etc |並べ替え| grep d *はls / etc以外の結果を出しません|並べ替え| grep p *はディレクトリ全体を一覧表示します

今夜はパイピングと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が「grepd *」の「d」をオプションまたはコマンドとして解釈しているのではないかと思いました...しかし、そうではないようです。

誰かが私が何が起こっているのか、そして私がコマンドを使用するときになぜそれを理解するのを手伝ってくれる?

grep d*

何もリストされていませんか?

5
Brad Harris

正規表現はグロブではありません。

「d」で始まるファイルが必要だと思います。その場合、次のものが必要です。

ls /etc | sort | grep '^d'

何が悪かったのか

次のステートメントの動作は、現在のディレクトリ内のファイルによって異なります。

ls /etc | sort | grep p*

引用符で囲まれていないため、シェルはグロブp*を展開しようとし、それを現在のディレクトリからと一致するファイル名に置き換えます。

一致するファイル名がない場合は、リテラルp*grepに渡されます。 grepは正規表現を想定しているため、p*は、文字pが0回以上出現することを意味すると解釈します。すべてがpを持っているか、持っていないので、これはすべてに一致しますです。

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

これは、現在のディレクトリにdで始まるファイル名があったことを意味している可能性があります。具体的には、ファイルの名前がdichotomyだったとしましょう。シェルはd*dichotomyに展開し、それを引数としてgrepに渡します。したがって、有効なコマンドは次のとおりです。

grep dichotomy

grep d*を実行したときに結果が得られなかったのはそのためです。

複数のファイルがd*グロブに一致するとどうなりますか?

次のコマンドについて考えてみます。

grep d*

それらがそのグロブに一致する複数のファイルである場合は、dmesgdaemon.logおよびdpkg.logと言います。シェルはd*をアルファベット順にそれらのファイルのリストに展開します(これはロケールによって異なります)。これにより、次の結果が生じる可能性があります。

grep daemon.log dmesg dpkg.log

このコマンドは、ファイルdmesgおよびdaemon.log内の文字列dpkg.logの存在を検索します。これらのファイルにその文字列が含まれていない場合、出力は行われません。

10
John1024