Shell-Script
在 shell 腳本中使用 grep 和邏輯運算符進行模式匹配
我正在嘗試開發一個腳本,該腳本可以在針對域列表執行的 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 是實現這一目標的最佳方法嗎?
不需要
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
.