如何将匹配的行重定向到文件,将不匹配的行重定向到另一个文件?


13

是否已经以优化的方式满足以下要求的脚本/程序/实用程序?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

Answers:


16

您可以使用awk它。

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
我并不完全熟悉,awk但是在什么时候可以评估>?如果每次有条件时都对其进行评估,那么您将获得两个单行文件...
Shadur 2011年

1
@Shadur将>所有输出打印到文件,覆盖现有文件。评估方法不会导致任何新行覆盖相同实例的旧输出awk。也就是说,如果存在多个匹配项,则文件“ match”将包含以分隔的每个匹配项OFS>和之间的区别在于>>对现有文件的处理。
克里斯·

10

这是一个sed示例:
注意:w每次运行脚本时sed的命令都将覆盖现有文件,但仅当该特定的写入命令被触发时;因此rm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

真好 不分支:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti 2015年

6

您可以在awk中附加文件:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

或更短:

awk '{print >>(/pattern/?"matched":"unmatched")}'

他的示例表明,他想覆盖文件(如果存在)而不是附加文件。
克里斯·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.