web-dev-qa-db-fra.com

Comment faire ce que font la tête, la queue, plus, moins, à Powershell?

J'ai besoin de ces commandes pour vérifier le fichier journal sous Windows, mais je n’installe aucun programme et j’aime Powershell avec Windows.

89
Yue Zhang

Get-Content _ (alias: gc) est votre option habituelle pour lire un fichier texte. Vous pouvez alors filtrer davantage:

gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt     # also head
gc log.txt | select -last 10  # tail
gc -Tail 10 log.txt           # also tail (since PSv3), also much faster than above option
gc log.txt | more             # or less if you have it installed
gc log.txt | %{ $_ -replace '\d+', '($0)' }         # sed

Cela fonctionne assez bien pour les petits fichiers, les plus gros (plus de quelques Mo) sont probablement un peu lents.

Les extensions de communauté PowerShell incluent des applets de commande pour les fichiers spécialisés (par exemple, Get-FileTail).

139
Joey

Voici les méthodes intégrées pour faire head et tail. N'utilisez pas de canaux, car si vous avez un fichier volumineux, ce sera extrêmement lent. L'utilisation de ces options intégrées sera extrêmement rapide, même pour des fichiers volumineux.

gc log.txt -head 10 
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
37
wisbucky

more.exe existe sous Windows, les ports de less sont faciles à trouver (et le extensions de communauté PowerShell , PSCX, en inclut un).

PowerShell n'offre pas vraiment d'alternative à des programmes séparés pour l'un ou l'autre, mais pour des données structurées Out-Grid peut être utile.

Head et Tail peuvent être imités avec Select-Object en utilisant le -First et -Last paramètres respectivement.

Les fonctions Sed sont toutes disponibles mais structurées de manière assez différente. Les options de filtrage sont disponibles dans Where-Object (ou via Foreach-Object et certains états pour les plages). D'autres opérations de transformation peuvent être effectuées avec Select-Object et Foreach-Object.

Cependant, lors de la transmission d'objets PowerShell (.NET) - avec toute leur structure typée, par exemple. les dates restent DateTime instances - plutôt que de simples chaînes, dont chaque commande a besoin de s'auto-analyser, une grande partie de sed et d'autres programmes similaires sont redondants.

8
Richard

"-TotalCount" dans cette instance répond exactement comme "-head". Vous devez utiliser -TotalCount ou -head pour exécuter la commande comme ça. Mais -TotalCount est trompeur - cela ne fonctionne pas dans vous donnant réellement aucun compte ...

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

Le script ci-dessus, testé dans PS 5.1, correspond à la réponse SAME ci-dessous ...

gc -head 25 C:\scripts\logs\robocopy_report.txt

Alors utilisez simplement '-head 25 "déjà!

1
Patrick Burwell

Si vous avez besoin d'interroger des fichiers journaux volumineux (ou petits) sous Windows, le meilleur outil que j'ai trouvé est Microsoft, le logiciel gratuit Log Parser 2.2 . Vous pouvez l’appeler à partir de PowerShell si vous le souhaitez et il fera tout le travail lourd pour vous, et très rapidement aussi.

1
What Would Be Cool
$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = “SilentlyContinue” #Suppresses errors
#Script
    #gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
    #gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"}             # cat -n
    gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script 
$ErrorActionPreference = $Push_Pop #Suppresses errors

Vous n'obtenez pas toutes les erreurs avec le code pushpop BTW, votre code ne fonctionne qu'avec l'option "sed". Tout le reste ignore tout sauf gc et path.

0
Patrick Burwell

J'ai eu de meilleures solutions:

gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head
gc log.txt | %{$num=0;}{$num++;"$num $_"}             # cat -n
gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
0
Yue Zhang