我在文本文件中有以下数据,我想获取特定“节点名称”的主机名:
Node 1 entry:
Node name = NODE1
Comment =
Directory entry type = LOCAL
Protocol = TCPIP
Hostname = 192.168.100.1
Node 2 entry:
Node name = NODE2
Comment =
Directory entry type = LOCAL
Protocol = TCPIP
Hostname = 192.168.100.2
Node 3 entry:
Node name = NODE3
Comment =
Directory entry type = LOCAL
Protocol = TCPIP
Hostname = 192.168.100.3
示例:作为输入,我有“节点名称”,例如节点2。然后我需要搜索 NODE2 下面的 4 行并读取主机名 192.168.100.2。带IP地址的那一行就是我想要的结果。
在 Linux 上这很容易:
grep -A 4 "NODE3" file.txt | grep Hostname
注意:-A 4 用于返回与搜索匹配的行和附加 4 行
或者更好:
grep -A 4 "\<NODE3\>" file.txt | grep Hostname
如果 NODE3 是名称的子字符串,例如:NODE3A,则上述命令将仅严格搜索“NODE3”。
或仅获取 IP 地址(第三列是一个或多个空格,是列之间的分隔符):
grep -A 4 "\<NODE3\>" file.txt | grep Hostname | gawk '{print $3}'
问题:如何使用 Windows native 命令在 Windows 上执行相同的操作?
附注该脚本将在多台 Windows 计算机上运行,我不想在 Windows 上安装其他软件。我知道我可以安装 grep 和其他命令,但我不想这样做。解决方案必须仅使用 Windows 命令(Windows 7、Windows 2008 及更高版本应该可以工作),因为脚本文件(批处理文件)将在多个不同版本的 Windows 上运行,我不允许安装软件,而且我也不允许不想分发其他附加软件。
最佳答案
试试这个
@echo off
set "skip="
set "host="
set "searchNode=NODE2"
for /F "tokens=1,* delims=[]" %%A in ('type file.txt ^| find /I /N "%searchNode%"') do (
if not defined skip set/a skip=%%A & goto :found
)
:found
if not defined skip echo/%searchNode% was not found. & exit/B
rem lines_to_skip = line_found + lines_below - 1
set /a skip+=3
for /F "skip=%skip% tokens=1,* delims=[]" %%A in ('type file.txt ^| find /N /V "^"') do (
for /F "tokens=1,* delims== " %%a in ("%%B") do set "host=%%b" & goto :stop
)
:stop
echo/%host%
exit/B
首先,搜索文件直到匹配所需的字符串,并存储行号。然后,计算要跳过的行(我们搜索第四行,因此行号 + 4 - 1)。最后,重新解析文件,仅读取所需的行。
关于Windows 相当于 Linux 命令 grep -A(返回搜索字符串后的行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031925/