中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)請問如何抓取文件中的某一行特定文字
作者:
标题: (已结)請問如何抓取文件中的某一行特定文字 上一主题 | 下一主题
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『楼 主』:  (已结)請問如何抓取文件中的某一行特定文字

請問我下ipconfig > IP.txt
但是我只需要 192.168.1.1 這張網路卡的名字
也就是  IP Address. . . . . . . . . . . . : 192.168.1.1 往上數第4行
要把後面這串文字"Realtek RTL8169/8110 Family Gigabi"設為變數
set CardName=Realtek RTL8169/8110 Family Gigabit
請問要如何做呢 因為卡名會變 但是ip的前面兩組字串不會變 也就是 192.168是固定的 謝謝
Windows 2000 IP Configuration

        Host Name . . . . . . . . . . . . : z-h
        Primary DNS Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Broadcast
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter Lan:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : Realtek RTL8169/8110 Family Gigabit
Ethernet NIC
        Physical Address. . . . . . . . . : 00-0D-61-7A-99-88
        DHCP Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 192.168.1.1
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . :
        DNS Servers . . . . . . . . . . . :

PPP adapter ADSL:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
        Physical Address. . . . . . . . . : 00-53-45-00-33-11
        DHCP Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 61.230.1.1
        Subnet Mask . . . . . . . . . . . : 255.255.255.255
        Default Gateway . . . . . . . . . : 61.230.1.1
        DNS Servers . . . . . . . . . . . : 168.95.1.1
                                            168.95.192.1
[ Last edited by willsort on 2005-10-27 at 20:09 ]

2005-10-26 01:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 2 楼』:  

配合外部命令LMOD可以做到



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-10-26 09:25
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 3 楼』:  

按照你的思路一步步转化为批处理语言就行了。以下是按照你的思路的批处理实现:
@echo off
setlocal
for /f "tokens=1,* delims=:" %%a in ('ipconfig /all ^|findstr/r /n "\<192.168.1.1\>"') do (
        set line=%%a
        )
set /a line-=5
echo.%line%
set CardName=
for /f "tokens=1,2,3 delims=:" %%a in ('ipconfig /all ^|findstr/r /n "."') do (
        set /a n+=1
        if %%a == %line% set CardName=%%c
        )
echo.%CardName%
endlocal
关于 set /a line-=5句为什么减 5,实验发现 ipconfig 会在每句后添加换行符,而使其间距倍翻,你可以测定重设其值。

2005-10-26 13:55
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re JonePeng:

      严格意义上说,LMOD并非外部命令,而是第三方工具软件。所以它才不包含在MSDOS6.22/7.10的安装盘中。

Re 无奈何:

      并非一定要以192.168.1.1起始来取值的,直接find “Description”然后取第一行的值即可。例:

for /f "delims=: tokens=2" %s in ('ipconfig /all ^| find "Des" ^| find /v "WAN"') do @set CardName=%s



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-10-26 14:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 5 楼』:  

:to willsort
含有双、多网卡的机器,如此可能会得到非预想的值,我觉得楼主的思路还是稳妥地。

2005-10-26 15:49
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by willsort at 2005-10-26 14:53:
Re 无奈何:
      并非一定要以192.168.1.1起始来取值的,直接find “Description”然后取第一行的值即可。例:
for /f "delims=: tokens=2" %s in ('ipconfig /all ^| find "Des" ^| find /v "WAN"') do @set CardName=%s

版主阿 我之前有提到 為何要用192.168起始 因為一台電腦可能有兩張以上的網卡 但是只有那個ip是固定的 所以..一定要由那行起始下去算 才能得到正確網卡的名稱
請問有何方法修改呢


妳的批次檔可以正確執行 但是 要把 %s 改成 %%s 才對^^"

[ Last edited by dosfroum on 2005-10-26 at 20:56 ]

2005-10-26 20:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by 无奈何 at 2005-10-26 13:55:
按照你的思路一步步转化为批处理语言就行了。以下是按照你的思路的批处理实现:

不會動 不會動 一堆錯誤還沒領悟出來原因 可以大概解釋一下嗎 謝謝
我有很努力的查了 但是看不出端倪來
        delims=xxx      - 指定分隔符號的集合。  這會取代
                          預設的空白與定位字元的分隔符號集合。
        tokens=x,y,m-n  - 指定每一行的哪些文字串應該被
                          傳到 for 的內部以用來進行每一個重複操作。
                          這會導致額外的變數名稱被配置。
                          m-n 格式代表一個範圍,
                          指定了第 m 個到第 n 個字串項。
                          如果在 tokens= 字串的最後一個字元是
                          星號,則會配置一個額外的變數
                          來接收最後一個字串項被分析後
                          的其它文字。



