![Board logo](images/default/logo.gif)
标题: [网络连接] BAT批量Nslookup后如何格式化输出? [打印本页]
作者: 宫商角徵羽 时间: 2012-12-8 17:13 标题: BAT批量Nslookup后如何格式化输出?
我在list.txt中罗列了需要nslookup的地址表:
www.google.com
www.baidu.com
www.youku.com
www.bathome.net
正如我们所知得到返回结果并不规律:(有的地址会有多个返回值,有的只有一个,况且行数也不规律)
C:\Documents and Settings\admin>nslookup www.google.com
Server: 68.192.128.61.cq.cq.cta.net.cn
Address: 61.128.192.68
Non-authoritative answer:
Name: www.google.com
Addresses: 74.125.128.103, 74.125.128.99, 74.125.128.105, 74.125.128.104
74.125.128.147, 74.125.128.106
C:\Documents and Settings\admin>nslookup www.baidu.com
Server: 68.192.128.61.cq.cq.cta.net.cn
Address: 61.128.192.68
Non-authoritative answer:
Name: www.a.shifen.com
Addresses: 115.239.210.27, 115.239.210.26
Aliases: www.baidu.com
C:\Documents and Settings\admin>nslookup www.youku.com
Server: 68.192.128.61.cq.cq.cta.net.cn
Address: 61.128.192.68
Non-authoritative answer:
Name: fs-w.youku.com
Address: 121.9.204.234
Aliases: www.youku.com
C:\Documents and Settings\admin>nslookup www.bathome.net
Server: 68.192.128.61.cq.cq.cta.net.cn
Address: 61.128.192.68
Non-authoritative answer:
Name: www.bathome.net
Address: 117.25.131.86
我想做到的是通过批量nslookup按照如下显示(左边显示IP地址,右边显示网址)输出到Answer.txt文件中:
74.125.128.103#www.google.com
74.125.128.99#www.googel.com
74.125.128.105#www.googel.com
74.125.128.104#www.googel.com
74.125.128.147#www.googel.com
74.125.128.106#www.googel.com
115.239.210.27#www.baidu.com
。。。。。。。。
更深一步想:若是能再调用Ping筛选出每个网址中最快的IP保存更好了,不过我知道罗马并不是一天练成的,呵呵
作者: Cameron 时间: 2012-12-9 16:34
将每个域名的查询结果通过管道传递给一个进行正则查找的脚本,然后用正则查找抓出IP地址,追加到一个文本文件,每行后跟本次查询的域名。
关于正则查找的脚本可参考http://www.bathome.net/thread-19174-1-1.html。
作者: 宫商角徵羽 时间: 2012-12-10 12:43
非常感谢楼上的回答,不过我正在学习批处理,冷不丁的给我个VBS还真接受不了。
请问,用批处理有没有可以解决的方案呢? 这样复杂的查找功能在批处理中又是如何实现的呢?
再次感谢!
作者: apang 时间: 2012-12-10 14:03
- @echo off
- (for /f "delims=" %%a in (List.txt) do (
- for /f "tokens=1* delims=: " %%b in ('nslookup %%a 2^>nul') do (
- if defined flag (
- if /i "%%b"=="Addresses" (
- for %%d in (%%c) do echo,%%d#%%a
- ) else if /i "%%b"=="Address" echo,%%c#%%a
- set "flag="
- )
- if /i "%%b"=="Name" set flag=1
- )
- ))>Answer.txt
复制代码
作者: 宫商角徵羽 时间: 2012-12-10 23:08
嗯,行家一出手果然就不一样,困扰我好几天的问题就这样被你化解了,佩服佩服!
不过,执行结果还不是最完美,nslookup第一项www.google.com 本身有六个返回结果,代码执行后只有四个返回:
74.125.128.106#www.google.com
74.125.128.104#www.google.com
74.125.128.103#www.google.com
74.125.128.105#www.google.com
这个问题又如何完善呢?
---------nslookup www.google.com------------
Non-authoritative answer
Name: www.google.com
Addresses: 74.125.128.103, 74.125.128.99, 74.125.128.105, 74.125.128.104
74.125.128.147, 74.125.128.106
--------好好学习 天天向上-------------
作者: apang 时间: 2012-12-11 09:29
试试看吧。。。- @echo off
- (for /f "delims=" %%a in (List.txt) do (
- for /f "skip=1 delims=" %%b in ('nslookup %%a^|findstr "[0-9]$"') do (
- set "addr=%%b"
- setlocal enabledelayedexpansion
- set "addr=!addr:*:=!"
- for %%c in (!addr!) do echo,%%c#%%a
- endlocal
- )
- ))>Answer.txt
复制代码
作者: 宫商角徵羽 时间: 2012-12-11 13:33
本帖最后由 宫商角徵羽 于 2012-12-12 12:44 编辑
恩,感谢apang的回复,运行得到所要的结果了
这下对批处理又更崇拜了![](images/smilies/default/loveliness.gif)
请教一下:
第二个代码中的“set "addr=!addr:*:=!" ”部分该怎么理解呢? 特别是两个!中的部分"addr:*:=" 看不明白,求指点?
其中的“冒号 星号 冒号 等号 ”代表什么意思,这属于批处理学习资料中的哪部分内容,我能在哪找到更细致的讲解?
再次感谢 apang !![](images/smilies/default/hug.gif)
作者: 宫商角徵羽 时间: 2012-12-11 13:42
另外(好像有点贪心哦),呵呵
根据第二个代码进行编写进一步使用Ping对每个域名返回的多个IP地址进行测试(如果只有一个则不再测),返回最快的那个作为结果进行保存,还是如下格式保存:
XXX.XXX.XXX.XXX#www.12345.com
XXX.XXX.XXX.XXX#www.23456.com
----------在以下IP地址中选择PING返回最快的------------
Non-authoritative answer:
Name: www.google.com
Addresses: 74.125.128.103, 74.125.128.99, 74.125.128.105, 74.125.128.104
74.125.128.147, 74.125.128.106
——————————当然另写一个也好,新思路总会有新收获,谢!—————————
作者: 学习ing 时间: 2012-12-11 15:25
作为技术研究,楼上的各位讨论的很好,不过我个人猜测,楼主是想解决某些问题,我给我推荐个网址去看吧
code.google.com/p/huhamhire-hosts
![](images/smilies/default/lol.gif)
作者: 宫商角徵羽 时间: 2012-12-11 18:07
9楼同学也不是社会主义好青年嘛,哈哈。
不要忘记,毛主席教导我们:自己动手丰衣足食。
好好学习BAT吧,通过这些天的了解,我还知道它能做的还不只此呢,呵呵。
作者: BAT-VBS 时间: 2012-12-11 22:25
回复 7# 宫商角徵羽
环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
作者: 宫商角徵羽 时间: 2012-12-12 12:41
本帖最后由 宫商角徵羽 于 2012-12-12 12:43 编辑
回复 11# BAT-VBS
我主要想问这个变量替换中的set "addr=!addr:*:=!"中“冒号 星号 冒号 等号” 连起来用是表示什么呢?
如你所知,标点符号在搜索引擎中是搜不出来的,所以不知道到哪找答案。
作者: apang 时间: 2012-12-12 13:58
回复 12# 宫商角徵羽
set "addr=!addr:str1=str2!" 意思是:将变量addr值中的字串str1替换成字串str2
那么,set "addr=!addr:*:=!" 就是将字串*:替换成空(即删除*:)
星号(*)可以理解为通配符,指addr值中第一个冒号(:)之前的所有字符
假设addr值为Addresses: 74.125.128.103, 74.125.128.99, 74.125.128.105, 74.125.128.104
*:就是指Addresses:
set "addr=!addr:*:=!" 是将Addresses:替换为空(删除)后,剩下的部分再赋值给变量addr
如果还不明白,看这里:http://www.bathome.net/thread-14927-1-1.html
作者: BAT-VBS 时间: 2012-12-12 18:46
回复 12# 宫商角徵羽
表示字符串替换,详见13楼。
作者: 宫商角徵羽 时间: 2012-12-13 13:19
恩,这下看明白了,多谢![](images/smilies/default/loveliness.gif)
作者: dqcmjx 时间: 2015-1-3 13:12
今天我遇到了类似的问题,不过找到了更简洁的代码,分享下:- @echo off
- pushd %~dp0
- setlocal enabledelayedexpansion
- (for /f %%a in (list.txt) do (
- for /f "skip=1 tokens=1,2 delims=: " %%i in ('nslookup %%a 2^>nul^|findstr "[0-9]$"') do echo %%j#%%a
- ))>Answer.txt
复制代码
作者: lantern 时间: 2015-1-7 00:29
本帖最后由 lantern 于 2015-1-7 00:48 编辑
回复 16# dqcmjx
如果domain.txt存放要查询的域名,dns.txt存放要查询的DNS,该怎么写?谢谢
假设domain.txt- google.com
- google.com.hk
- google.com.tw
复制代码
dns.txt- 8.8.8.8
- 8.8.4.4
- 114.114.114.114
- 114.114.115.115
复制代码
需要执行:复制代码
改成这样执行后Answer.txt里没有内容- @echo off
- pushd %~dp0
- setlocal enabledelayedexpansion
- for /f %%a in (domain.txt) do (
- for /f %%b in (dns.txt) do (
- for /f "skip=1 tokens=1,2 delims=: " %%i in ('nslookup %%a %%b 2^>nul^|findstr "[0-9]$"') do echo %%j#%%a
- ))>Answer.txt
复制代码
作者: lxzzr 时间: 2015-1-7 13:38
回复 1# 宫商角徵羽
http://www.enun.net/?p=1376
作者: dqcmjx 时间: 2015-1-7 17:13
回复 17# lantern
可以改成这样:- @echo off
- pushd %~dp0
- setlocal enabledelayedexpansion
- (for /f %%a in (domain.txt) do (
- for /f %%b in (dns.txt) do (
- for /f "skip=1 tokens=1,2 delims=: " %%i in ('nslookup -qt^=a %%a %%b 2^>nul^|findstr "[0-9]$"') do echo %%j#%%a
- )
- ))>Answer.txt
复制代码
我测试了,Answer.txt的内容如下:
173.194.72.102#google.com
173.194.72.139#google.com
173.194.72.100#google.com
173.194.72.138#google.com
173.194.72.101#google.com
173.194.72.113#google.com
……(太长,后面省略)
作者: lantern 时间: 2015-1-7 21:04
回复 lantern
可以改成这样:我测试了,Answer.txt的内容如下:
173.194.72.102#google.com
173.194 ...
dqcmjx 发表于 2015-1-7 17:13 ![](http://www.bathome.net/images/common/back.gif)
为何在我这里执行完Answer.txt还是没内容呢?奇怪...
代码没错吧?
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |