if喜欢
点个赞吧!


背景
大型商业银行的开发经常要承担大量的运维工作。比如机器扩节点要开防火墙。
由于没有OPCM类的管理系统,运行经常要项目组的研发帮忙整理excel。
作为互联网调用有太多的策略要开,前人也没有留有详细的台账。
即使留了台账,中间穿插的需求的策略也特别容易遗漏。
肉眼的比对也不现实不合理。
之前用jquery写了个snippet捕捉某个项目下的所有ip和域名。
(如有需要,欢迎留言)
运维担心run了插件会对配置中心造成不好影响。
在此背景下,研发了bat批量捞取域名和ip的脚本。
欢迎大家提BUG,不定更新。



首先确认要做的事情:
0.开始。
1.循环遍历文件夹和子文件夹并捞出所有配置文件的value值;
2.查找常见协议所在的行,如http,tcp等;
3.正则查找ip;
4.特殊字符替换成指定分隔符,如:空格,括号,双引号等;
5.开始输出域名并写到csv文件;
6.开始输出ip并写到csv文件;
7.删除临时变量txt;
8.结束。
下面欢迎大家指教源码。


源码
findIplist.bat
@echo off&SetLocal EnableDelayedExpansion
echo.
echo.
echo ==============================================================
echo 作者:大米
echo 时间:20210312
echo 请阅读【readme.md】
echo 循环较多,预计需要5分钟,请耐心等待
echo ==============================================================
echo.
set baseLocation=%~dp0
echo ==============================================================
echo 1.开始进行ip域名等查找
echo ==============================================================
echo.
for /R %cd% %%f in (*.properties) do (
for /f "tokens=1,2* delims==" %%i in (%%f) do (
set str=@
echo %%~nf!str!%%j@ >>%~dp0/a.txt
)
)
findstr "http" a.txt >>b.txt
findstr "tcp" a.txt >>b.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" a.txt >>b.txt
echo ==============================================================
echo 2.替换不必要的协议及上下文接口为@
echo ==============================================================
echo.
for /f "delims=" %%k in (b.txt) do (
set afterline1=%%k
set afterline1=!afterline1:https://=@!
set afterline1=!afterline1:http://=@!
set afterline1=!afterline1:/=@!
set afterline1=!afterline1:,=@!
set afterline1=!afterline1:#=@!
set afterline1=!afterline1: =@!
set afterline1=!afterline1:^)=@!
set afterline1=!afterline1:^"=@!
echo !afterline1! >>c.txt
)
findstr "@*.com@" c.txt >> d1.txt
findstr "@*.com:" c.txt >> d1.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" c.txt >>d2.txt
echo ==============================================================
echo 3.开始输出域名,请勿中断,如中断,请删除文件夹下的csv再重新执行
echo ==============================================================
echo.
for /f "tokens=1,2* delims=@" %%i in (d1.txt) do (
set myi = %%i
echo %%i,%%j >> ipList.csv
)
echo ==============================================================
echo 4.开始输出ip,请勿终端,如中断,请删除文件夹下的csv再重新执行
echo ==============================================================
echo.
set "small= abcdefghijklmnopqrstuvwxyz"
set "big= ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rem 输出字母变量
for /l %%a in (1 1 26) do (
echo !small:~%%a,1!>>alf.txt
echo !big:~%%a,1!>>alf.txt
)
for /f "tokens=1* delims=@" %%k in (d2.txt) do (
set TESTLIST=%%l
set TMPLIST=!TESTLIST!
call str.bat !TMPLIST! d3.txt
)
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" d3.txt >>d4.txt
for /f "tokens=1,2* delims=," %%i in (d4.txt) do (
set myi = %%i
echo %%i,%%j >> ipList.csv
)
echo ==============================================================
echo 5.删除临时文件
echo ==============================================================
echo.
rem *.txt
echo ==============================================================
echo 6.恭喜您!执行成功!可关闭窗口退出
echo ==============================================================
echo.
pause
str.bat
@echo off&setlocal enabledelayedexpansion
set TMPLIST=%1
set filename=%2
set /a NUM = 1
:loop
for /f "tokens=1* delims=@" %%a in ("!TMPLIST!") do (
echo %%k,%%a>>!filename!
set /a NUM = NUM + 1
set TMPLIST=%%b
)
if defined TMPLIST goto :loop

