Bash 存储awk查询的状态
非常感谢你看我的帖子。我正在寻找一个脚本,读取一个非常大的域列表,查看哪些域解析,然后只存储解析到另一个文件的域 我目前有一个脚本:Bash 存储awk查询的状态,bash,loops,awk,sed,nslookup,Bash,Loops,Awk,Sed,Nslookup,非常感谢你看我的帖子。我正在寻找一个脚本,读取一个非常大的域列表,查看哪些域解析,然后只存储解析到另一个文件的域 我目前有一个脚本: nslookup < input.txt - 1.1.1.1 -port=53 2>&1 | awk ' NR==FNR { list[NR] = $0; next } /^Name:/ { ++numResults; state="found" } /Non-existent domain/ { ++numR
nslookup < input.txt - 1.1.1.1 -port=53 2>&1 |
awk '
NR==FNR { list[NR] = $0; next }
/^Name:/ { ++numResults; state="found" }
/Non-existent domain/ { ++numResults; state="not found" }
/NXDOMAIN/ { ++numResults; state="not found" }
/No answer/ { ++numResults; state="not found" }
state == "found" { print list[numResults]; state="" }
' input.txt - >> output.txt
但不知何故,列/行没有对齐。例如,在此行中添加会从输出中隐藏total_garbage.com(total_garbage.com不会查找到包含单词“Can.t find”的结果,因此我不知道发生了什么)
问题是
1未处理“找不到”/“没有答案”案例(00038a.net仍在打印)
2未处理“NXDOMAIN”案例(total_garbage.com仍在打印中)
3未处理“名称”案例(输出中缺少0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0-0.info)
最后打印了4个换行符(您可以在我的输出中看到空白)
我的脚本的示例输入:
google.ca
comingsoon.brightside.com
00038a.net
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
total_garbage.com
google.ca
comingsoon.brightside.com
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
所需的脚本输出:
google.ca
comingsoon.brightside.com
00038a.net
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
total_garbage.com
google.ca
comingsoon.brightside.com
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
实际产量:
google.ca
comingsoon.brightside.com
00038a.net
total_garbage.com
nslookupServer: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: google.ca
Address: 216.58.192.131
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
comingsoon.brightside.com canonical name = elb-brightside-17469.aptible.in.
Name: elb-brightside-17469.aptible.in
Address: 54.86.171.167
Name: elb-brightside-17469.aptible.in
Address: 54.174.154.102
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
*** Can't find 00038a.net: No answer
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 178.162.203.226
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 178.162.203.211
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 178.162.203.202
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 85.17.31.122
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 85.17.31.82
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 5.79.71.225
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 5.79.71.205
Name: 0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info
Address: 178.162.217.107
Server: 127.0.0.1
Address: 127.0.0.1#53
** server can't find total_garbage.com: NXDOMAIN
这就是您试图做的吗(使用
cat nslookup.out
对提供的示例进行测试,而不是在本地运行nslookup…|
,这将产生不同于您希望awk脚本解析的输出)
$cat tst.sh
#!/bin/env bash
#nslookup&1|
猫出|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{state=“found”}
/[Cc]an\047t find/{state=“not found”}
!NF&(状态!=“”){
++numResults
如果(状态==“已找到”){
打印列表[numResults]
}
state=“”
}
'input.txt-
$./tst.sh
google.ca
comingsoon.brightside.com
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0-0.info
过去的尝试:
$ cat gravity.list
comingsoon.brightside.com
total_garbage.com
google.com
$ cat tst.sh
#!/bin/env bash
nslookup < gravity.list 2>&1 |
awk '
NR==FNR { list[NR] = $0; next }
/^Name:/ { result = $NF }
/Non-existent domain/ { result = "not found" }
result != "" { print list[++numResults], "->", result; result="" }
' gravity.list -
$ ./tst.sh
comingsoon.brightside.com -> elb-brightside-17469.aptible.in
total_garbage.com -> not found
google.com -> google.com
$cat gravity.list
comingsoon.brightside.com
total_.com
谷歌网站
$cat tst.sh
#!/bin/env bash
nslookup&1|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{result=$NF}
/不存在的域/{result=“未找到”}
结果!=“{打印列表[++numResults],”->“,结果;结果=”“}”
'重力.列表-
$./tst.sh
com->elb-brightside-17469.aptable.in
total_garbage.com->未找到
google.com->google.com
还是这个
$ cat tst.sh
#!/bin/env bash
nslookup < gravity.list 2>&1 |
awk '
NR==FNR { list[NR] = $0; next }
/^Name:/ { ++numResults; state="found" }
/Non-existent domain/ { ++numResults; state="not found" }
state == "found" { print list[numResults]; state="" }
' gravity.list -
$ ./tst.sh
comingsoon.brightside.com
google.com
$cat tst.sh
#!/bin/env bash
nslookup&1|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{++numResults;state=“found”}
/不存在的域/{++numResults;state=“未找到”}
state==“找到”{打印列表[numResults];state=”“}
'重力.列表-
$./tst.sh
comingsoon.brightside.com
谷歌网站
这就是您试图做的(使用cat nslookup.out
对提供的示例进行测试,而不是在本地运行nslookup…
,这将产生与您希望awk脚本解析的输出不同的输出)
$cat tst.sh
#!/bin/env bash
#nslookup&1|
猫出|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{state=“found”}
/[Cc]an\047t find/{state=“not found”}
!NF&(状态!=“”){
++numResults
如果(状态==“已找到”){
打印列表[numResults]
}
state=“”
}
'input.txt-
$./tst.sh
google.ca
comingsoon.brightside.com
0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0-0.info
过去的尝试:
$ cat gravity.list
comingsoon.brightside.com
total_garbage.com
google.com
$ cat tst.sh
#!/bin/env bash
nslookup < gravity.list 2>&1 |
awk '
NR==FNR { list[NR] = $0; next }
/^Name:/ { result = $NF }
/Non-existent domain/ { result = "not found" }
result != "" { print list[++numResults], "->", result; result="" }
' gravity.list -
$ ./tst.sh
comingsoon.brightside.com -> elb-brightside-17469.aptible.in
total_garbage.com -> not found
google.com -> google.com
$cat gravity.list
comingsoon.brightside.com
total_.com
谷歌网站
$cat tst.sh
#!/bin/env bash
nslookup&1|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{result=$NF}
/不存在的域/{result=“未找到”}
结果!=“{打印列表[++numResults],”->“,结果;结果=”“}”
'重力.列表-
$./tst.sh
com->elb-brightside-17469.aptable.in
total_garbage.com->未找到
google.com->google.com
还是这个
$ cat tst.sh
#!/bin/env bash
nslookup < gravity.list 2>&1 |
awk '
NR==FNR { list[NR] = $0; next }
/^Name:/ { ++numResults; state="found" }
/Non-existent domain/ { ++numResults; state="not found" }
state == "found" { print list[numResults]; state="" }
' gravity.list -
$ ./tst.sh
comingsoon.brightside.com
google.com
$cat tst.sh
#!/bin/env bash
nslookup&1|
awk'
NR==FNR{list[NR]=$0;next}
/^名称:/{++numResults;state=“found”}
/不存在的域/{++numResults;state=“未找到”}
state==“找到”{打印列表[numResults];state=”“}
'重力.列表-
$./tst.sh
comingsoon.brightside.com
谷歌网站
就像以前一样-如果您希望您的问题包括简明的、可测试的样本输入(可能是nslookup
中有问题的输出)和您希望帮助编写的脚本的预期输出(可能是awk
中管道之后的nslookup
)然后我们可以最好地帮助您做到这一点。shell脚本中的第一行包括awk'END{print NR}'/etc/pihole/gravity.cleaned | awk'{print$1}'
,这意味着“运行awk脚本打印gravity.cleaned中的行数,然后将该数字传输到第二个awk脚本以打印该数字的第一个空白分隔字段(因为它是一个数字,所以没有空格分隔的恶魔)”。谢谢我把它改成了END=$(awk'END{print NR}'/etc/pihole/gravity.cleaned)
并再次输入。感谢您的耐心确保您在问题中更改了它,而不仅仅是在计算机上的某个本地文件中,没有人能看到您的问题。您的所有脚本都在测试“名称”,但没有“名称”在您发布的示例输入中,您的awk脚本无法将comingsoon.brightside.com
转换为elb-brightside-17469.aptable.in
以您目前发布的内容为准。请让我们清楚、简单地帮助您。就像以前一样-如果您的问题包括简洁、可测试的示例输入(可能是nslookup
)的有问题的输出,以及您想要帮助编写的脚本的预期输出(可能是nslookup
管道之后的awk
脚本),那么我们可以最好地帮您做到这一点。shell脚本的第一行包括awk'END{print NR}/etc/pihole/gravity.cleaned | awk'{print$1}'
m