我经常使用 grep 并且熟悉它返回匹配行(默认情况下)和不匹配行(使用 -v 参数)的能力。但是,我希望能够一次 grep 文件以分隔匹配和不匹配的行。
如果这不可能,请告诉我。我意识到我可以在 perl 或 awk 中轻松做到这一点,但我很好奇 grep 是否可能。
谢谢!
我经常使用 grep 并且熟悉它返回匹配行(默认情况下)和不匹配行(使用 -v 参数)的能力。但是,我希望能够一次 grep 文件以分隔匹配和不匹配的行。
如果这不可能,请告诉我。我意识到我可以在 perl 或 awk 中轻松做到这一点,但我很好奇 grep 是否可能。
谢谢!
如果它不必是 grep - 这是基于模式的单遍拆分 - 模式找到 > 文件 1 模式未找到 > 文件 2
awk '/pattern/ {print $0 > "file1"; next}{print $0 > "file2"}' inputfile
我遇到了完全相同的问题,为此我编写了一个小的 Perl 脚本 [1]。它只接受一个参数:regex
to grep input on。
[1] https://gist.github.com/tonejito/c9c0bffd75d8c81483f9107c609439e1
它逐行读取STDINregex
并检查给定的匹配行到STDOUT,不匹配到STDERR。
我这样做是因为这个工具位于管道的中间,并且我使用 shell 重定向将文件保存在它们的最终位置。
第 1 步:读取文件
第 2 步:用新行替换空格并将结果保存在临时文件中
第 3 步:仅从临时文件中获取包含“_”的行并将其保存到 multiwords.txt
第 4 步:从临时文件中排除包含“-”的行,然后将结果保存到 singlewords.txt
第五步:删除临时文件
cat file | tr ' ' '\n' > tmp.txt | grep '_' tmp.txt > multiwords.txt | grep -v '_' tmp.txt > singlewords.txt | find . -type f -name 'tmp.txt' -delete