content - PowerShell: cómo grep salida de comando?
select-string (6)
En PowerShell lo he intentado:
alias | select-string Alias
Esto falla a pesar de que Alias
está claramente en la salida. Sé que esto se debe a que select-string está operando en algún objeto y no en la cadena de salida real.
¿Qué se puede hacer al respecto?
Creo que esta solución es más fácil y mejor, use directamente la función findstr:
alias | findstr -i Write
También puede hacer un alias para usar la palabra grep:
new-alias grep findstr
Hay dos problemas Como en la pregunta, select-string necesita operar en la cadena de salida, que se puede obtener desde "out-string". Además, select-string no funciona linewise en las cadenas que están conectadas a él. Aquí hay una solución genérica
(alias|out-string) -split "`n" | select-string Write
La solución propuesta es mucho trabajo para algo que se puede hacer así:
Get-Alias -Definition Write*
Para una solución más flexible y perezosa, puede hacer coincidir todas las propiedades de los objetos. La mayoría de las veces, esto debería obtener el comportamiento que desea, y siempre puede ser más específico cuando no lo hace. Aquí hay una función grep que funciona según este principio:
Function Select-ObjectPropertyValues {
param(
[Parameter(Mandatory=$true,Position=0)]
[String]
$Pattern,
[Parameter(ValueFromPipeline)]
$input)
$input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output
}
Si realmente quiere "grep" la salida formateada (cadenas de visualización), entonces vaya con el enfoque de Mike. Definitivamente hay momentos en que esto es útil. Sin embargo, si quiere intentar abarcar la naturaleza de la tubería de objetos de PowerShell, intente esto. Primero, revisa las propiedades de los objetos que fluyen por la tubería:
PS> alias | Get-Member
TypeName: System.Management.Automation.AliasInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
<snip>
*Definition* Property System.String Definition {get;}
<snip>
Tenga en cuenta la propiedad Definition, que es un encabezado que se ve cuando se muestra el resultado de Get-Alias (alias), por ejemplo:
PS> alias
CommandType Name *Definition*
----------- ---- ----------
Alias % ForEach-Object
<snip>
Por lo general, el título del encabezado coincide con el nombre de la propiedad, pero no siempre. Ahí es donde usar Get-Member es útil. Le muestra lo que necesita para "guiar" en contra. Ahora, si lo que desea "grep" es el contenido de la propiedad Definition, considere esto. En lugar de limitar el valor de una propiedad, en su lugar puede filtrar cada objeto AliasInfo en la tubería por el contenido de esta propiedad y puede usar una expresión regular para hacerlo, por ejemplo:
PS> alias | Where-Object {$_.Definition -match ''alias''}
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
En este ejemplo, uso el cmdlet Where-Object para filtrar objetos en función de algún script arbitrario. En este caso, filtre por la propiedad Defintion que coincida con el ''alias'' de expresiones regulares. Solo aquellos objetos que devuelven verdadero para ese filtro pueden propagarse por la canalización y formatearse para mostrarse en el host.
Por cierto, si está escribiendo esto, puede usar uno de dos alias para Where-Object - ''Where'' o ''?''. Por ejemplo:
PS> gal | ?{$_.Definition -match ''-Item*''}
Su problema es que alias emite una secuencia de objetos AliasInfo, en lugar de una secuencia de cadenas. Esto hace lo que creo que quieres.
alias | out-string -stream | select-string Alias
o como una función
function grep {
$input | out-string -stream | select-string $args
}
alias | grep Alias
Cuando no maneja cosas que están en proceso (como cuando acaba de ejecutar ''alias''), el shell sabe usar el método ToString () en cada objeto (o usa los formatos de salida especificados en la información ETS).