私は「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"
。それ以外の場合は、区切りの複数行の入力ではなく、1行の入力のみを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
。