findstr /?
在檔案中搜尋字串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [strings] [[drive:][path]filename[ ...]]

  /B        如果是在行的開端,則符合類型。
  /E        如果是在行的尾端,則符合類型。
  /L        逐字使用搜尋字串。
  /R        使用搜尋字串為一般表示式。
  /S        在現存目錄及所有的子目錄中
            搜尋符合的檔案。
  /I        指定搜尋不區分大小寫。
  /X        列印完全符合的行數。
  /V        只列印不含相符字串的行數。
  /N        列印每一行符合的行數前的行編號。
  /M        只列印包含相符字串的檔案的檔案名稱。
  /O        列印每一個相符行之前的字元位移。
  /P        略過沒有可列印字元的檔案
  /F:file   從指定的檔案讀取檔案清單 (/ 代表主控台)。
  /C:string 使用特定的字串作為逐字搜尋的字串。
  /G:file   從指定的檔案取得搜尋字串(/ 代表主控台)。
  strings   要搜尋的文字。
  [drive:][path]filename
            指定要搜尋的一個或多個檔案。

除非引數的字首有 /C ,否則請以空格將多重搜尋
字串分開。例如,'FINDSTR "hello there" x.y' 將會在檔案 x.y 中搜尋 "hello",或
"there"。'FINDSTR /C:"hello there" x.y' 將會在檔案 x.y 中搜尋
"hello there"。

@echo on
cls
setlocal
for /f "tokens=1,* delims=:" %%a in ('ipconfig /all ^|findstr/r /n "\<192.168.1.2\>"') do (set line=%%a)
set /a line-=3
echo.%line%
set CardName=
for /f "tokens=1,2,3 delims=:" %%a in ('ipconfig /all ^|findstr/r /n "."') do (set /a n+=1 if %%a == %line% set CardName=%%c)
echo. %CardName%
endlocal

E:\>setlocal

