Command line 程序输出的管道字符串

Command line 程序输出的管道字符串,command-line,pipe,Command Line,Pipe,我有一个程序,每次连续输出3或4行数据(有时第4行是状态更新)。我只想保留第2行(以“cmd:”开头)和第3行(以“prc:”开头),然后去掉前5个字符作为最终输出。有没有办法通过windows命令行执行此操作?到目前为止,我已经: program.exe -flags | FINDSTR /c:"cmd" /c:"prc" | WHAT???? > "output.txt" 更妙的是,有没有办法用逗号替换换行符(除了删除前5个字符),以便输出的两个值对(cmd和prc)在同一行上

我有一个程序,每次连续输出3或4行数据(有时第4行是状态更新)。我只想保留第2行(以“cmd:”开头)和第3行(以“prc:”开头),然后去掉前5个字符作为最终输出。有没有办法通过windows命令行执行此操作?到目前为止,我已经:

 program.exe -flags | FINDSTR /c:"cmd" /c:"prc" |  WHAT???? > "output.txt" 
更妙的是,有没有办法用逗号替换换行符(除了删除前5个字符),以便输出的两个值对(cmd和prc)在同一行上

谢谢你的帮助

还有:是否有任何方法可以在多个文件之间动态分割输出,以便没有一个文件大于10MB或10000行,等等?例如,当“output01.txt”达到10K行时,开始向“output02.txt”发送输出,依此类推?

这里有一个解决方案(编辑:它不会将两行附加到一行中),但对于第二部分,
程序.exe
必须停止并重新启动以更改
输出文件名

这使用了一个名为
repl.bat
-下载自:

repl.bat
放在与批处理文件相同的文件夹中,或放在路径上的文件夹中

program.exe -flags | repl "^(cmd|prc): " "" a >output.txt

对于您的全部需求,Windows批处理不是一个很好的选择。使用许多其他脚本语言(例如VBScript、JScript、PowerShell)可以很容易地解决这个问题。unix UTIL的Windows端口可能也会使工作更容易

但我确实设法想出了一个高效的本地批处理解决方案。它要求将程序输出重定向到临时文件,然后日志脚本从该文件读取。唯一真正的缺点是日志脚本在紧密循环中轮询输入

LOGGER.BAT

@echo off
setlocal enableDelayedExpansion
if "%~1" == ":process:" goto :process

set file=0
set "maxLines=%~2"
if not defined maxLines set "maxLines=10000"
for /l %%. in () do (
  set /a file+=1
  set suffix=00!file!
  set suffix=!suffix:~-3!
  cmd /c ^""%~f0" :process: ^>"%~dpn1!suffix!%~x1"^" || exit
)

:process
set "cnt=0"
set "cmd="
for /l %%. in () do (
  set "ln="
  set /p "ln="
  if defined ln (
    if "!ln:~0,5!" equ "[END]" exit 1
    if defined cmd (
      (echo !cmd!,!ln:~5!)
      set "cmd="
      set /a cnt+=1
      if !cnt! geq !maxLines! exit 0
    ) else if "!ln:~0,5!" equ "cmd: " set "cmd=!ln:~5!"
  )
)
LOGGER.BAT需要两个参数:1)输出文件的基本名称,2)每个输出文件中的最大行数。如果给定的输出文件是“output.txt”,那么记录器将创建“output001.txt”、“output002.txt”等

我假设你的程序最终会结束,要么是它自己,要么是通过一些外部触发器。LOGGER.BAT需要知道输入何时耗尽的方法。它将在看到以
[END]
开头的输入行时终止

以下是如何调用记录器:

(program.exe -flags & echo [END]) >logger.tmp | <logger.tmp LOGGER.BAT output.txt 10000

(program.exe-flags&echo[END])>logger.tmp |使用Unix/Linux工具集,所有这些都要容易上千倍。您可以在Windows上安装几个类似的工作环境,或者在Windows上运行虚拟机非常容易,从而为您提供一个真正完整的Linux环境。Cygwin和mingw是两个成熟的喜欢工作的人。我无法为要安装的VM linux提供名称。我相信其他人可以。祝你好运。如果程序连续运行,那么M选项可能不起作用,因为如果使用M选项,REPL.BAT必须缓冲整个输入直到文件结束。但是,如果没有
M
选项,REPL.BAT无法搜索
\n
——有点麻烦。如果程序连续运行,我看不到使用REPL.BAT解决换行问题的好方法。@dbenham再次感谢。不过,它将很容易删除前导的5个字符。这正是我之前编辑的初衷,但没有达到目的。有一种更简单的方法-
program.exe-flags | repl“^(cmd | prc):“a>output.txt
@dbenham mucho更好。我用它代替了我的答案。