![批处理文件 - 搜索字符串并将下一个单词复制到新文件](https://linux22.com/image/1394909/%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%20-%20%E6%90%9C%E7%B4%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E5%B0%86%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%8D%95%E8%AF%8D%E5%A4%8D%E5%88%B6%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6.png)
大家好。
我想在文件夹中的一堆文本文件中搜索以下字符串:
USER
然后我要复制这个词(USER)旁边的字符串,并将其复制到一个新的文本文件中。
我该怎么做?字符串“USER”旁边的单词将是 FTP 用户名 - 我搜索的所有文件都是 FTP 日志...
谢谢
答案1
您的要求有点模糊。字符串“USER”可能出现在多个上下文中。您对预期行格式的要求越具体,解决方案就越好。
使用本机批处理命令的区分大小写的解决方案会有点棘手。
这是一个本机批处理解决方案不是区分大小写。它会在行首或空格后查找单词“USER”(不区分大小写),后跟一个空格。然后它会跳过一个或多个空格(或制表符),然后写出下一个字符串,直到空格、制表符或行尾。
@echo off
setlocal disableDelayedExpansion
pushd "pathToYourFolder"
>userNames.txt (
for /f delims^=^ eol^= %%A in ('findstr /ri /c:" USER " /c:" USER " *.txt') do (
set "ln=%%A"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
if /i "!ln:~0,5!" equ "USER " (set "ln=!ln:~5!") else set "ln=!ln:* USER =!"
for /f %%B in ("!ln!") do if "%%B" neq "" echo %%B
endlocal
)
)
popd
如果你允许自己超越本机批处理命令,生活会好得多。以下用途REPL.BAT - 一个混合 JScript/批处理实用程序,它对来自 stdin 的行执行正则表达式搜索和替换,并将结果写入 stdout。它是纯脚本,可以在 XP 及以上版本的任何现代 Windows 机器上本地运行。
下面的脚本假设 REPL.BAT 位于您的 PATH 中的某个位置。它会查找单词 USER(区分大小写),后面跟着一个或多个空格字符(最有可能是空格和/或制表符),然后写出下一个“字符串”,直到另一个空格字符。如果您更好地定义您的要求,那么正则表达式很可能可以根据需要轻松修改。
pushd "pathToYourFolder"
findstr USER *.log|repl ".*?:.*\bUSER\s+(\S+).*" $1 a >userNames.txt
popd
答案2
在经典的 bat 中这不完全是一个解决方案。Powershell:
$logfiles = gci $logdir -include "*.log" -recurse
foreach ($file in $logfiles) {
select-string -pattern "USER" $file | foreach { $_.ToString().split(" ")[2] >> $outputfile}
}