Подтвердить что ты не робот

Как сделать то, что голова, хвост, больше, меньше, sed делают в Powershell?

Мне нужны эти команды для проверки файла журнала в Windows, но я не устанавливаю какую-либо программу, и мне нравится Powershell с Windows.

4b9b3361

Ответ 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.