![如何在多个文件上 grep 多个字符串?](https://linux22.com/image/1372045/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%8A%20grep%20%E5%A4%9A%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我正在尝试在多个文件上 grep 多个字符串。这是在 Windows 7 x64 上,我正在使用GNUWin32 的风格。
我有这个命令的 grep.bat:
grep "string1\|string2\|string3\|string4" 20*.csv > out.csv
实际上有 68 个字符串,每个字符串有 11 个字符,因此引号内的字符串长 869 个字符(包括 2 个字符分隔符)。
发生的事情是我得到了输出.csv但它所做的只是在 0 字节和我的 grep 命令的副本之间交替!啊?为什么当我明确告诉 grep 只检查匹配的文件时,它却在搜索 .bat 文件20*.csv?
如果我删除> out.csv
并再次运行 .bat,那么我得到的只是在命令提示符窗口中一遍又一遍重复的命令行。
答案1
这在我的 grep 中有效,它应该在任何平台上都有效。您想要做的是从文件中读取模式。以下是一个例子(请注意“-f-”,即从标准输入 (-) 读取模式):
$ man grep > grep.txt
$ man cat > cat.txt
$ cat > patterns
terminfo
full
should
(此处按 Ctrl+D)
$ cat patterns | grep -f- *.test
cat.test: The full documentation for cat is maintained as a Texinfo manual. If
cat.test: should give you access to the complete manual.
grep.test: This version number should be included in all bug reports (see
grep.test: should avoid both -q and -s and should redirect standard and
grep.test: implementations support \{ instead, so portable scripts should avoid {
grep.test: in grep -E patterns and should use [{] to match a literal {.
grep.test: portable scripts should avoid it.
grep.test: terminfo capability does not apply, when the chosen
grep.test: file name wildcard expansion and therefore should not be treated
grep.test: pcrepattern(3), terminfo(5), glob(7), regex(7).
grep.test: The full documentation for grep is maintained as a TeXinfo manual. If
grep.test: should give you access to the complete manual.
答案2
在 VirtualBox VM 上的 Ubuntu 上使用 grep,并使用 VirtualBox 的共享文件夹功能访问 Windows 主机。这不是我在 GNUWin32 的 grep 中发现的第一个错误。