Sort-Object e Group-Object
Esta aula aborda os cmdlets Sort-Object e Group-Object do PowerShell, que permitem ordenar e agrupar dados de forma eficiente. Você aprenderá a ordenar por uma ou múltiplas propriedades, agrupar objetos e contar itens em grupos, com exemplos práticos e boas práticas.
Nesta aula, vamos explorar dois cmdlets fundamentais para manipulação de coleções no PowerShell: Sort-Object e Group-Object. Eles são frequentemente usados em pipelines para organizar e resumir dados, facilitando a análise e a geração de relatórios. Compreender esses cmdlets é essencial para qualquer profissional que trabalhe com automação e administração de sistemas Windows.
O Sort-Object permite ordenar objetos com base em uma ou mais propriedades, enquanto o Group-Object agrupa objetos que compartilham valores comuns. Combinados, eles oferecem um poder imenso para processar e visualizar informações de forma clara e concisa.
Ordenação
O cmdlet Sort-Object ordena objetos em ordem crescente ou decrescente com base em suas propriedades. Por padrão, a ordenação é crescente. Você pode especificar a propriedade pela qual deseja ordenar usando o parâmetro -Property.
Exemplo: suponha que temos uma lista de processos e queremos ordená-los pelo uso de memória (WorkingSet).
Get-Process | Sort-Object -Property WorkingSetPara ordem decrescente, use o parâmetro -Descending.
Get-Process | Sort-Object -Property WorkingSet -DescendingVocê também pode ordenar por propriedades que não são numéricas, como nomes.
Get-Service | Sort-Object -Property StatusPor múltiplas propriedades
É possível ordenar por mais de uma propriedade, fornecendo uma lista separada por vírgulas. O PowerShell ordena primeiro pela primeira propriedade e, em caso de empate, usa a segunda, e assim por diante.
Exemplo: ordenar processos primeiro pelo nome do processo (em ordem alfabética) e depois pelo uso de CPU (decrescente).
Get-Process | Sort-Object -Property Name, CPU -DescendingNote que o -Descending se aplica a todas as propriedades. Se precisar de ordens diferentes para cada propriedade, você pode usar uma hashtable com as chaves Expression e Ascending/Descending.
Get-Process | Sort-Object -Property @{Expression='Name'; Ascending=$true}, @{Expression='CPU'; Descending=$true}Isso ordena pelo nome em ordem crescente e, para nomes iguais, pelo CPU em ordem decrescente.
Agrupamento
O cmdlet Group-Object agrupa objetos que possuem o mesmo valor para uma propriedade específica. Ele retorna objetos com as propriedades Count, Name e Group (contendo os objetos originais).
Exemplo: agrupar processos por nome do processo (para ver quantas instâncias de cada processo estão em execução).
Get-Process | Group-Object -Property ProcessNameVocê pode usar o parâmetro -NoElement para omitir os objetos do grupo e mostrar apenas a contagem.
Get-Process | Group-Object -Property ProcessName -NoElementPara agrupar por múltiplas propriedades, use uma expressão de script block ou uma hashtable, mas o mais comum é agrupar por uma única propriedade.
Contagem
O Group-Object já fornece a contagem de itens em cada grupo através da propriedade Count. Você pode ordenar os grupos pela contagem para identificar os grupos mais frequentes.
Exemplo: listar os 5 processos com mais instâncias em execução.
Get-Process | Group-Object -Property ProcessName | Sort-Object -Property Count -Descending | Select-Object -First 5Para contar objetos sem agrupar (apenas o total), você pode usar o cmdlet Measure-Object.
Get-Process | Measure-ObjectOu contar objetos que atendem a uma condição:
(Get-Process | Where-Object {$_.CPU -gt 10}).CountEssas técnicas são úteis para gerar relatórios resumidos.
Boas Práticas
- Sempre especifique a propriedade a ser ordenada ou agrupada para evitar resultados inesperados.
- Use
-NoElementquando não precisar dos objetos originais, melhorando a performance. - Combine
Group-ObjectcomSort-ObjecteSelect-Objectpara análises rápidas. - Para ordenações complexas, utilize hashtables no parâmetro
-Property.
Referências
- Documentação oficial do Sort-Object
- Documentação oficial do Group-Object
- Documentação oficial do Measure-Object
- Tudo sobre arrays no PowerShell (inclui ordenação)
- Tudo sobre hashtables no PowerShell
Exercícios
Liste todos os serviços do sistema, ordenados pelo nome do serviço em ordem decrescente.
✓ Resposta:Get-Service | Sort-Object -Property Name -DescendingAgrupe os processos pelo nome do processo e exiba apenas o nome e a contagem, ordenados pela contagem em ordem decrescente.
✓ Resposta:Get-Process | Group-Object -Property ProcessName -NoElement | Sort-Object -Property Count -DescendingOrdene os eventos do log de sistema (System) pelo ID do evento em ordem crescente e, em caso de empate, pela data/hora em ordem decrescente.
✓ Resposta:Get-WinEvent -LogName System | Sort-Object -Property Id, TimeCreated -DescendingConte quantos processos estão em execução com o nome "chrome" (assumindo que existam).
✓ Resposta:(Get-Process -Name chrome).CountListe os 3 grupos de serviços mais comuns (pelo campo Status), exibindo o status e a quantidade.
✓ Resposta:Get-Service | Group-Object -Property Status | Sort-Object -Property Count -Descending | Select-Object -First 3