好吧,所以我大约一周前问了一个问题,关于如何使用 sed 或 awk 提取两个空白行之间的文本块,以及省略部分提取的文本。我得到的答案几乎满足了我的需求,但现在我正在做一些额外的事情来娱乐(为了强迫症)。
我想在这一轮中对 awk 的输出进行排序。我找到了这个问题和答案,但它并不能完全帮助我解决问题。我也尝试过大量的 awk 文档,试图弄清楚我该如何做到这一点,但无济于事。
所以这是我脚本中完成所有脏工作的代码块:
# This block of stuff fetches the nameservers as reported by the registrar and DNS zone
# Then it gets piped into awk to work some more formatting magic...
# The following is a step-for-step description since I can't put comments inside the awk block:
# BEGIN:
# Set the record separator to a blank line
# Set the input/output field separators to newlines
# FNR == 3:
# The third block of dig's output is the nameservers reported by the registrar
# Also blanks the last field & strips it since it's just a useless dig comment
dig +trace +additional $host | \
awk -v host="$host" '
BEGIN {
RS = "";
FS = "\n"
}
FNR == 3 {
print "Nameservers of",host,"reported by the registrar:";
OFS = "\n";
$NF = ""; sub( /[[:space:]]+$/, "" );
print
}
'
如果我google.com
作为以下值传入$host
(其他主机名可能会产生不同行数的输出),则输出如下:
Nameservers of google.com reported by the registrar:
google.com. 172800 IN NS ns2.google.com.
google.com. 172800 IN NS ns1.google.com.
google.com. 172800 IN NS ns3.google.com.
google.com. 172800 IN NS ns4.google.com.
ns2.google.com. 172800 IN A 216.239.34.10
ns1.google.com. 172800 IN A 216.239.32.10
ns3.google.com. 172800 IN A 216.239.36.10
ns4.google.com. 172800 IN A 216.239.38.10
这个想法是,使用现有的 awk 块,或将 awk 的输出管道化为更多 awk、排序或其他任何组合的组合,使用条件算法对该文本块进行排序:
if ( column 4 == 'NS' )
sort by column 5
else // This will ensure that the col 1 sort includes A and AAAA records
sort by column 1
我对答案的偏好与上一个问题几乎相同:
- 最重要的是,它必须是可移植的,因为我在使用 sed(在 OS X 上必须用 gsed 替换)和 grep 时遇到了 OS X(我的家庭系统)和 Fedora(我在工作中使用的)之间的不同行为 - m 标志(在另一个脚本中使用)
- 非常感谢对解决方案如何工作的解释,作为学习机会比其他任何事情都重要。我已经从上一个问题中提供的 awk 解决方案中学到了很多东西。
- 如果解决方案可以在同一个 awk 块中实现,那也很棒
- 如果不是,那么我可以通过管道 awk 的输出的简单而雄辩的东西就足够了