Batch File - Procure por string e copie a próxima palavra para novo arquivo

0

Bom dia a todos.

Eu quero pesquisar a seguinte string em vários arquivos TEXT em uma pasta:

USER

Depois, quero copiar a string ao lado desta palavra (USER) e copiá-la para um novo arquivo de texto.

Como faço isso? A palavra ao lado da string 'USER' será um nome de usuário FTP - Todos os arquivos que estou procurando são logs de FTP ...

Obrigado

    
por DextrousDave 23.01.2014 / 12:43

2 respostas

1

Seus requisitos são um pouco vagos. A string "USER" pode aparecer em vários contextos. Quanto mais específico você for quanto ao formato de linha esperado, melhor será a solução.

Uma solução caso sensitiva usando comandos em lote nativo seria um pouco complicada.

Aqui está uma solução de lote nativo que é não sensível a maiúsculas e minúsculas. Ele procura a palavra "USER" (insensível a maiúsculas e minúsculas) no início de uma linha ou depois de um espaço, seguida de um espaço. Em seguida, ele pula um ou mais espaços (ou tabulações) e, em seguida, grava a próxima cadeia até espaço, tabulação ou fim de linha.

@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

A vida é muito melhor se você se permitir ir além dos comandos em lote nativos. Os seguintes usos REPL.BAT - um utilitário JScript / batch híbrido que executa uma pesquisa de expressão regular e substitui as linhas de stdin e grava o resultado para stdout . É um script puro que é executado nativamente em qualquer máquina moderna do Windows a partir do XP.

O script abaixo assume que o REPL.BAT está em algum lugar dentro do seu PATH. Ele procura a palavra USER (sensível a maiúsculas e minúsculas) seguida por um ou mais caracteres de espaços em branco (provavelmente espaços e / ou tabulações) e depois grava a próxima "cadeia" até outro caractere de espaço em branco. É provável que a expressão regular possa ser modificada, se necessário, com bastante facilidade, se você definir melhor suas necessidades.

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

Não é exatamente uma solução no bastão clássico. Powershell:

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

foreach ($file in $logfiles) {

    select-string -pattern "USER" $file | foreach { $_.ToString().split(" ")[2] >> $outputfile}
}
    
por 23.01.2014 / 13:22