In PowerShell I have tried:
alias | Select-String Alias
This fails even though Alias is clearly in the output. I know this is because Select-String is operating on some object and not the actual output string.
What can be done about it?
In PowerShell I have tried:
alias | Select-String Alias
This fails even though Alias is clearly in the output. I know this is because Select-String is operating on some object and not the actual output string.
What can be done about it?
I think this solution is easier and better. Use the function findstr directly:
alias | findstr -i Write
You can also make an alias to use grep word:
New-Alias grep findstr
-i. If you show the help for findstr with findstr /? it will show all the options prefaced with a forward slash /. However it will accept arguments prepended with a / OR a -'. For example ipconfig /all` is functionally identical to ipconfig -all. So -i is the same as /i and since findstr is an old DOS program, and old DOS programs don't care about case, /i is idential to /I. So it means it's a case insesitive search.Write at the end. alias is an alias for Get-Alias, which is a PowerShell cmdlet. and Write is actually the string being searched, NOT the alias of Write-Output which I thought initially because of the colored formatting indicating a PowerShell command. I thought that Write-Output was being replaced in-place for findstr to search through. It's not. So what's actually happening is each line of Get-Alias is piped to findstr and that will search the piped str for a case insesitive match of the search term "Write".findstr is the line length limit (8191 characters)Your problem is that alias emits a stream of AliasInfo objects, rather than a stream of strings. This does what I think you want.
alias | Out-String -stream | Select-String Alias
Or as a function:
function grep {
$input | Out-String -stream | Select-String $args
}
alias | grep Alias
When you don't handle things that are in the pipeline (like when you just ran 'alias'), the shell knows to use the ToString() method on each object (or use the output formats specified in the ETS information).
find . | grep from Linus, and this works!If you truly want to "grep" the formatted output (display strings) then go with Mike's approach. There are definitely times where this comes in handy.
However, if you want to try embracing PowerShell's object pipeline nature, then try this. First, check out the properties on the objects flowing down the pipeline:
alias | Get-Member
Output:
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>
Note the Definition property which is a header you see when you display the output of Get-Alias (alias), e.g.:
alias
Output:
CommandType Name *Definition*
----------- ---- ----------
Alias % ForEach-Object
<snip>
Usually, the header title matches the property name, but not always. That is where using Get-Member comes in handy. It shows you what you need to "script" against. Now if what you want to "grep" is the Definition property contents then consider this. Rather than just grepping that one property's value, you can instead filter each AliasInfo object in the pipepline by the contents of this property and you can use a regex to do it e.g.:
alias | Where-Object {$_.Definition -match 'alias'}
Output:
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
In this example, I use the Where-Object cmdlet to filter objects based on some arbitrary script. In this case, I filter by the Definition property matched against the regular expression 'alias'. Only those objects that return true for that filter are allowed to propagate down the pipeline and get formatted for display on the host.
BTW, if you're typing this, then you can use one of two aliases for Where-Object - 'Where' or '?'. For example:
gal | ?{$_.Definition -match '-Item*'}
findstr where PowerShell will handle conversion to text for you, since it's not a cmdlet but a program (just out of completeness; in general it's always better to filter according to properties, imho :-))gal | Where Definition -match 'alias'There are two problems. As in the question, Select-String needs to operate on the output string, which can be had from "Out-String". Also, Select-String doesn't operate linewise on strings that are piped to it. Here is a generic solution
(alias | Out-String) -split "`n" | Select-String Write
Get-Member and then use the correct property and expression in the where command. And grep is particularly good in this one.-Stream parameter on Out-String and then you can pipe directly to Select-String.Try this (on Windows):
ipconfig /displaydns | Select-String -Pattern 'www.yahoo.com' -Context 0,7
Output:
> www.yahoo.com
----------------------------------------
> Record Name . . . . . : www.yahoo.com
Record Type . . . . . : 5
Time To Live . . . . : 27
Data Length . . . . . : 8
Section . . . . . . . : Answer
CNAME Record . . . . : new-fp-shed.wg1.b.yahoo.com
-CaseSensitive might be useful since it is by default case-insensitive.For a more flexible and lazy solution, you could match all properties of the objects. Most of the time, this should get you the behavior you want, and you can always be more specific when it doesn't. Here's a grep function that works based on this principle:
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
}
Use:
alias | Where-Object {$_.Definition -match 'alias'}
Output:
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
It would be contradict of match in PowerShell then as in to get field not matching a certain value in a column.
Select-String converts to string, which in this case is the Name property. Alias is short for Get-Alias. Using Select-String on objects can have unexpected results. This is a duplicate of a more general question.
Get-Alias | ForEach-Object { "$_" }
%
?
ac
asnp
bd
Get-Alias ac | Format-List * # Unformatted output
HelpUri : https://go.microsoft.com/fwlink/?LinkID=113278
ResolvedCommandName : Add-Content
DisplayName : ac -> Add-Content
ReferencedCommand : Add-Content
ResolvedCommand : Add-Content
Definition : Add-Content
Options : ReadOnly, AllScope
Description :
OutputType : {}
Name : ac