쉘 스크립트 내에서 패턴 일치를 위해 grep 및 논리 연산자 사용

쉘 스크립트 내에서 패턴 일치를 위해 grep 및 논리 연산자 사용

도메인 목록에 대해 실행되는 dig 명령의 출력에서 ​​특정 패턴을 찾는 스크립트를 개발하려고 합니다. 이를 위해 grep을 사용하고 있지만 여러 논리 연산을 사용하여 이를 구현하는 데 어려움을 겪고 있습니다.

나는 다음과 같은 것을 달성하고 싶습니다 :

if output contains ("NXDOMAIN") and ("test1.com" or "test2.com"); then
echo output;

출력을 grep으로 파이프하여 패턴에 맞게 작동하게 했지만 "NXDOMAIN"논리 연산자를 구현하는 방법을 잃어버렸습니다. 지금까지 내 스크립트는 다음과 같습니다.

#!/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종속성을 추가할 필요가 없습니다 .bashsh

답변2

ANDgrep으로 다시 파이프하여 논리를 생성 하고 OR정규식을 사용하여 논리를 생성할 수 있습니다.

echo "$output" | grep "NXDOMAIN" | grep -E 'test1\.com|test2\.com'

관련 정보