[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理提取文本,但分级与范围之间的指定文本怎么提取?

本帖最后由 locoman 于 2020-5-22 14:02 编辑

下面这段文本是IPCONFIG/ALL的命令显示结果。
但是,我并不需要这么多的内容,只想提取其部分内容,保存到文本。
谢谢大神热心帮助我解决一下,拜托了!!

--------------------------------------
Windows IP 配置

   主机名  . . . . . . . . . . . . . : Win10-2020QJFDK
   主 DNS 后缀 . . . . . . . . . . . :
   节点类型  . . . . . . . . . . . . : 混合
   IP 路由已启用 . . . . . . . . . . : 否
   WINS 代理已启用 . . . . . . . . . : 否

以太网适配器 本地连接* 9:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :
   描述. . . . . . . . . . . . . . . : Sangfor SSL VPN CS Support System VNIC
   物理地址. . . . . . . . . . . . . : 00-FF-05-0D-13-A2
   DHCP 已启用 . . . . . . . . . . . : 否
   自动配置已启用. . . . . . . . . . : 是

无线局域网适配器 WLAN:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :
   描述. . . . . . . . . . . . . . . : Realtek RTL8192EU Wireless LAN 802.11n USB 2.0 Network Adapter
   物理地址. . . . . . . . . . . . . : 30-B4-9E-40-FF-0C
   DHCP 已启用 . . . . . . . . . . . : 是
   自动配置已启用. . . . . . . . . . : 是

无线局域网适配器 本地连接* 10:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :
   描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter
   物理地址. . . . . . . . . . . . . : 32-B4-9E-40-FF-0C
   DHCP 已启用 . . . . . . . . . . . : 是
   自动配置已启用. . . . . . . . . . : 是

以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
   物理地址. . . . . . . . . . . . . : 54-E1-AD-48-66-22
   DHCP 已启用 . . . . . . . . . . . : 否
   自动配置已启用. . . . . . . . . . : 是
   本地链接 IPv6 地址. . . . . . . . : fe80::4195:49da:a7ec:9e68%6(首选)
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.68(首选)
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.1
   DHCPv6 IAID . . . . . . . . . . . : 324329901
   DHCPv6 客户端 DUID  . . . . . . . : 00-01-00-01-26-4E-B2-11-54-E1-AD-48-66-22
   DNS 服务器  . . . . . . . . . . . : 61.128.128.68
   TCPIP 上的 NetBIOS  . . . . . . . : 已启用
------------------------
提取需求:
——分别提取含有“适配器”文字下面的“描述”、“物理地址”、“IP地址”、“子网掩码“、“默认网关”、“DNS服务器”等信息,保存到d:\wangluo.txt中。
(某些适配器下面可能实际没有“IP地址”、“子网掩码“、“默认网关”、“DNS服务器”等,有,就提取,无,就略过)

具体文本保存格式要求如下:(每段适配器内容空一行以示区分)


以太网适配器 本地连接* 9:
   描述. . . . . . . . . . . . . . . : Sangfor SSL VPN CS Support System VNIC
   物理地址. . . . . . . . . . . . . : 00-FF-05-0D-13-A2

无线局域网适配器 WLAN:
   描述. . . . . . . . . . . . . . . : Realtek RTL8192EU Wireless LAN 802.11n USB 2.0 Network Adapter
   物理地址. . . . . . . . . . . . . : 30-B4-9E-40-FF-0C

无线局域网适配器 本地连接* 10:
   描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter
   物理地址. . . . . . . . . . . . . : 32-B4-9E-40-FF-0C

以太网适配器 以太网:
   描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
   物理地址. . . . . . . . . . . . . : 54-E1-AD-48-66-22
  本地链接 IPv6 地址. . . . . . . . : fe80::4195:49da:a7ec:9e68%6(首选)
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.68(首选)
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.1
   DNS 服务器  . . . . . . . . . . . : 61.128.128.68

凑合看看,grep.exe工具的
已经比较长了,换行没添加进去,不然要加管道拉得长三分之一
  1. IPCONFIG /ALL | grep -Po ".*((Bluetooth )?网络连接|无线网络连接|本地连接|描述|地址|掩码|网关|服务器|以太网)(.* ?)?.*:?" >>输出.log
复制代码

TOP

本帖最后由 locoman 于 2020-5-19 16:39 编辑
凑合看看,grep.exe工具的
已经比较长了,换行没添加进去,不然要加管道拉得长三分之一
xp3000 发表于 2020-5-15 18:46


非常感谢您的热心帮助,确实能完成问题需求,唯一的遗憾的就是未能实现“具体文本保存格式要求如下:(每段适配器内容空一行以示区分)”。
想再次麻烦您指导下加入换行空行怎么搞?即使代码长,只能能解决问题。
谢谢您了!!   

TOP

  1. IPCONFIG /ALL | grep -Po ".*((Bluetooth )?网络连接|无线网络连接|本地连接|描述|地址|掩码|网关|服务器|以太网)(.* ?)?.*:?" | sed "2,$s/以太网/\r\n以太网/g;s/无线局域网/\r\n无线局域网/g" >>输出.log
复制代码

TOP

本帖最后由 sxw 于 2020-5-19 23:18 编辑

使用 Perl 6(现在叫 Raku):
  1. # 定义 Grammar
  2. unit grammar IPConfig::Grammar;
  3. token TOP { <section>+ %% \n* }
  4. token section {
  5.     <header>
  6.     \n
  7.     <config>+
  8. }
  9. token header { ^^ \N+  \n         }
  10. token config { ^^ \s+ \N+ $$ \n*  }
  11. # 定义 Action
  12. unit class IPConfig::Action;
  13. method TOP($/) {
  14.     make $/<section>».made;
  15. }
  16. method section($/) {
  17.     my $configs = $/<config>».made;
  18.     if $configs.elems > 0 {
  19.         make ~$/<header>  ~ $configs.join("");
  20.     } else {
  21.         make Empty;
  22.     }
  23. }
  24. method header($/) {
  25.     make ~$/;
  26. }
  27. method config($/ is copy) {
  28.     my $text = ~$/;
  29.     if $text.contains(/'描述' | '物理地址' | IPv[4|6] ' ' 地址 | '子网掩码' | DNS ' ' 服务器/) {
  30.          $/.make(~$/);
  31.     } else {
  32.         make Empty;
  33.     }
  34. }
  35. # 调用
  36. use lib '.';
  37. use IPConfig::Grammar;
  38. use IPConfig::Action;
  39. my $ipconfig = IPConfig::Grammar.parsefile(
  40.     "ifconfig.txt",
  41.     :actions(IPConfig::Action)
  42. ).made;
  43. .Str.say for @$ipconfig;
复制代码

TOP

本帖最后由 locoman 于 2020-5-20 11:24 编辑
xp3000 发表于 2020-5-19 21:08


非常感谢您不愿其烦的热心帮助,真是江湖大佬形象,敬佩!钦佩!感谢!感激!

这次修改的代码能分段换行了,但是有点小问题:如:
   “ 以太网适配器 以太网:”应该是某段首,结果被拆分成为了:

     以太网适配器
     以太网:


鉴于这个帖子越弄越有味道了,当然是得以您的技与德的优秀而成,我想请您继续研究一下,以便大家将来都能借鉴使用。
因此,我建议:


注意观察一楼蓝色需求中的每段首,都共同包含有“适配器”字符。
是否可以从这个共有字符“适配器”下手?这样的好处就是程序代码的适应性更强(OS和网卡是会存在变化的)且代码也许更简洁。
1. 凡是含有“适配器”字样的就为一段;
2. 遇到下一段就换行空一行。
代码比如:IPCONFIG /ALL | grep -Po ".*((Bluetooth )?适配器|描述|地址|掩码|网关|服务器)…………

TOP

使用 Perl 6(现在叫 Raku):
sxw 发表于 2020-5-19 23:15



   感谢您的热情相助,怎奈水平有限,您的代码我没有搞懂,BAT执行不了。
谢谢您了!

TOP

我不是大佬哦,只能算爬行中的小白,

关于换行部分,那就在sed的后面部分把
  1. 以太网/\r\n以太网/g;
复制代码
改为
  1. 以太网适配器/\r\n以太网适配器/g;
复制代码
,如果有空格区分也可以在适配器后面添加\s

有的人电脑设备还有隧道适配器,可以添加在grep里面用|后面分隔下,sed部分的/g后面添加一个
  1. ;s/隧道适配器/\r\n隧道适配器/g
复制代码

TOP

返回列表