Мне нужны эти команды для проверки файла журнала в Windows, но я не устанавливаю какую-либо программу, и мне нравится Powershell с Windows.
Как сделать то, что голова, хвост, больше, меньше, sed делают в Powershell?
Ответ 1
Get-Content
(псевдоним: gc
) - ваш обычный вариант для чтения текстового файла. Затем вы можете фильтровать далее:
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
Это работает достаточно хорошо для небольших файлов, более крупные (более нескольких MiB), вероятно, немного медленнее.
Расширения сообщества PowerShell включают некоторые командлеты для специализированных файлов (например, Get-FileTail).
Ответ 2
Вот встроенные способы сделать head
и tail
. Не используйте трубы, потому что, если у вас большой файл, он будет очень медленным. Использование этих встроенных параметров будет чрезвычайно быстрым даже для огромных файлов.
gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
Ответ 3
more.exe
существует в Windows, легко найти порты less
(и Расширения сообщества PowerShell, PSCX, включает в себя один).
PowerShell на самом деле не предоставляет альтернативы отдельным программам для них, но для структурированных данных Out-Grid
может быть полезно.
Head
и Tail
могут быть эмулированы с помощью Select-Object
с использованием параметров -First
и -Last
соответственно.
Sed
все функции доступны, но структурированы по-разному. Параметры фильтрации доступны в Where-Object
(или через Foreach-Object
и некоторое состояние для диапазонов). Другие, преобразования, операции могут выполняться с помощью Select-Object
и Foreach-Object
.
Однако, поскольку PowerShell передает (.NET) объекты - со всей их типизированной структурой, например. даты остаются DateTime
экземплярами, а не просто строками, которые каждая команда должна анализировать сама, большая часть Sed
и другие такие программы являются избыточными.
Ответ 4
Если вам нужно запросить большие (или маленькие) файлы журналов в Windows, лучшим инструментом, который я нашел, является Microsoft бесплатно Log Parser 2.2. Вы можете называть его из PowerShell, если хотите, и он сделает все тяжелое занятие для вас и очень быстро.
Ответ 5
"-TotalCount" в этом случае отвечает точно так же, как "-head". Вы должны использовать -TotalCount или -head, чтобы выполнить команду подобным образом. Но -TotalCount вводит в заблуждение - он не работает на самом деле, давая вам какие-либо счета...
gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt
Приведенный выше сценарий, протестированный в PS 5.1, - это ОДИН ЖЕ ответ, как показано ниже...
gc -head 25 C:\scripts\logs\robocopy_report.txt
Так что просто используйте '-head 25" уже!
Ответ 6
У меня есть несколько лучших решений:
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
Ответ 7
$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
Кстати, вы не получаете всех ошибок с кодом pushpop, ваш код работает только с опцией "sed". Все остальное игнорирует все, кроме gc и path.