J'ai essayé d'extraire certaines valeurs égales à 40
pour obtenir le sixième dernier mot de plusieurs lignes dans un fichier .txt avec PowerShell.
J'ai du code jusqu'à présent:
hostname01 hostname02 hostname03 developer host
Fichier Txt: (peut être des lignes en double comme hostname01)
4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100 4626898,0,3,0,POL,INCR,hostname02,xx,1549429809,0000000507,1549430316,xxx,0,15,1,xxxx,51870834,5040,100 4626898,0,3,0,POL,INCR,hostname03 developer host,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100 4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
Voici ce que je veux:
$file = Get-Content 'c:\temp\file.txt' $Array = @() foreach ($line in $file) { $Array += $line.split(",")[6] } $Array $Array | sc "c:\temp\export2.txt"
4 Réponses :
Vous pouvez utiliser un groupe non capturant pour rechercher dans la chaîne le format correct et référencer le nom de votre 6 élément avec le 1er groupe de capture $ 1
:
(?:\d+,\d,\d,\d,[A-Z]+,[A-Z]+,)([a-zA-Z 0-9]+)
(?:)
- Spécifie un groupe sans capture (ce qui signifie qu'il n'est pas référencé via $ 1, ou $ 2 comme vous le feriez normalement avec un groupe de capture \ d +,
(je ne vais pas répéter tout cela, mais) à la recherche d'un ou plusieurs chiffres suivis d'un littéral ,
. [A-Z] +,
- Recherche une chaîne de lettres majuscules, suivie d'un littéral ,
(cela se produit deux fois). az
, AZ
, des espaces et des chiffres jusqu'à un caractère ne figurant pas dans cet ensemble (dans ce cas, une virgule). Vous donner le texte que vous recherchez. Si le champ souhaité est toujours le 6e de la ligne, il est plus facile de diviser chaque ligne et de récupérer le 6e membre:
Get-Content 'c:\temp\file.txt' | Foreach-Object {($_ -split ',')[6]} | Select-Object -Unique
Mais je vais extraire certaines valeurs égales à 40 pour obtenir le sixième dernier mot.
J'ai peur de ne pas comprendre ce que tu veux dire. Désolé.
Je veux dire, je veux juste capturer la ligne qui appartient à la valeur 40
dans telle que 4626898,0,3,0, POL, INCR, hostname01, xx, 1549429809,0000000507,1 549430316, xxx, 0, 40
, 1, xxxx, 51870834,5040, 100.
Ci-dessous devrait fonctionner avec ce que vous essayez de faire
Get-Content 'c:\temp\file.txt' | %{ $_.Split(',')[6] }| select -Unique
Ce n’est pas une solution rapide , mais une solution pratique et flexible :
Comme votre fichier texte est en fait un fichier CSV, vous pouvez utiliser Import-Csv
.
Import-Csv
via son -Header
paramètre. 7
(noms d'hôte) et 14
(le nombre dont la valeur doit être 40
), nous avons besoin pour fournir les noms de colonnes (de notre choix) pour les colonnes 1 à 14. Import-Csv
convertit facilement les lignes CSV en objets (personnalisés), dont vous pouvez interroger les propriétés avec Where-Object
et extraire sélectivement avec Select-Object
; l'ajout de -Unique
supprime les valeurs en double.
Pour tout rassembler:
... | Set-Content c:\temp\export2.txt
Pour plus de commodité, nous avons nommé les colonnes 1
, 2
, ... en utilisant une expression de plage ( 1..14
), mais vous êtes libre d'utiliser des noms descriptifs.
En supposant que c: \ temp \ file.txt
contient vos exemples de données, ce qui précède donne:
hostname01 hostname03 developer host
Pour sortir dans un fichier, dirigez ce qui précède vers Set-Content
, comme dans votre question:
Import-Csv c:\temp\file.txt -Header (1..14) | Where-Object 14 -eq 40 | Select-Object -ExpandProperty 7 -Unique
Il y a une question de suivi relative à la vitesse sur révision du code avec votre code.