Sed:当前一个命令的输出为空时执行替代命令



我想修改dig命令以自动对我在输出中收到的任何 A 记录应用反向查找。

因此,我创建了以下函数:

dt ()
{
remove=$(echo $@ |  sed 's^https*^^' | sed 's^[,/*:]^^g' );
dig any +trace +nocl +nodnssec $remove | sed "s/($remove.*As*([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))/dig -x 2 +short | xargs echo "1 ->"/e"
}

使用此代码,我有以下输出(仅显示记录部分,以避免问题变大):

domain.com.      1200    A        198.54.115.174 -> server224-3.web-hosting.com.

但是,现在我还需要使用从 dig 输出接收的 IP 进行 whois 查找,但前提是dig -x 2 +short没有给出任何结果(stackoverflow.com 可以成为具有 A 记录的域的一个很好的例子没有 PTR)。

我尝试了这样的东西来检查常规host命令的退出代码(因为dig意味着即使输出为空,输出也是成功的)并根据结果执行正确的命令:

dig any +trace +nocl +nodnssec "$remove" | sed -e "s/($remove.*As*([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))/echo -n "1 -> "; host 2 | grep -q ''; if [ ${PIPESTATUS[0]} -eq 0 ]; then dig -x 2 +short; else whois 2 | grep 'network:Network-Name:';fi; /e"

但似乎 sed 以某种方式影响了${PIPESTATUS[0]}数组的值。

我想在 sed 中进行这些修改,因为我需要一些可以在旅途中打印线条的东西。如果我使用变量并修改它们的输出,该函数的运行速度会变慢,至少在视觉上是这样。

也许awk在这里有用,但我不确定我应该如何使用这个命令编写代码。

有没有办法解决这个问题?sed 可以用于此目的还是应该使用其他工具?谢谢。

老式的 bash 为您提供了各种工具grepawkxargswhile read等。将sede命令一起使用,并在内部检查管道状态并执行xargs。只是不可读,读得太长了。我不清楚你想做什么,因为一条线上发生了太多事情。

dig命令在成功时结果为零状态 - 当它"失败"时,您可以检查它的输出是否长度为零。

请考虑以下脚本:

dt () {
remove=$(
<<<$1 
sed 's#^http[s]?://([^/]*).*#1#'
)
dig any +trace +nocl +nodnssec "$remove" |
tr -s 't' |
awk -v "remove=${remove}." '{
if ($1 == remove && $3 == "A") {
print
}
}' |
while IFS= read -r line; do
IFS=$'t' read -r _ _ _ ip _ <<<"$line"
if ! dig_result=$(dig -x "$ip" +short); then
echo "Dig error" >&2
exit 1
fi
if [ -z "$dig_result" ]; then
printf "%s -> no-result-from-dign" "$line"
else
printf "%s -> %sn" "$line" "$dig_result"
fi
done
}
  1. 运行第一个dig。请注意引用了"$remove"
  2. 只是一种预防措施 - 我在输出中挤压制表器。
  3. 然后我过滤 - 第一列应该有一个点"$remove".,第三列应该是一个"A"
  4. 然后对于每行(因为有 meny)
  5. 我得到了IP地址(好吧,也许ip=$(<<<"$line" cut -f4)会更干净,更简单)。
  6. 我使用 IP 地址从dig -x中获取结果
  7. 如果结果为空,我打印
  8. "no-result-from-dig",如果不是,我打印结果。

运行:

dt stackoverflow.com
dt google.pl

输出:

stackoverflow.com.      300     A       151.101.65.69 -> no-result-from-dig
stackoverflow.com.      300     A       151.101.193.69 -> no-result-from-dig
stackoverflow.com.      300     A       151.101.129.69 -> no-result-from-dig
stackoverflow.com.      300     A       151.101.1.69 -> no-result-from-dig
google.pl.      300     A       216.58.215.67 -> waw02s16-in-f3.1e100.net.

您的命令不起作用的原因是$PIPESTATUS在运行 shell 之前"引号内被引用,因此展开。您应该转义$以便$PIPESTATUS或将其传递到非膨胀的单引号" ... "'$PIPESTATUS'" ... "

相关内容

  • 没有找到相关文章

最新更新