Bash
如何讓我的 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 腳本的新手,任何幫助都會很棒!
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
。