从单个 grep 输出多个文件?

从单个 grep 输出多个文件?

我在 shell 脚本编写方面不是很有经验,但我试图了解如何 grep 查找模式,以及如何为每个存在匹配的文件将包含 grep 匹配行的文件写入磁盘。例如:

$ grep -E "MY PATTERN" myfile{1,3}

然后写出包含匹配行的新文件:

matches-myfile1
matches-myfile2
matches-myfile3

这可能吗?我怎样才能做到这一点?我正在寻找答案是 bash 或 zsh。

答案1

Bonsi 有正确的想法,但不是正确的方法(例如,应该如何处理包含空格或其他空白字符的文件名)。这是一种执行此操作的方法bash

for file in myfile{1,3}; do
    grep -E "MY PATTERN" < "$file" > "matches-$file"
done

如果你做过需要存储您应该正确考虑分词的文件,如下所示:

files=( myfile{1,3} )
for file in "${files[@]}"; do
    grep -E "MY PATTERN" < "$file" > "matches-$file"
done

答案2

使用 awk 的一种方法:

awk '/MY PATTERN/{print > "matches-"FILENAME;}' myfile{1,3}

答案3

我认为这是不可能的,但是可以为此构建一个小脚本

#! /bin/bash
files=(file1 file2 file3)
for i in "${files[@]}"; do grep -E "MY PATTERN" < "$i" > matches-"$i"; done

答案4

您可以使用grep输出文件名-H,然后使用awk写入它。

$ grep -H regexp files*  | awk -F : '{ file="matches-" $1; sub("^[^:]+:","",$0); print $0 > file; }'

相关内容