Bash

如何讓我的 bash 腳本從變數中刪除前 n 行和後 n 行?

  • April 11, 2016

我正在製作一個腳本來執行“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 腳本的新手,任何幫助都會很棒!

sed從標準輸入而不是命令行獲取輸入,因此您的腳本在理論上或實際上都不起作用。 sed -i 1,10d $dr不做你認為它做的事……sed將“$ dr”的值視為要處理的文件名列表。

嘗試echo "$dr" | sed -e '1,10d'sed -e '1,10d' <<<"$dr"

順便說一句,你必須在這裡使用雙引號"$dr",否則sed將不會得到由 分隔的多行輸入\n,它只會得到一個輸入行。

或者更好的是,要僅獲取 NS 記錄,只需將所有sed命令替換為以下命令:

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

引用自:https://unix.stackexchange.com/questions/275601