도메인 목록에 대해 실행되는 dig 명령의 출력에서 특정 패턴을 찾을 수 있는 스크립트를 개발하려고 합니다. 이를 위해 grep을 사용하지만 여러 논리 연산을 사용하여 이를 달성하는 것은 어렵습니다.
나는 다음과 같은 것을 달성하고 싶습니다 :
if output contains ("NXDOMAIN") and ("test1.com" or "test2.com"); then
echo output;
"NXDOMAIN"
출력을 grep으로 파이핑하여 패턴에 대해 작동하도록 만들었지만 논리 연산자를 구현하는 방법을 모르겠습니다. 지금까지 내 스크립트는 다음과 같습니다.
#!/bin/bash
input="/root/subdomains.txt"
while IFS= read -r line
do
output=$(dig "$line")
if echo "$output" | grep "NXDOMAIN" >&/dev/null; then
echo "$output";
else
echo " " >&/dev/null;
fi
done < "$input"
이를 달성하는 가장 좋은 방법은 grep을 사용하는 것입니까?
답변1
필요하지 grep
않습니다 bash
.
#!/bin/sh -
input="/root/subdomains.txt"
contains() {
case "$1" in
(*"$2"*) true;;
(*) false;;
esac
}
while IFS= read <&3 -r line
do
output=$(dig "$line")
if
contains "$output" NXDOMAIN && {
contains "$output" test1.com || contains "$output" test2.com
}
then
printf '%s\n' "$output"
fi
done 3< "$input"
정말로 사용하고 싶다면 다음과 같이 grep
정의할 수 있습니다 contains
.
contains() {
printf '%s\n' "$1" | grep -qFe "$2"
}
그러나 이는 두 개의 추가 프로세스가 생성되고 대부분의 sh
구현에서 외부 grep
유틸리티가 실행된다는 의미이므로 효율성이 떨어집니다.
또는:
#!/bin/sh -
input="/root/subdomains.txt"
match() {
case "$1" in
($2) true;;
(*) false;;
esac
}
while IFS= read <&3 -r line
do
output=$(dig "$line")
if
match "$output" '*NXDOMAIN*' &&
match "$output" '*test[12].com*'
then
printf '%s\n' "$output"
fi
done 3< "$input"
또는 중개 기능을 사용하지 마세요.
#!/bin/sh -
input="/root/subdomains.txt"
while IFS= read <&3 -r line
do
output=$(dig "$line")
case $output in
(NXDOMAIN)
case $output in
(test1.com | test2.com) printf '%s\n' "$output"
esac
esac
done 3< "$input"
이 방법도 작동 하지만 (아마도 더 빠르고 간결한) 표준이 언제 이를 수행할 수 있는지 bash
에 대한 종속성을 추가하지 않습니다 .bash
sh
답변2
AND
grep을 다시 입력하여 논리를 생성하고 OR
정규식을 사용하여 논리를 생성할 수 있습니다.
echo "$output" | grep "NXDOMAIN" | grep -E 'test1\.com|test2\.com'