使用 cat 管道进入 grep 返回错误:没有这样的文件或目录

pro*_*ony 0 bash grep pipe cat

我正在练习 bash。当我尝试此命令时,出现错误:“grep: where: No such file or directory”。

cat file2.txt | tr " " "\n" | grep –i where | wc -l
Run Code Online (Sandbox Code Playgroud)
Content of file2.txt = 1 2 3 4 where 5 where 7 where

Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

为什么会出现错误信息

如果您从问题中复制命令并使用 UTF-8 分析它到 Unicode 解释器,则之前i是破折号 U+2013 而不是连字符减号-(U+002D)。这意味着grep–i视为要搜索的模式和要搜索where的文件,该文件不存在 - 正如错误消息所述。

$ echo "grep –i where | wc -l" | utf8-unicode -w 3
0x67           = U+0067
0x72           = U+0072
0x65           = U+0065
0x70           = U+0070
0x20           = U+0020
0xE2 0x80 0x93 = U+2013
0x69           = U+0069
0x20           = U+0020
0x77           = U+0077
0x68           = U+0068
0x65           = U+0065
0x72           = U+0072
0x65           = U+0065
0x20           = U+0020
0x7C           = U+007C
0x20           = U+0020
0x77           = U+0077
0x63           = U+0063
0x20           = U+0020
0x2D           = U+002D
0x6C           = U+006C
$
Run Code Online (Sandbox Code Playgroud)

对于代码utf8-unicode是现在我可以SOQ(堆栈溢出问题)库在GitHub上的文件utf8-unicode-1.11.tgz的子目录。这是当前版本 -utf8-unicode -V报告utf8-unicode: UTF8-UNICODE Version 1.11 (2017-06-12 06:22:15)utf8-unicode -h提供帮助。使用-w 3意味着它为每个代码点留出足够的空间为 3 个字节宽,从而导致更多的列输出(默认为-w 1)。

其他改进

在上面的分析中,我没有更广泛地讨论如何改进脚本。如果你有一个足够现代的 GNU grep,你可以只使用两个命令:

$ grep -iow where file2.txt | wc -l
Run Code Online (Sandbox Code Playgroud)

你不能把它简化为一个命令;使用grep -ciow where file2.txt产量 1,而不是 3(因为只有一个输入行匹配)。

对于非 GNU grep,您可能需要使用:

$ tr ' ' '\n' < file2.txt | grep -ic where
Run Code Online (Sandbox Code Playgroud)

当心 UUoC — 无用的cat.