E:\>for /F "tokens=1,* delims=:" %a in ('ipconfig /all |findstr/r /n "\<192.168.
1.2\>"') do (set line=%a )

E:\>(set line=16 )

E:\>set /a line-=3

E:\>echo.13
13

E:\>set CardName=

E:\>for /F "tokens=1,2,3 delims=:" %a in ('ipconfig /all |findstr/r /n "."') do
(set /a n+=1 if %a == 13 set CardName=%c )

E:\>(set /a n+=1 if 2 == 13 set CardName= )
遺失運算元。

E:\>(set /a n+=1 if 4 == 13 set CardName= z-h )
遺失運算元。

E:\>(set /a n+=1 if 5 == 13 set CardName=  )
遺失運算元。

) >(set /a n+=1 if 6 == 13 set CardName= Broadcast
遺失運算元。

) >(set /a n+=1 if 7 == 13 set CardName= No
遺失運算元。

) >(set /a n+=1 if 8 == 13 set CardName= No
遺失運算元。

) >(set /a n+=1 if 10 == 13 set CardName=
遺失運算元。

E:\>(set /a n+=1 if 12 == 13 set CardName=  )
遺失運算元。

E:\>(set /a n+=1 if 13 == 13 set CardName= Realtek RTL8169/8110 Family Gigabit E
thernet NIC )
遺失運算元。

) >(set /a n+=1 if 14 == 13 set CardName= 00-0D-61-7A-88-54
遺失運算元。

) >(set /a n+=1 if 15 == 13 set CardName= No
遺失運算元。

) >(set /a n+=1 if 16 == 13 set CardName= 192.168.1.2
遺失運算元。

) >(set /a n+=1 if 17 == 13 set CardName= 255.255.255.0
遺失運算元。

) >(set /a n+=1 if 18 == 13 set CardName=
遺失運算元。

E:\>(set /a n+=1 if 19 == 13 set CardName=  )
遺失運算元。

) >(set /a n+=1 if 21 == 13 set CardName=
遺失運算元。

E:\>(set /a n+=1 if 23 == 13 set CardName=  )
遺失運算元。

) >(set /a n+=1 if 24 == 13 set CardName= WAN (PPP/SLIP) Interface
遺失運算元。

) >(set /a n+=1 if 25 == 13 set CardName= 00-53-45-00-00-00
遺失運算元。

) >(set /a n+=1 if 26 == 13 set CardName= No
遺失運算元。

) >(set /a n+=1 if 27 == 13 set CardName= 61.230.197.208
遺失運算元。

) >(set /a n+=1 if 28 == 13 set CardName= 255.255.255.255
遺失運算元。

) >(set /a n+=1 if 29 == 13 set CardName= 61.230.197.208
遺失運算元。

E:\>(set /a n+=1 if 30 == 13 set CardName= 168.95.1.1 )
遺失運算元。

E:\>(set /a n+=1 if 31 == 13 set CardName= )
遺失運算元。

E:\>echo.


E:\>endlocal

E:\>
[ Last edited by dosfroum on 2005-10-26 at 21:10 ]

2005-10-26 20:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 8 楼』:  

搞定 原來是 () 的位置影響很大
@echo off
cls
setlocal
for /f "tokens=1,* delims=:" %%a in ('ipconfig /all ^|findstr/r /n "\<192.168\>"') do (set line=%%a)
set /a line-=3
echo.%line%
set CardName=
for /f "tokens=1,2,3 delims=:" %%a in ('ipconfig /all ^|findstr/r /n "."') do (
set /A n+=1
if %%a == %line% set CardName=%%c
)
echo. %CardName%
endlocal
續問 可法幫忙解釋
delims=xxx    tokens=x,y,m-n  這兩個參數 集%%c代表意思
因為我想要試著顯示出該行 IP 但是都顯示:以前的東西 請幫忙解惑
for /f "tokens=1,* delims=:" %%a in ('ipconfig /all ^|findstr /r "192.168"') do (set IPaddr=%%a)
echo. %IPaddr%
結果只顯示這樣 @@a
        IP Address. . . . . . . . . . . .


2005-10-26 21:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 9 楼』:  

總合整理
setlocal,endlocal  <<< 代表什麼意思??
delims=: 表示已冒號做區分
tokens=2 表示用冒號區分成兩段後 取後面那段
tokens=1,2,3 <<< 代表什麼意思??
%%c <<<<<<這個是從哪來的
抓出來的卡名有多一個空白
我的解決方式是
set IA=%IPaddr:~1%
請問 有告好的方法嗎

[ Last edited by dosfroum on 2005-10-26 at 21:56 ]

2005-10-26 21:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 10 楼』:  

1、setlocal,endlocal 表示在其区间内使用自己的环境变量。
2、tokens=1,2,3 delims=: %%a ,表示获取以 : 分割的前3个字符串,分别付值给 %%a,%%b,%%c,后两个是系统自动分配的。
3、多出的空白字符,像你这样取子字符串,排除掉就可以了。

其实你产生问题联机帮助里都有说明,for /? 将显示的内容反复读几遍,for是很强大的命令值得花点功夫学习。

2005-10-26 23:25
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

Re 无奈何 & dosfroum:

      双网卡的情况确实会有问题,多网卡的情形应该很难碰到吧?不过多个网络连接倒是很可能的,所以需要再做一些变化。但是192.168的网卡能说明什么问题呢?是说它是本地连接的网卡(局域网卡)吗?我的本地网卡是10.0起首的。

      我在4楼写的例子是在命令行运行的,而非是批处理,从set前面的@就应该可以看出来;如果是批处理,我会让它结构上更完整和严谨一些,并且加上[code]和[/code]的代码修饰符。

      至于 无奈何 兄的代码,仍然可以再简化一下,不用取行号,只用一个FOR即可将之析出。思路如下:分析IPCONFIG的每行输出,如果遇到Description...则取后面的网卡名,如果遇到192.168...则跳出循环,具体代码就不提供了。

      去除串前空白,用set是最简单的;取IP的那句是因为tokens的问题,应该是tokens=2,这样%%a才会被赋予第2个“令牌”(使用delims切分出来的字符串子串)的值,你的用法使IP地址赋给了%%b。

      至于FOR的中文联机帮助,我建议只看前半部分,后半部分明显是未经校正过的机器翻译结果,不仅语法晦涩难懂,而且给出的usebackq的例句是错误的,不如不看。当然如果你的英文水平可以,可以chcp 437后浏览其英文版。

      FOR是很强大,也因此有很多BUG,我的建议是尽量少用usebackq,否则很容易碰到问题。而且我觉得,完全没有必要把许多功能都集中的FOR一个命令上的,这样只会带来命令的复杂性提高和健壮性下降,如果把它们按照功能分类拆分为几个单独的命令,那就既利于用户学习,也利于编程实现。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-10-27 01:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosfroum
初级用户





积分 154
发帖 54
注册 2005-9-25
状态 离线
『第 12 楼』:  

是有答案了  可是我可不可以續問
willsort版主 妳提到的思路 我想了一下午了 沒頭緒
那我一上午是在做啥呢?想另一個問題 因為某些電腦的網卡會抓到 #2 #3 ....
但是我只要前面那串字阿 不要#2 我有想過用 set 扣掉後面的數字 但是如果遇到沒有#2的狀態 卡名就會被截斷

附帶192.168的網路卡 並不能說明什麼 只是這個是我們設定的規則之一 所以剛好可以由這個字串來找尋

2005-10-28 00:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 13 楼』:  

Re dosfroum:

      那试试这个程序吧
:: GetCard.cmd - Get "Description" of net card that IP address is "192.168.*.*"
:: Will Sort - 2005-10-28 - CMD@WinXP
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%s in ('ipconfig /all') do (
    set line=%%s
    echo.!line! | findstr "Description" >nul && set CardName=!line:~44!
    echo.!CardName! | findstr /r "\<#[0-9]" >nul && set CardName=!CardName:~0,-3!
    echo.!line! | findstr "192.168." >nul && goto EchoName
)
:EchoName
echo CardName="%CardName%"




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-10-28 10:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: