为什么管道命令“l | grep "1"”会得到错误的结果?

为什么管道命令“l | grep "1"”会得到错误的结果?

如图所示,我使用l获取当前文件夹中的文件。然后我想获取编号为 的文件1,因此我使用pipegrep

但为什么会出现222文件? 还有 是什么1;34m

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

更新

我已经l在我的文件中为该命令添加了别名zshrc

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

该命令的结果如下type

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF

答案1

首先,你正在尝试做的事l| grep <filename>是错误的。不要这么做。原因如下。

l命令实际上是ls -CF

$ type -a l
l is aliased to `ls -CF'

默认情况下,在 Ubuntu 的 中bashls是 的别名ls --color=auto。正如steeldriver 在评论中指出的那样,--color=auto应该关闭着色。在您的特定情况下,您有alias ls="ls -alh --color"alias l="ls -CF",这基本上就是ls -alh --color -CF。这种特定的开关组合仍然通过管道发送彩色输出。例如:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

请注意...目录具有相同的转义序列。

这是什么意思呢

这意味着l将根据文件类型输出彩色文件列表。问题是使用转义序列. 这就是事物的本质1:34m- 它们是特定颜色的转义序列。

主要问题是,解析ls经常会导致错误的输出和脚本中的灾难,仅仅是因为ls允许转义序列(如前所述)和其他特殊字符。有关更多信息,请参阅本文:http://mywiki.wooledge.org/ParsingLs

你应该做的:

使用find命令:

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

[[你可以用 shell glob 和现代测试命令做这样的事情:

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

bash或者也许使用 python,它的文件名处理能力比单独使用要好得多

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

如果不需要处理 的输出ls,简单的通配符ls也可以完成工作。(请记住,这仅用于查看文件列表,而不是将其传递给另一个程序来处理输出文本)

bash-4.3$ ls *1*
1.txt

答案2

您的lls命令被设置为别名。

当您运行它们时,通过管道传输输出grep "1"(使用|),出现的每一条屏幕行都会以红色1显示。1

由于文件名...和出现在同一屏幕行,因此它们也会被输出,2但不会以表示匹配的红色显示。22grepgrep

:34m无法正确绘制的颜色的转义序列。根据您修改的问题,输出为type -a l和 ,type -a它可以在我的系统中重现。请注意,您应该将别名从 更改--color--color=auto

颜色输出

颜色 ls

答案3

在您的试验中,您调用了ls别名,因此1;34m会产生来自着色的类似噪音,由于管道|在同一行上接收所有这些,因此会从该行grep匹配文件1并因此打印该行。这就是您在屏幕上看到的内容。

当你做类似的事情时,最好返回到系统命令,每行显示 1 个结果。

要摆脱别名,只需输入\ls,然后使用选项-1以换行符分隔打印结果。

$ \ls -1 | grep "1"
1
11

注意:反斜杠方法适用于每个命令,\command只调用未别名的系统命令。

相关内容