我在 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; }'