今夜はパイピングと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*
何もリストされていませんか?
正規表現はグロブではありません。
「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*
それらがそのグロブに一致する複数のファイルである場合は、dmesg
daemon.log
およびdpkg.log
と言います。シェルはd*
をアルファベット順にそれらのファイルのリストに展開します(これはロケールによって異なります)。これにより、次の結果が生じる可能性があります。
grep daemon.log dmesg dpkg.log
このコマンドは、ファイルdmesg
およびdaemon.log
内の文字列dpkg.log
の存在を検索します。これらのファイルにその文字列が含まれていない場合、出力は行われません。