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


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

5 66

5 ответов:

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+', '()' }         # sed

это работает достаточно хорошо для небольших файлов, более крупные (более нескольких MiB), вероятно, немного медленнее.

The Расширения Сообщества PowerShell включите некоторые командлеты для специализированных файлов (например, Get-FileTail).

вот встроенные способы сделать head и tail. Не используйте трубы, потому что если у вас есть большой файл, это будет очень медленно. Использование этих встроенных опций будет чрезвычайно быстрым даже для огромных файлов.

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

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 и другие такие программы являются избыточными.

Если вам нужно запросить большие (или маленькие) файлы журналов в Windows, лучший инструмент, который я нашел, - это Microsoft free Log Parser 2.2. Вы можете вызвать его из PowerShell, если хотите, и он будет делать всю тяжелую работу за вас, и очень быстро.

У меня есть несколько лучших решений:

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