Shell-Script

在 shell 腳本中使用 grep 和邏輯運算符進行模式匹配

  • June 5, 2019

我正在嘗試開發一個腳本,該腳本可以在針對域列表執行的 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 是實現這一目標的最佳方法嗎?

不需要grepbash在這裡。

#!/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.

引用自:https://unix.stackexchange.com/questions/522988