01 - 循环遍历文件夹和子文件夹并捞出所有配置文件的value值
第一个循环的目的是读取当前目录下的所有的properties文件,并且将文件名赋值给%%f。
第二个循环的目的是遍历第一个循环找到的文件,按@分隔后,逐行输出value的值。因为配置中心一般以key,value形式存储,key值我们暂时不需要。
for /R %cd% %%f in (*.properties) do (
for /f "tokens=1,2* delims==" %%i in (%%f) do (
set str=@
echo %%~nf!str!%%j@ >>%~dp0/a.txt
)
)
有关for的用法,大家可以在cmd中,输入help for。
token和delims非常常用。delims表示分隔,这里是按等号分隔。而token表示列,这里表示从第一列开始算,总共分成两列。变量为%%i,%%j。
假设有以下数据:
1=2=3=4
那么%%i=1,%%j=2=3=4
我们要的是value值,所以我们取%%j即可。但同时我们需要文件名进行映射,所以我们需要输出%%~nf,表示文件名。
如此以来,我们得到我们的第一个变量文件a.txt,每行的格式是:
文件名@value值
findstr 可以查找并输出所在行,我们排除其他的非ip和域名变量,输出到指定我们的第二个临时变量文件b.txt。
由此,初步的数据清洗已经完成。

02 - 查找常见协议所在的行
步骤01初步清洗了后,由于域名和ip的格式基本固定,为了后续同行拆分方便,将前后无用的一些格式直接替换为我们的分隔符@,便于后续findstr去进行查找。
需要特别注意的是,有些符号需要shift+6进行转义气。如)"
此时输出的临时文件为c.txt
set afterline1=!afterline1:^)=@!
set afterline1=!afterline1:^"=@!

03 - 正则查找ip
关键如标题,注意正则表达式的写法即可。
此时输出的文件为【域名:d1.txt】,【ip为:d2.txt】
findstr "@*.com@" c.txt >> d1.txt
findstr "@*.com:" c.txt >> d1.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" c.txt >>d2.txt

04- 开始输出域名和ip
读取输出的过程大同小异,需要特别注意的是,由于会出现多个ip以逗号或者井号或者其他特殊符号分隔放在一行的情况,详见各种配置文件中集群的配置,如redis,kafka,mq等。因此特别需要注意对每行都需先拆ip分成多行,这样findstr好找。
如:
【文件名A】,192.168.0.1@192.168.0.2@192.168.0.3
变成:
【文件名A】,192.168.0.1
【文件名A】,192.168.0.2
【文件名A】,192.168.0.3
另外由于goto :loop会跳出所有循环,因此在两个for循环的情况下,建议用call。但是call表示的是执行某个脚本,因此要单独做个逐行输出的脚本,否则call的时候会执行到当前脚本的最后一行。和我们在当前for下循环的初衷背离了。
for /f "tokens=1* delims=@" %%k in (d2.txt) do (
set TESTLIST=%%l
set TMPLIST=!TESTLIST!
call str.bat !TMPLIST! d3.txt
)
str.bat行转列bat如下:
set TMPLIST=%1
set filename=%2
set /a NUM = 1
:loop
for /f "tokens=1* delims=@" %%a in ("!TMPLIST!") do (
echo %%k,%%a>>!filename!
set /a NUM = NUM + 1
set TMPLIST=%%b
)
if defined TMPLIST goto :loop
%1 %2表示的是传入变量,这里指的是每行的值以及输出的临时文件的名称。
!TMPLIST!表示行,假设TMPLIST= 今天@天气@很好
那么变量%%a=今天,%%b=天气@很好,并将%%b作为新行,继续循环,直到行为空。找不到行了,则跳出循环。

05 - 删除临时文件
将txt相关的文件删除,由此大功告成。

小结
工欲善其事,必先利其器。
老祖宗传承下来的精华格言还是非常美妙的。
愿我能坚持,至少一月更一篇技术贴或者其他心得!加油!


| 闲谈FGC | 大大与吉吉 | Honk! |
| 妖怪的宫殿 | HEAVY RAIN | HYMN TO BIRTH
| 没了的灵感 | 夜月 | PILIPIA FIRE专栏 | 月光牧童
| pilipia fire-pat3-间奏 | 20111001钢琴曲 | 赞歌
| ChinaTown | 变调421 | ICE | 20121216钢琴曲
| the music 's always with you
| learn to be lonely | the lord bless u and keep u


喜欢就关注我吧!

3月 踏春好季节




