Добрый день всем.

Я хочу найти следующую строку в группе текстовых файлов в папке:

USER

Затем я хочу скопировать строку рядом с этим словом (USER) и скопировать ее в новый текстовый файл.

Как мне это сделать? Слово рядом со строкой «USER» будет именем пользователя FTP - Все файлы, в которых я ищу, - это протоколы FTP ...

Спасибо

2 ответа2

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/batch, которая выполняет поиск и замену регулярных выражений в строках из stdin и записывает результат в стандартный вывод. Это чистый скрипт, который изначально запускается на любой современной машине с Windows, начиная с XP.

Сценарий ниже предполагает, что REPL.BAT находится где-то в вашем PATH. Он ищет слово USER (чувствительно к регистру), за которым следуют один или несколько пробельных символов (наиболее вероятные пробелы и / или символы табуляции), а затем записывает следующую "строку" вплоть до другого пробельного символа. Скорее всего, регулярное выражение может быть легко изменено по мере необходимости, если вы лучше определите свои требования.

pushd "pathToYourFolder"
findstr USER *.log|repl ".*?:.*\bUSER\s+(\S+).*" $1 a >userNames.txt
popd
0

Не совсем решение в классической летучей мыши. Powershell:

$logfiles = gci $logdir -include "*.log" -recurse

foreach ($file in $logfiles) {

    select-string -pattern "USER" $file | foreach { $_.ToString().split(" ")[2] >> $outputfile}
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .