각 줄마다 문자열 파일이 있습니다.
예를 들어:
AAAAA
BBBBB
CCCCC
etc
특정 디렉터리의 일련의 파일에 각 문자열이 존재하는지 하나씩 확인하고 싶습니다.
나는 내가 할 수 있는 일이 무엇인지 알고 있습니다. grep -f filename
바로 검색을 하는 것입니다. 하지만 나에게 필요한 것은 더 구체적인 결과를 얻으려면 한 줄에 하나 이상의 정규식을 사용하는 것입니다. 문자열을 포함하는 파일은 크기가 크고 자주 변경되므로 표현식을 추가하기 위해 각 줄을 수정하는 것은 의미가 없습니다.
따라서 나에게 필요한 것은 grep -f filename
파일의 각 줄을 반복하면서(그리고 파일에서 이를 grep하면서) 더 많은 조건을 추가하는 것입니다. 예 AAAAA
를 들어그리고 [0-9]{1,3}$
같은 줄에도 존재합니다.
답변1
grep
파이프라인을 사용하여 이 단계를 단계별로 수행 할 수 있습니다.
grep -f your_file list_of_files|grep -E extra_condition
또는
while read line; do
grep -E -e "$line" -e extra_condition list_of_files
done < your_file
두 경우 모두 -E
다음 형식(예: 숫자 수량자 포함)의 패턴을 사용하려면 [0-9]{1,3}$
전환해야 합니다 .
편집하다
Drav Sloan의 의견 덕분에 우리는 두 번째 버전(loop while
)을 다음과 같이 단순화할 수 있을 뿐만 아니라
grep -E -e "extra_condition" -f your_file list_of_files
하지만 실제로는 패턴을 찾습니다.또는다른 하나는 패턴이 아니다그리고또 다른. 첫 번째 형식을 고수해야 합니다.
답변2
awk
and 를 사용하는 다른 방법을 보여주기 위한 것입니다 grep
.
견본
$ cat patterns.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ cat sample.txt
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
YYYY 1
YYYY 2
예
이상한 #1:
$ awk 'FNR==NR{a[$0]; next}($1 in a)' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
조정이 필요할 가능성이 높지만 조정 방법을 묻는 메시지가 표시됩니다.
이상한 #2:
$ awk 'FNR==NR{a[$0];next};{for (i in a){if (match($0,i)) print}}' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
이는 더 유연하며 샘플 데이터 행 내 어디에서나 패턴 문자열을 처리할 수 있습니다.