如何让 bash 脚本从变量中删除前 n 行和最后 n 行?

如何让 bash 脚本从变量中删除前 n 行和最后 n 行?

我正在制作一个脚本来执行“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

相关内容