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.
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).
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
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.
"-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à!
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.
$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.
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