단일 grep에서 여러 파일을 출력하시겠습니까?

단일 grep에서 여러 파일을 출력하시겠습니까?

나는 쉘 스크립팅에 대한 경험이 많지 않지만 패턴을 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; }'

관련 정보