我正在嘗試編寫一個bash腳本,它將爲文件中的鏈接CNAME記錄提供輸出。我設法只做一個步驟鏈(cname1 CNAME cname2 - > cname2 - >一些A記錄)。Bash腳本在區域文件中顯示CNAME鏈
我想要做的是打印出整個鏈,如果它們之間有多個步驟。
chainA一個10.100.250.22
chainB CNAME chainA
chainC CNAME chainB
chainD CNAME chainC
我想有這樣的輸出: chainD - > chainC - > chainB - > chainA是一條記錄。
到目前爲止,我所有的CNAME記錄提取到一個文件和一個while循環,通過他們迭代,但只找到一個步:
#!/bin/bash
read -e -p "Enter filename (use tab for completion): " file
ls -l "$file"
date=$(date +%m_%d_%y)
echo $date
if [ -f chained_cnames_$date ] ; then
rm chained_cnames_$date
fi
grep -w "CNAME" $file | grep "^[^#;]" > cnames_out
while IFS='' read -r line || [[ -n "$line" ]]
do
echo "Scanning record: $line"
name=$(echo $line | awk '{print $1}' | sed 's/[.].*$//' | awk '{$1=$1};1')
dst=$(echo $line | awk '{print $3}' | sed 's/[.].*$//' | awk '{$1=$1};1')
dst_long=$(echo $line | awk '{print $3}')
dst_long_a=$(dig +noall +answer $dst_long | awk '{print $1}')
if [ "$name" = "$dst" ]
then
ipaddr="$(dig $dst_long +short)"
if [ -z "$ipaddr" ]
then
echo $line " ---> " "NO A RECORD" >> chained_cnames_$date
else
echo $line " ---> " $ipaddr " A record exists, but is not in this zone file.\n It should be like:\n $name CNAME $dst_long_a" >> chained_cnames_$date
fi
else
while IFS='' read -r line1 || [[ -n "$line1" ]]
do
testrec=$(echo $line1 | awk '{print $1}' | awk '{$1=$1};1')
if [ "$dst" = "$testrec" ]
then
echo >> chained_cnames_$date
echo $line " ---> " $line1 >> chained_cnames_$date
echo >> chained_cnames_$date
fi
done < "cnames_out"
fi
done < "cnames_out"
echo
echo
echo "Done! Invalid records are stored in the chained_cnames_$date file."
rm cnames_out
如何創建這樣一個循環?
感謝您指出,這是我的第一篇文章... – stevansv
哦,哎喲,這就是爲什麼你需要包括你的代碼。所以很好的顯示更新你的Q.幾乎可以肯定這可以作爲1 awk腳本來完成。另外,看起來像閱讀'人tsort'可能會幫助你。如果它不能作爲1 awk腳本完成,至少應將'name = $(awk | sed | awk)'這樣的項目減少到'name = $(awk'{sub(s /[.].*$/, 「」,$ 1); $ 1 = $ 1} 1'<<<「$ line」'!回想一下'awk'可以執行多條語句並且具有'sub'和'gsub'(和'gensub')替代函數。這是深夜,我明天再看看能否幫忙。祝你好運。 – shellter
謝謝!我會盡量用tsort解決問題,也可以用tnx來縮短可變縮短的建議,一旦我到達與循環有關的地方,我就會將其納入。 :)。我實際上將盡量減少此類似: '例1 CNAME示例2 例題CNAME example3' ,然後就在那裏檢查與示例3挖,輸出的建議記錄導致 '例1例2 CNAME應該是:例1 CNAME [A_record_output_from_dig_ +答案]' – stevansv