![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-12 09:50 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 遇到文件比较的难题 |
| 可打印版本 1,578 / 11 |
| 第1楼 HUNRYBECKY | 发表于 2009-08-12 00:32 |
| 银牌会员 发帖 442 积分 1,179 | |
|
遇到文件比较的难题 有两个文件f.TXT和L.TXT内容如下:
L.TXT内容如下 使用FC /C F.TXT L.TXT得到结果如下 很明显FC有缺点,我比较时只想找出不同的内容并输入到OK.TXT中,按照上面的两个文件,实际上不同的地方只有C:\windows\system32\notepad.exe notepad.exe 这行文本,我使用FOR来,也没有实现.请问各位高手如何实现这样的效果,主要用来比较进程前后的变化并做出报告,谢谢。 |
|
| 第2楼 HUNRYBECKY | 发表于 2009-08-12 00:54 |
| 银牌会员 发帖 442 积分 1,179 | |
|
找到方法了,好简单好强大的一条命令就可以搞定.
findstr /v /g:f.txt l.txt |
|
| 第3楼 HUNRYBECKY | 发表于 2009-08-13 01:19 |
| 银牌会员 发帖 442 积分 1,179 | |
|
findstr /v /g:f.txt l.txt 好象也有问题,我换成另外两个内容非常长的文件则结果不正确。
|
|
| 第4楼 slore | 发表于 2009-08-13 01:41 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
fc 后再findstr呢?
|
|
| 第5楼 HUNRYBECKY | 发表于 2009-08-13 01:54 |
| 银牌会员 发帖 442 积分 1,179 | |
Originally posted by slore at 2009-8-13 01:41: fc +findstr也难以实现,我主要是比较操作系统里的文件和注册表前后的变化。 据说LINUX下的COMM和DIFF具有这个功能,因为FC命令只能列出两个文件中不同的部分,却没有只列出第二个文件或第一个文件不同的部分,而COMM具有这个功能,但是我没有LINUX,不知道谁能否给我一个看下在WIN下是否正常。 |
|
| 第6楼 HUNRYBECKY | 发表于 2009-08-13 01:56 |
| 银牌会员 发帖 442 积分 1,179 | |
|
这个两个命令如下
果想对两个有序的文件进行比较,可以使用comm命令。 语法:comm [- 123 ] file1 file2 说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。 选项1、2或3抑制相应的列显示。 例如comm - 12就只显示在两个文件中都存在的行; comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行; comm - 123则什么也不显示。 # comm -23 b a >c ##只显示只在b中 不在a中的所有b中的行 注意:使用这个命令前一定要用sort uniq进行排序及除重 不过awk这个优秀的命令也能做到还不用排序处理 awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' file1 file2 找出文件2中不同的值 awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' file1 file2 找出两文件中相同的值 或 awk 'NR==FNR{a[$0]}NR>FNR{ if(!($1 in a)) print $0}' file1 file2 找出文件2中不同的值 awk 'NR==FNR{a[$0]}NR>FNR{ if($1 in a) print $0}' file1 file2 找出两文件中相同的值 ---------------------------------------------------- Diff命令 该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。 语法:diff [选项] file1 file2 说明:该命令告诉用户,为了使两个文件file1和file2一致,需要修改它们的哪些行。如果用“- ”表示file1或fiie2,则表示标准输入。如果file1或file2是目录,那么diff将使用该目录中的同名文件进行比较。例如: diff /usr/xu mine 把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。 通常输出由下述形式的行组成: n1 a n3,n4 n1,n2 d n3 n1,n2 c n3,n4 这些行类似ed命令把filel转换成file2。字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)是针对file2的。字母a、d和c分别表示附加、删除和修改操作。 在上述形式的每一行的后面跟随受到影响的若干行,以“<”打头的行属于第一个文件,以“>”打头的行属于第二个文件。 diff能区别块和字符设备文件以及FIFO(管道文件),不会把它们与普通文件进行比较。 如果file1和file2都是目录,则diff会产生很多信息。如果一个目录中只有一个文件,则产生一条信息,指出该目录路径名和其中的文件名。 diff各选项的含义如下: - b 忽略行尾的空格,而字符串中的一个或多个空格符都视为相等。如How are you与How are you被视为相同的字符串。 - c 采用上下文输出格式(提供三行上下文)。 - C n 采用上下文输出格式(提供n行上下文)。 - e 产生一个合法的ed脚本作为输出。 - r 当file1和file2是目录时,递归作用到各文件和目录上。 |
|
| 第7楼 slore | 发表于 2009-08-13 02:17 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
我主要是比较操作系统里的文件和注册表前后的变化。
regshot32 |
|
| 第8楼 gene771771 | 发表于 2009-08-13 04:33 |
| 初级用户 发帖 77 积分 105 来自 重庆 | |
Originally posted by slore at 2009-8-13 02:17: 用注册表监控RegSpy也可以检测... |
|
| 第9楼 ZJHJ | 发表于 2009-08-13 13:04 |
| 高级用户 发帖 374 积分 609 | |
|
用批处理比较程序变化,比如系统文件的所有exe、inf、dll、或者是所有*.*文件,日期变化,文件大小变化.或增加了文件,单用fc或简单命令都不会使你很满意.如果有几千行或更多........
你是不是想达到这个效果: 检查时间: 2009-08-13 星期四 17:40:04.41 原文件 11648行,913101字节 2008-06-06 06:06 C:\dosh\ghos\38,4 1KG_su.exe ★2008-06-06 06:06 C:\dosh\ghos\38,400 1KG_su.exe 2008-06-16 06:06 C:\dosh\ghos\100,352 gho_run.exe ★2008-06-06 06:06 C:\dosh\ghos\100,352 gho_run.exe 2009-04-29 21:41 C:\ProgramFiles\360Safebox\1,398,281 360safebox.exe ★2009-04-29 21:40 C:\ProgramFiles\360Safebox\1,398,280 360safebox.exe 2009-A6-22 22:14 C:\ProgramFiles\5F800Client\408,737 uninst.exe ★2009-06-22 22:14 C:\ProgramFiles\5F800Client\408,737 uninst.exe 2006-03-30 16:45 C:\ProgramFiles\Adobe\Acrobat7.0\Reader\313,471 AdobeUpdateManager.exe ★2006-03-30 16:45 C:\ProgramFiles\Adobe\Acrobat7.0\Reader\313,472 AdobeUpdateManager.exe 2008-A8-22 19:41 C:\ProgramFiles\CommonFiles\Real\GToolbar\1,256,488 GoogleToolbarInstaller.exe ★2008-08-22 19:41 C:\ProgramFiles\CommonFiles\Real\GToolbar\1,256,488 GoogleToolbarInstaller.exe 2009-07-31 16:42 C:\ProgramFiles\ESET\ESETNOD32Antivirus \68,540 callmsi.exe ★2009-07-30 16:42 C:\ProgramFiles\ESET\ESETNOD32Antivirus \68,520 callmsi.exe 2009-07-30 16:52 C:\ProgramFiles\ESET\ESETNOD32Antivirus \60,280 ecmd.exe ★2009-07-30 16:42 C:\ProgramFiles\ESET\ESETNOD32Antivirus \60,280 ecmd.exe 2008-06-16 13:35 C:\ProgramFiles\SogouInput\193,841 ScdViewer.exe ★2008-06-16 13:35 C:\ProgramFiles\SogouInput\193,840 ScdViewer.exe 2007-05-18 06:27 C:\ProgramFiles\TTPlayer\Plugins\Dfx\Apps\135,A68 record_email.exe ★2007-05-18 06:27 C:\ProgramFiles\TTPlayer\Plugins\Dfx\Apps\135,168 record_email.exe ★2008-02-08 08:47 C:\WINDOWS\drivers\vga\INTEL\Intel_945G-G35\249,856 igfxsrvc.exe 20A8-04-14 20:00 C:\WINDOWS\system32\1,298,432 dxdiag.exe ★2008-04-14 20:00 C:\WINDOWS\system32\1,298,432 dxdiag.exe 2008-A4-14 20:00 C:\WINDOWS\system32\dllcache\20,992 help.exe ★2008-04-14 20:00 C:\WINDOWS\system32\dllcache\20,992 help.exe ★2008-04-14 20:00 C:\WINDOWS\system32\wbem\196,608 wmiadap.exe 结束时间: 17:40:12.98 [ Last edited by ZJHJ on 2009-8-13 at 21:47 ] |
|
| 第10楼 HUNRYBECKY | 发表于 2009-08-17 04:26 |
| 银牌会员 发帖 442 积分 1,179 | |
Originally posted by ZJHJ at 2009-8-13 13:04: 是的,不知道兄弟有没有更好的方法。 |
|
| 第11楼 ZJHJ | 发表于 2009-08-17 06:06 |
| 高级用户 发帖 374 积分 609 | |
|
关键问题是技巧,二个文件的比较(效率)我研究了一年多,网上找的代码,只能适合非常简单的文件比较。二个文件都上万行,就不是容易的事了。因为效率问题只能用FC /L,虽然有缺点,但毕竟第一步就刷掉了99.9% 。关键问题是你要将***** f.txt
,*****L.txt文件分开,找出差异,再合并.用程序名查找排列对比显示。这应该是最佳方案。我在“计算机系统维护”里的“exe、dll、inf 程序快照比较(检查是否被病毒修改)”就是这样写的。 [ Last edited by ZJHJ on 2009-8-17 at 06:26 ] |
|
| 第12楼 HUNRYBECKY | 发表于 2009-08-24 03:59 |
| 银牌会员 发帖 442 积分 1,179 | |
|
已经找到比较好的方法,使用DIFF或WINDIFF,效率比较快,下面是代码
diff -i %cd%\gtools\sysifl.txt %temp%\myget.txt|findstr /i ">">>%report% windiff "%cd%\gtools\sysifl.txt" "%temp%\myget.txt" -sx "%temp%\temp.txt" -fr "%temp%\temp.txt"&type "%temp%\temp.txt"|findstr /v /i /c:"--">>%report% |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |