Ваши требования немного расплывчаты. Строка "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/batch, которая выполняет поиск и замену регулярных выражений в строках из stdin и записывает результат в стандартный вывод. Это чистый скрипт, который изначально запускается на любой современной машине с Windows, начиная с XP.
Сценарий ниже предполагает, что REPL.BAT находится где-то в вашем PATH. Он ищет слово USER (чувствительно к регистру), за которым следуют один или несколько пробельных символов (наиболее вероятные пробелы и / или символы табуляции), а затем записывает следующую "строку" вплоть до другого пробельного символа. Скорее всего, регулярное выражение может быть легко изменено по мере необходимости, если вы лучше определите свои требования.
pushd "pathToYourFolder"
findstr USER *.log|repl ".*?:.*\bUSER\s+(\S+).*" $1 a >userNames.txt
popd