标题: [文本处理] [已解决]批处理提取文本,但分级与范围之间的指定文本怎么提取? [打印本页]
作者: locoman 时间: 2020-5-15 16:06 标题: [已解决]批处理提取文本,但分级与范围之间的指定文本怎么提取?
本帖最后由 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
作者: xp3000 时间: 2020-5-15 18:46
凑合看看,grep.exe工具的
已经比较长了,换行没添加进去,不然要加管道拉得长三分之一- IPCONFIG /ALL | grep -Po ".*((Bluetooth )?网络连接|无线网络连接|本地连接|描述|地址|掩码|网关|服务器|以太网)(.* ?)?.*:?" >>输出.log
复制代码
作者: locoman 时间: 2020-5-19 16:37
本帖最后由 locoman 于 2020-5-19 16:39 编辑
凑合看看,grep.exe工具的
已经比较长了,换行没添加进去,不然要加管道拉得长三分之一
xp3000 发表于 2020-5-15 18:46
非常感谢您的热心帮助,确实能完成问题需求,唯一的遗憾的就是未能实现“具体文本保存格式要求如下:(每段适配器内容空一行以示区分)”。
想再次麻烦您指导下加入换行空行怎么搞?即使代码长,只能能解决问题。
谢谢您了!!
作者: xp3000 时间: 2020-5-19 21:08
- IPCONFIG /ALL | grep -Po ".*((Bluetooth )?网络连接|无线网络连接|本地连接|描述|地址|掩码|网关|服务器|以太网)(.* ?)?.*:?" | sed "2,$s/以太网/\r\n以太网/g;s/无线局域网/\r\n无线局域网/g" >>输出.log
复制代码
作者: sxw 时间: 2020-5-19 23:15
本帖最后由 sxw 于 2020-5-19 23:18 编辑
使用 Perl 6(现在叫 Raku):- # 定义 Grammar
- unit grammar IPConfig::Grammar;
-
- token TOP { <section>+ %% \n* }
- token section {
- <header>
- \n
- <config>+
- }
-
- token header { ^^ \N+ \n }
- token config { ^^ \s+ \N+ $$ \n* }
-
-
- # 定义 Action
-
- unit class IPConfig::Action;
-
- method TOP($/) {
- make $/<section>».made;
- }
-
- method section($/) {
- my $configs = $/<config>».made;
- if $configs.elems > 0 {
- make ~$/<header> ~ $configs.join("");
- } else {
- make Empty;
- }
- }
-
- method header($/) {
- make ~$/;
- }
-
- method config($/ is copy) {
- my $text = ~$/;
- if $text.contains(/'描述' | '物理地址' | IPv[4|6] ' ' 地址 | '子网掩码' | DNS ' ' 服务器/) {
- $/.make(~$/);
- } else {
- make Empty;
- }
- }
-
- # 调用
-
- use lib '.';
- use IPConfig::Grammar;
- use IPConfig::Action;
-
- my $ipconfig = IPConfig::Grammar.parsefile(
- "ifconfig.txt",
- :actions(IPConfig::Action)
- ).made;
-
- .Str.say for @$ipconfig;
复制代码
作者: locoman 时间: 2020-5-20 11:13
本帖最后由 locoman 于 2020-5-20 11:24 编辑
xp3000 发表于 2020-5-19 21:08
非常感谢您不愿其烦的热心帮助,真是江湖大佬形象,敬佩!钦佩!感谢!感激!
这次修改的代码能分段换行了,但是有点小问题:如:
“ 以太网适配器 以太网:”应该是某段首,结果被拆分成为了:
以太网适配器
以太网:
鉴于这个帖子越弄越有味道了,当然是得以您的技与德的优秀而成,我想请您继续研究一下,以便大家将来都能借鉴使用。
因此,我建议:
注意观察一楼蓝色需求中的每段首,都共同包含有“适配器”字符。
是否可以从这个共有字符“适配器”下手?这样的好处就是程序代码的适应性更强(OS和网卡是会存在变化的)且代码也许更简洁。
1. 凡是含有“适配器”字样的就为一段;
2. 遇到下一段就换行空一行。
代码比如:IPCONFIG /ALL | grep -Po ".*((Bluetooth )?适配器|描述|地址|掩码|网关|服务器)…………
作者: locoman 时间: 2020-5-20 11:16
使用 Perl 6(现在叫 Raku):
sxw 发表于 2020-5-19 23:15
感谢您的热情相助,怎奈水平有限,您的代码我没有搞懂,BAT执行不了。
谢谢您了!
作者: xp3000 时间: 2020-5-20 11:47
我不是大佬哦,只能算爬行中的小白,
关于换行部分,那就在sed的后面部分把复制代码
改为复制代码
,如果有空格区分也可以在适配器后面添加\s
有的人电脑设备还有隧道适配器,可以添加在grep里面用|后面分隔下,sed部分的/g后面添加一个复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |