中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 遇到文件比较的难题 上一主题 | 下一主题
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『楼 主』:  遇到文件比较的难题

有两个文件f.TXT和L.TXT内容如下:
ExecutablePath                         Name                 
                                       System Idle Process  
                                       System               
C:\windows\System32\smss.exe           smss.exe            
C:\windows\system32\csrss.exe          csrss.exe            
C:\windows\system32\winlogon.exe       winlogon.exe         
C:\windows\system32\services.exe       services.exe         
C:\windows\system32\lsass.exe          lsass.exe            
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\System32\svchost.exe        svchost.exe         
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\system32\spoolsv.exe        spoolsv.exe         
C:\windows\system32\nvsvc32.exe        nvsvc32.exe         
D:\SMALL\WINVNC\winvnc.exe             winvnc.exe           
D:\SMALL\WINVNC\winvnc.exe             winvnc.exe           
C:\windows\Explorer.EXE                explorer.exe         
C:\windows\system32\ctfmon.exe         ctfmon.exe           
C:\windows\system32\cmd.exe            cmd.exe              
C:\windows\system32\conime.exe         conime.exe           
C:\WINDOWS\system32\wbem\wmiprvse.exe  wmiprvse.exe         
C:\windows\System32\Wbem\wmic.exe      wmic.exe            
L.TXT内容如下
ExecutablePath                         Name                 
                                       System Idle Process  
                                       System               
C:\windows\System32\smss.exe           smss.exe            
C:\windows\system32\csrss.exe          csrss.exe            
C:\windows\system32\winlogon.exe       winlogon.exe         
C:\windows\system32\services.exe       services.exe         
C:\windows\system32\lsass.exe          lsass.exe            
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\System32\svchost.exe        svchost.exe         
C:\windows\system32\svchost.exe        svchost.exe         
C:\windows\system32\spoolsv.exe        spoolsv.exe         
C:\windows\system32\nvsvc32.exe        nvsvc32.exe         
D:\SMALL\WINVNC\winvnc.exe             winvnc.exe           
D:\SMALL\WINVNC\winvnc.exe             winvnc.exe           
C:\windows\Explorer.EXE                explorer.exe         
C:\windows\system32\ctfmon.exe         ctfmon.exe           
C:\windows\system32\cmd.exe            cmd.exe              
C:\windows\system32\conime.exe         conime.exe           
C:\WINDOWS\system32\wbem\wmiprvse.exe  wmiprvse.exe         
C:\windows\system32\notepad.exe        notepad.exe         
C:\windows\System32\Wbem\wmic.exe      wmic.exe            
使用FC /C F.TXT L.TXT得到结果如下
正在比较文件 f.txt 和 L.TXT>ok.txt
***** f.txt
C:\WINDOWS\system32\wbem\wmiprvse.exe  wmiprvse.exe         
C:\windows\System32\Wbem\wmic.exe      wmic.exe            
***** L.TXT
C:\WINDOWS\system32\wbem\wmiprvse.exe  wmiprvse.exe         
C:\windows\system32\notepad.exe        notepad.exe         
C:\windows\System32\Wbem\wmic.exe      wmic.exe            
*****
很明显FC有缺点,我比较时只想找出不同的内容并输入到OK.TXT中,按照上面的两个文件,实际上不同的地方只有C:\windows\system32\notepad.exe        notepad.exe          这行文本,我使用FOR来,也没有实现.请问各位高手如何实现这样的效果,主要用来比较进程前后的变化并做出报告,谢谢。

2009-8-12 00:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 2 楼』:  

找到方法了,好简单好强大的一条命令就可以搞定.
findstr /v /g:f.txt l.txt

2009-8-12 00:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 3 楼』:  

findstr /v /g:f.txt l.txt 好象也有问题,我换成另外两个内容非常长的文件则结果不正确。

2009-8-13 01:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  

fc 后再findstr呢?



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-8-13 01:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by slore at 2009-8-13 01:41:
fc 后再findstr呢?

fc +findstr也难以实现,我主要是比较操作系统里的文件和注册表前后的变化。
据说LINUX下的COMM和DIFF具有这个功能,因为FC命令只能列出两个文件中不同的部分,却没有只列出第二个文件或第一个文件不同的部分,而COMM具有这个功能,但是我没有LINUX,不知道谁能否给我一个看下在WIN下是否正常。

2009-8-13 01:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 6 楼』:  

这个两个命令如下
果想对两个有序的文件进行比较,可以使用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是目录时,递归作用到各文件和目录上。

2009-8-13 01:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 7 楼』:  

我主要是比较操作系统里的文件和注册表前后的变化。



regshot32



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-8-13 02:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gene771771
初级用户





积分 105
发帖 77
注册 2006-11-9
来自 重庆
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by slore at 2009-8-13 02:17:
我主要是比较操作系统里的文件和注册表前后的变化。



regshot32

用注册表监控RegSpy也可以检测...

2009-8-13 04:33
查看资料  发送邮件  发短消息 网志  OICQ (280385115)  编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 9 楼』:  

用批处理比较程序变化,比如系统文件的所有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 ]

2009-8-13 13:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by ZJHJ at 2009-8-13 13:04:
用批处理比较程序变化,比如系统文件的所有exe、inf、dll、或者是所有*.*文件,日期变化,文件大小变化.或增加了文件,单用fc或简单命令都不会使你很满 ...

是的,不知道兄弟有没有更好的方法。

2009-8-17 04:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 11 楼』:  

关键问题是技巧,二个文件的比较(效率)我研究了一年多,网上找的代码,只能适合非常简单的文件比较。二个文件都上万行,就不是容易的事了。因为效率问题只能用FC /L,虽然有缺点,但毕竟第一步就刷掉了99.9% 。关键问题是你要将***** f.txt
,*****L.txt文件分开,找出差异,再合并.用程序名查找排列对比显示。这应该是最佳方案。我在“计算机系统维护”里的“exe、dll、inf 程序快照比较(检查是否被病毒修改)”就是这样写的。

[ Last edited by ZJHJ on 2009-8-17 at 06:26 ]

2009-8-17 06:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 12 楼』:  

已经找到比较好的方法,使用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%

2009-8-24 03:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: