我正在制作一个脚本来执行“dig ns google.com”并切断除答案部分之外的所有结果。
到目前为止我有:
#!/bin/bash
echo -n "Please enter the domain: "
read d
echo "You entered: $d"
dr="$(dig ns $d)"
sr="$(sed -i 1,10d $dr)"
tr="$(head -n -6 $sr)"
echo "$tr"
从理论上讲,这应该可行。 sed 和 head 命令在脚本外部单独工作,分别切断前 10 个和后 6 个命令,但是当我将它们放入脚本中时,sed 返回错误,看起来它正在尝试读取变量作为命令而不是输入。错误是:
sed: invalid option -- '>'
到目前为止,我还没有找到一种方法让它读取变量作为输入。我尝试过用“”和“”包围它,但这不起作用。显然,我对整个 bash 脚本编写很陌生,任何帮助都会很棒!
答案1
sed
从标准输入获取输入,而不是从命令行获取输入,因此您的脚本在理论上或实际上都不起作用。 sed -i 1,10d $dr
不会做你认为它会做的事情...sed
会将“$dr”的值视为要处理的文件名列表。
尝试echo "$dr" | sed -e '1,10d'
或sed -e '1,10d' <<<"$dr"
。
顺便说一句,你必须这里使用双引号"$dr"
,否则sed
不会得到以 分隔的多行输入\n
,只会得到一行输入。
sed
或者更好的是,为了仅获取 NS 记录,只需用这一个命令替换所有命令:
tr=$(echo "$dr" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')
或者,消除所有中间步骤并运行以下命令:
tr=$(dig ns "$d" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')
或者您可以通过以下方式仅获取名称服务器的主机名:
tr=$(dig ns "$d" | awk '/IN[[:space:]]+NS[[:space:]]/ {print $5}')
顺便说一句, 的输出host -t ns domain.example.com
可能比 的输出更容易解析dig
。