Windows 相当于 Linux 命令 grep -A(返回搜索字符串后的行)

标签 windows batch-file

我在文本文件中有以下数据,我想获取特定“节点名称”的主机名:

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/

相关文章:

python - 如何在 Microsoft Windows 中执行时立即停止 Python 关闭

windows - 一个简单的 MASM32 程序的奇怪行为

windows - 如何通过在 Windows 中使用批处理替换子字符串来重命名文件

file - 如何使用批处理文件随机重新排列文本文件中的行

windows - 在编译时获取 NSIS 中的文件夹名称

.net - 是什么阻止我的 .NET 2.0 应用程序在 64 位平台上运行?

windows - metro 应用程序中的 OnLaunched 事件和恢复事件有什么区别?

windows - 如何仅在驱动器 C :\? 上向 Shell 菜单添加条目

windows - 将日志数据转换为所需格式的 csv 文件

windows - 将传递的参数重定向到 Windows 批处理文件