从 cmd 中提取部分文本

从 cmd 中提取部分文本

我需要从文本文件log.txt中提取一部分文本,该文件的内容如下。

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
services                                    0  Disc                        
console                                     1  Conn                        
                   input1                   3  Disc                        
 rdp-tcp#0         input2                   4  Active  rdpwd               
                   input3                   6  Disc                        
 rdp-tcp                                 65536  Listen                      

具体来说,我需要特定用户名的 SESSION ID。需要帮助提取该 ID。任何建议或帮助都将不胜感激。

谢谢。

答案1

下一个脚本展示了使用提取变量的一部分(子字符串)

@ECHO OFF >NUL
SETLOCAL EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%G in ("D:\test\QuerySessionLog.txt") do (
  set "logline=%%~G"
  set "_SESSIONNAME=!logline:~0,18!"
  set "_USERNAME=!logline:~18,18!"
  set "_ID=!logline:~36,11!"
  set "_STATE=!logline:~47,8!"
  set "_TYPE=!logline:~55,7!"
  set "_DEVICE=!logline:~62!"

  echo !logline!
  for /F "tokens=1,* delims==" %%g in ('set _') do (
    set "trimentry=%%h"
    if "!trimentry:~0,1!"==">" (
      call :TRIM !trimentry:~1!
    ) else (
      call :TRIM !trimentry!
    )
    echo %%g=[!trimresult!] ^(raw=[%%h]^) 
  )
  echo( 
) 
:endlocal
ENDLOCAL
goto :eof

:TRIM
  SET "trimresult=%*"
GOTO :EOF

请注意,我绝对不确定列宽的正确性,因为提供了另一个示例query session命令参考显示另一种格式。
但是,列宽可以从标题行计算出来(但这超出了当前问题的主题)。

答案2

这看起来像是固定宽度的数据,所以让我们使用 GNU awk:用户“input2”的 ID 为“4”

$ gawk -v FIELDWIDTHS="19 25 3 99" -v user=input2 '$2 ~ "^"user {print $3}' log.txt
4  

相关内容