Fichier de commandes - Recherchez la chaîne et copiez le mot suivant dans le nouveau fichier


0

Bonne journée à tous.

Je veux rechercher la chaîne suivante dans un tas de fichiers TEXT dans un dossier:

USER

Ensuite, je veux copier la chaîne en regard de ce mot (USER) et la copier dans un nouveau fichier texte.

Comment puis-je faire cela? Le mot à côté de la chaîne 'USER' sera un nom d'utilisateur FTP - Tous les fichiers que je cherche sont des journaux FTP ...

Merci

Réponses:


1

Vos exigences sont un peu vagues. La chaîne "USER" peut apparaître dans plusieurs contextes. Plus vous êtes précis quant au format de ligne attendu, meilleure est la solution.

Une solution sensible à la casse utilisant des commandes batch natives serait un peu délicate.

Voici une solution de traitement par lots native qui n’est pas sensible à la casse. Il recherche le mot "USER" (insensible à la casse) au début d'une ligne ou après un espace, suivi d'un espace. Il ignore ensuite un ou plusieurs espaces (ou tabulations), puis écrit la chaîne suivante jusqu'à l'espace, la tabulation ou la fin de ligne.

@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

La vie est bien meilleure si vous vous permettez d'aller au-delà des commandes batch natives. Ce qui suit utilise REPL.BAT - un utilitaire hybride JScript / batch qui effectue une recherche d’expression régulière et remplace les lignes de stdin et écrit le résultat dans stdout . C'est un script pur qui s'exécute de manière native sur n'importe quelle machine Windows moderne à partir de XP.

Le script ci-dessous suppose que REPL.BAT se trouve quelque part dans votre CHEMIN. Il recherche le mot USER (sensible à la casse) suivi d'un ou de plusieurs caractères d'espacement (le plus souvent d'espaces et / ou de tabulations), puis écrit la "chaîne" suivante jusqu'à un autre caractère d'espacement. Il est fort probable que l'expression régulière puisse être modifiée si nécessaire si vous définissez mieux vos besoins.

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

c'est bien. Je vous remercie. Comment puis-je supprimer les entrées en double puisqu'il y a des utilisateurs qui répètent dans les journaux?
DextrousDave

0

Pas vraiment une solution en chauve-souris classique. Powershell:

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

foreach ($file in $logfiles) {

    select-string -pattern "USER" $file | foreach { $_.ToString().split(" ")[2] >> $outputfile}
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.