标题: [文本处理] 批处理如何在多个文本里寻找关键字并输出? [打印本页]
作者: zhyl887 时间: 2012-4-29 20:48 标题: 批处理如何在多个文本里寻找关键字并输出?
之前发过帖子求助,我也说几句。对于比我强的人我都成为高手,对于上个帖子给别人带来的困惑表示抱歉,由于没有认真阅读版规表示道歉。
文件夹A中,有这么几个文件,AE52.txt,AH93.txt,这些文件都是收集计算机的信息,ip网关之类的。
AE52.txt内容如下:
Windows IP Configuration
Host Name . . . . . . . . . . . . : AE52
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Unknown
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
Ethernet adapter 本地连接:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Intel(R) PRO/100 VE Network Connection
Physical Address. . . . . . . . . : 00-80-87-0E-A8-7A
Dhcp Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 10.3.157.227
Subnet Mask . . . . . . . . . . . : 255.255.255.240
Default Gateway . . . . . . . . . : 10.3.157.238
主机名: AE52
OS 名称: Microsoft Windows XP Professional
OS 版本: 5.1.2600 Service Pack 3 Build 2600
OS 制造商: Microsoft Corporation
OS 配置: 独立工作站
OS 构件类型: Uniprocessor Free
注册的所有人: cds6040t
注册的组织: YH
产品 ID: 76481-641-1465534-23259
初始安装日期: 2012-3-19, 11:51:50
系统启动时间: 0 天 0 小时 4 分 23 秒
系统制造商: Intel Corporation
系统型号: Montara Family of Chipsets
系统类型: X86-based PC
处理器: 安装了 1 个处理器。
[01]: x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz
BIOS 版本: PTLTD - 6040000
Windows 目录: C:\WINDOWS
系统目录: C:\WINDOWS\system32
启动设备: \Device\HarddiskVolume1
系统区域设置: zh-cn;中文(中国)
输入法区域设置: zh-cn;中文(中国)
时区: 暂缺
物理内存总量: 1,014 MB
可用的物理内存: 693 MB
虚拟内存: 最大值: 2,048 MB
虚拟内存: 可用: 2,005 MB
虚拟内存: 使用中: 43 MB
页面文件位置: C:\pagefile.sys
域: YH
登录服务器: \\AE52
修补程序: 安装了 137 个修补程序。
"MNAME","A"
"RESERVE1",""
"RESERVE2",""
"RESERVE3","software\abc_bj_cardbin.txt/10.3.16.114/21/atmftp/atmatm"
"TIMEOUT_CARD","30"
"TIMEOUT_NOTE","60"
"TIMEOUT_VNOTE","150"
"TIMEOUT_WAIT","30"
"TIMEOUT_COMM","60"
"TIMEOUT_IDL","30"
"TIMEOUT_PIN","30"
"TIMEOUT_KEY","30"
"TIMEOUT_KDR","60"
"TIMEOUT_TAKERNOTE","120"
"TIMEOUT_ERRMSG","300"
"DISKSPACE","200"
"TIMERESETCOMM","60"
"TFRACCOUNTLEN","19"
"TFRAMOUNTLEN","8"
"TFRMAXAMOUNT","50000"
"TFRMINAMOUNT","0"
"CWDMAXAMOUNT","3000"
"CSHINMAXCOUNT","100"
"CHANNALNO","0"
"CASSETTEMINNUM","10"
"CashoutCassetteNum","5"
"CashInCassetteNum","6"
"INPUTMAXCOUNT","3"
"INPUTMAXPASSWORD","3"
"INPUTMAXACCOUNT","3"
"MAXRETRACTNUM","100"
"CWDMAXRETRACTNUM","100"
"COMMTYPE","1"
"OUT50NUM","0"
"CashModel","2"
"CUTLEN",""
"ISCHIP","0"
"ISSPBDEVICE","0"
"ISENCRYPT","0"
"ISWRITEONLY","0"
"MultiValidate","3"
"ISMONITOR","0"
"ISMESSAGE","0"
"ISOPERATORTYPE","0"
"ISINTOSUPER","1"
"PINKEY","1111111111111111"
"MACHINEPASS","95599"
"ISCOMPANY","0"
"ISTIMEOUT","0"
"ISCINAMT","0"
"SOFTVER","COLS_ABC_BeiJing_007.007.000_CDS6040T&W"
"ISCSHDEVICE","2"
"ISCSHDEVICESN","2"
"ISCONFIRM","2"
"LUNO","1301AE52"
"BRANCHNAME","FTG82"
"SERIALNAME","A0906013648"
"NETNO","1301"
"ISCARD","1"
"ISKDRDEVICE","3"
"ISJRNDEVICE","1"
"ISCSHDEVICE","2"
"ISEPPDEVICE","2"
"ISPANEL","1"
"ISSCREEN","2"
"ISGIMKS","0"
"DEVICE","CDS6040T"
"ISABIS","0"
"PackVer","00"
"ISCSHDEVICESN","2"
"ISCWDDEVICE","2"
[MAIN PARAMETER]
Version=2
RecvFlag=2
SendSign=0
Debug=0
HostPortNo0=3010
HostPortNo1=0
HostPortNo2=0
HostPortNo3=0
LocalPortNo0=0
LocalPortNo1=0
LocalPortNo2=0
LocalPortNo3=0
PortNo=0
NetAddress=10.3.6.11
[ICMP PARAMETER]
ICMPSign=0
ICMPInterval=30
SendTimeOut=10
RecvTimeOut=60
ICMPStrlen=15
ICMPStr=This is a test!
[LINK PARAMETER]
ReadInterval=1
[THREAD DEFINE]
WaitThreadExitTime=5
WaitThreadStartTime=30
我想做:
每次从文件夹A中读出1个文件,提取出里面的LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频等信息,写到一个a.csv中。(因为csv的文件,可以用excel打开方便)
a.csv的样子像这样
LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频
AE52,1301,3010, 10.3.235.32,255.255.255.240,10.235.3,x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz
AH93,1301,3010, 10.3.235.32,255.255.255.240,10.235.3,x86 Family 15 Model 2 Stepping 9 GenuineIntel ~2791 Mhz
拜谢~!~主要为了方便工作,我知道用for语句可以做,但是弄了半天,没有搞成。
作者: yangfengoo 时间: 2012-4-29 21:28
标题依旧不合格的,你认真读了版规没
作者: canyuexiaolang 时间: 2012-4-29 21:33
lz请把标题改成 在多个文本里寻找关键字并输出
我给你代码。
作者: hfg1977 时间: 2012-4-29 22:11
- @echo off
- :start ============================================================
- echo LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频>>cc.txt
- set "_CPU_BL=0"
- for /f "tokens=* delims=" %%A in ('dir /a-d/b/s "文件夹A\*.txt"') do (
- setlocal enabledelayedexpansion
- for /f "tokens=1,2* usebackq delims=.,=: " %%a in ("%%~A") do (
- if /i "%%~a"=="LUNO" set "_LUNO=%%~b"
- if /i "%%~a"=="NETNO" set "_NETNO=%%~b"
- if /i "%%~a"=="HostPortNo0" set "_HostPortNo0=%%~b"
- if /i "%%~a %%~b"=="IP Address" set "_IP_Address=%%~c"
- if /i "%%~a %%~b"=="Subnet Mask" set "_Subnet_Mask=%%~c"
- if /i "%%~a %%~b"=="Default Gateway" set "_Default Gateway=%%~c"
- if !_CPU_BL!==1 set "_CPU=%%~b %%~c"&set "_CPU_BL=0"
- if /i "%%~a"=="处理器" set "_CPU_BL=1"
- )
- echo !_LUNO!,!_NETNO!,!_HostPortNo0!,!_IP_Address!,!_Subnet_Mask!,!_Default Gateway!,!_CPU!
- endlocal
- )>>cc.txt
-
-
- :end=============================================================
复制代码
作者: apang 时间: 2012-4-29 22:26
本帖最后由 apang 于 2012-4-29 23:12 编辑
- @echo off&setlocal enabledelayedexpansion
- echo LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频>a.csv
- for /f "delims=" %%i in ('dir /b *.txt') do (
- set str=
- for %%a in ("LUNO" "NETNO" "HostPortNo0" "IP Address" "Subnet Mask" "Default Gateway" "Mhz") do (
- for /f "tokens=2 delims=,:=" %%b in ('findstr /i /c:"%%~a" "%%i"') do (
- set "str=!str!,%%~b"
- )
- )
- if not "!str!"=="" echo,!str:~5!>>a.csv
- )
复制代码
作者: CrLf 时间: 2012-4-29 22:33
是工作急用的吧?看楼主这么纠结,干脆按 3 楼的建议帮你改了...
平时看到新会员犯规时常会帮忙改一下,老会员则一贯是警告,下不为例哦~
作者: neorobin 时间: 2012-4-29 22:44
回复 5# apang
用了全角的逗号, 我用的 EXCEL 2003 没有对这样的 CSV 分列
作者: apang 时间: 2012-4-29 22:51
回复 7# neorobin
多谢提醒,已改过来了。
作者: CrLf 时间: 2012-4-29 23:03
回复 7# neorobin
我只知道 xls 默认能识别以 tab 分割的表格或者 htm 表格...比如- @echo off
- set "tab=tab制表符"
- rem 这里请自行替换成实际符号
- (for /l %%a in (1 1 9) do (
- setlocal enabledelayedexpansion
- for %%b in (a b c d e) do set "str=!str!%tab%%%a%%b
- echo !str:~1!
- endlocal
- ))>1.xls
- pause
复制代码
或- @echo off
- (echo ^<table^>
- for /l %%a in (1 1 9) do (
- setlocal enabledelayedexpansion
- for %%b in (a b c d e) do set "str=!str!<td>%%a%%b</td>"
- echo ^<tr^>!str!^</tr^>
- endlocal
- )
- echo ^</table^>)>1.xls
- pause
复制代码
除了 htm 格式和 tab 制表符,是否还有其他可识别的分隔符?
作者: neorobin 时间: 2012-4-29 23:10
回复 9# CrLf
EXCEL 可以打开 CSV 文件, 但不会把全角逗号当分列符,
半角逗号分列, CRLF 分行(仅 CR 或 LF 没测试过, 不知可否)
http://en.wikipedia.org/wiki/Comma-separated_values
http://zh.wikipedia.org/wiki/逗号分隔值
作者: neorobin 时间: 2012-4-29 23:17
回复 9# CrLf
在 EXCEL 打开文件的对话框的文件类型下拉列表框那里就可以看到很多可以打开的文件类型, 事实上我常用的类型也屈指可数
这里也有点说明:
http://office.microsoft.com/assi ... ;LCS=1&respos=4
作者: zhyl887 时间: 2012-4-29 23:33
感谢大家的支持
利用hfg1977 的代码
最后输出多个在ip,掩码,网关后面多了个实心方框,无法正确的排列,我手工修改输出文件cc.txt,将ip,掩码,网关后面实心方框删除,并把cc.txt后缀改成cc.csv后,排列正常。帮忙搞搞输出时候,别让他输出实心方框。
作者: zhyl887 时间: 2012-4-29 23:34
感谢大家的支持
利用hfg1977 的代码
最后输出多个在ip,掩码,网关后面多了个实心方框,无法正确的排列,我手工修改输出文件cc.txt,将ip,掩码,网关后面实心方框删除,并把cc.txt后缀改成cc.csv后,排列正常。帮忙搞搞输出时候,别让他输出实心方框。
作者: hfg1977 时间: 2012-4-30 00:24
ipconfig /all 命令返回的信息每行后面有个"退格键" (CMD环境)
保存为TXT后不会存在.
现在不确定你的实心方框到底是什么.
添加一行过滤,把 换成你自己的.
- ...
- )
- for /f "tokens=1* delims==" %%a in ('set _') do set "%%a=!%%a:=++!"
- echo !_LUNO!.......
复制代码
作者: canyuexiaolang 时间: 2012-4-30 06:49
- ::pushd A 这个A是要处理的文件夹。如果路径中有空格要加引号。比如"E:\E:\Users\Canyue\Te st"
- @echo off & setlocal enabledelayedexpansion
- set "now=%cd%" & pushd A || exit
- set "cline=LUNO;NETNO;HostPortNo0;IP-Address;Subnet-Mask;Default-Gateway"
- set temp=%cline:IP-Address=IP%
- set temp=%temp:Subnet-Mask=子网掩码%
- set temp=%temp:Default-Gateway=网关%
- echo %temp:;=,%,处理器频率 > "%now%\a.csv"
- for /f "tokens=* delims=" %%f in ('dir /b /a-d *.txt') do (call :findc "%%f") >> "%now%\a.csv"
- echo 所有完成。
- pause>nul
- exit
-
- :findc
- setlocal
- for %%i in (%cline%) do (
- set "cfind=%%i" & set "cfind=!cfind:-= !"
- for /f "skip=2 tokens=2 delims==,:" %%j in ('find "!cfind!" "%~1"') do set %%i=%%~j
- )
- for %%i in (%cline%) do call set /p=%%%%i%%,<nul
- for /f "skip=2 tokens=1 delims=[]: " %%i in ('find /n "处理器:" "%~1"') do set line=%%i
- for /f "skip=%line% tokens=2 delims=: usebackq" %%i in ("%~1") do if not defined v echo %%i & set v=b
- endlocal
- goto :eof
复制代码
作者: zhyl887 时间: 2012-4-30 22:57
使用canyuexiaolang 的代码搞定了,谢谢坛友支持。
作者: zhyl887 时间: 2012-5-1 08:41
回复 15# canyuexiaolang
能不能帮忙在增加几个关键字的查找,本来想自己改改,怎知水平有限啊,代码大概能读懂,
第一行为这样:
SERIALNAME,LUNO,NETNO,HostPortNo0,IP,子网掩码,网关,处理器主频,物理内存总量,注册的所有人
SERIALNAME的取值,知道怎么弄,直接在set "cline=SERIALNAME;LUNO; 加上即可。物理内存总量的获取,搞了搞,没搞成,麻烦帮帮忙
作者: yangeren 时间: 2012-5-1 23:00
echo %dirName%&md %dirName%
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |