输入重定向到grep

时间:2015-01-15 06:19:42

标签: bash shell grep

我有一个包含这样内容的目录 -

vishal.yadav@droid36:~/Shell$ ls
lazy_dog.txt  ls-error.txt  ls-output.txt  ShellCommands.txt TheTimeMachineHGWells.txt  words.txt  words.txt.bak

第一个命令

如果我尝试使用ls | grep *.txt,我会得到以下输出 -

ShellCommands.txt:                      $ cat > lazy_dog.txt
ShellCommands.txt:                      $ cat lazy_dog.txt
ShellCommands.txt:                      $ cat < lazy_dog.txt
ShellCommands.txt:input from the keyboard to the file lazy_dog.txt. We see that the result is the

第二命令

如果我使用ls | grep .*.txt,我会将其作为输出 -

lazy_dog.txt
ls-error.txt
ls-output.txt
ShellCommands.txt
TheTimeMachineHGWells.txt
words.txt
words.txt.bak

不是.*.txt*.txt同一个吗?

第一个命令中,ls的输出是regex的{​​{1}}还是grep? 同样,对于第二个命令list of filesls的输出是{<1}}吗?

3 个答案:

答案 0 :(得分:1)

执行ls -al

您会发现当前目录列为.,之前的目录列为..

因此,当您说ls | grep .*.txt时,.将被视为当前包含.txt的当前目录的路径匹配。

答案 1 :(得分:1)

在第一个命令(ls | grep *.txt)中,ls的输出被grep完全忽略,因为它看到:

grep lazy_dog.txt ls-error.txt ls-output.txt ShellCommands.txt TheTimeMachineHGWells.txt

它有一个模式lazy_dog.txt和四个文件,因此它依次读取每个文件以查找模式,并在匹配的输出行前面加上保存模式的文件的名称。如果只有一个文件名,则不会在匹配的行之前列出文件名。

grep搜索包含文字{{ls-error.txtls-output.txtShellCommands.txtTheTimeMachineHGWells.txt的四个文件中唯一的文件1}}是lazy_dog.txt,这就是你在输出中看到的内容。请注意,包含ShellCommands.txt的行也会匹配正则表达式(但不包括shell glob)。

在第二个命令(lazy_dogstxt)中,没有匹配ls | grep .*.txt的文件,因此该参数传递给.*.txt未展开,因此它只有一个模式,因此它读取它的标准输入,这次是grep的输出。所有文件名都与正则表达式ls匹配(即使它们都不匹配shell glob .*.txt),所以它们都列出了。请注意,它还会拾取许多其他行,即使只包含“etxt”,因为.*.txt.元字符(并且grep正则表达式匹配零或更多的任何字符串字符后跟一个任意字符然后.*.txt

答案 2 :(得分:0)

grep将模式.*.txt视为正则表达式,而不是glob

因此,您可以使用ls *.txtls | grep .*txt