prosource

명령 출력을 텍스트인 것처럼 필터링

probook 2023. 8. 16. 22:28
반응형

명령 출력을 텍스트인 것처럼 필터링

간단한 질문이 있습니다만, 저는 파워셸 초보자이기도 합니다.Get-Process 명령어의 출력(가칭)과 관련이 있다고 생각합니다.ps)은 개체이며 텍스트가 아닙니다.

"sql"이라는 이름을 가진 서비스 목록을 받고 싶습니다.

제가 지금까지 시도한 것은 이것이지만, 모든 시도는 아무것도 반환하지 않습니다.

Get-Service | where {$_ -match 'sql'}

Get-Service | where {$_ -like 'sql'}

Get-Service | Select-String sql

모든 명령의 출력을 검색 가능한 텍스트로 처리할 수 있는 패턴을 찾고 있습니다.

그냥 잊어버려요 :o)

출력은 객체입니다.당신이 옳습니다, 그리고 당신은 이것을 사용할 것입니다.

가장 짧은 답은 소졸리너이지만, 참고로 테스트해 보십시오.

Get-Service | Get-Member

그래서 당신은 이해할 것입니다.

Get-Service | Where-Object {$_.name -match ".*sql.*" }

또한 작동하며, 여기서 텍스트를 객체의 속성으로 얻을 수 있습니다.

Get-Service | Select-String -Pattern "sql"

이것은 grep처럼 작동합니다.정렬할 수도 있습니다.

Get-Service | Select-String -Pattern "sql" | sort

여기서 대부분의 답변은 전체 출력을 텍스트처럼 필터링하는 것이 아니라 이름에 "sql"이 포함된 서비스 이름을 찾는 데 중점을 둡니다.또한 허용된 답변은 "findstr"이라는 비 PowerShell 함수를 사용합니다.

따라서 다음은 가장 우아한 솔루션이 아니라 완전성을 위해 OP의 질문을 문자 그대로 받아들이는 100% PowerShell 솔루션을 제공하고자 합니다.

(get-Service | Out-String) -split "`r`n" | Select-String sql
  • 다른 답변에 제공된 솔루션을 사용하는 은 Get-Service 명령의 전체 텍스트 출력을 제공하지 않기 때문에 필요합니다.Name매개 변수
  • Select-String은 전체 텍스트를 하나의 긴 문자열로 처리하고 "sql"이 있으면 전체 텍스트를 반환하기 때문에 새 줄로 분할해야 합니다.
  • findstr은 PowerShell 함수가 아니기 때문에 findstr 대신 Select-String을 사용합니다.

이것은 순수한 대답이며, 실제로는 이 특정 사용 사례에 대해 권장하지 않습니다.하지만 구글 검색을 통해 질문 제목을 기반으로 이곳에 오는 사람들에게는, 이것이 더 정확한 답입니다...

다른 답변은 이름에 "sql"이 있는 서비스를 시작하는 구체적인 질문에 대한 것이지만 일반적인 질문에 대한 답변입니다.

할수있습니다Get-Service | Out-String그러면 유닉스 명령이 작동하는 방식과 마찬가지로 출력을 문자열로 얻을 수 있습니다.

또한 출력이 PowerShell 이외의 명령으로 파이핑되면 텍스트로 변환되므로 예를 들어 다음과 같습니다.Get-Service | grep sql당신이 원하는 방식으로 작동할 것입니다.

그러나 @JPBlanc가 말했듯이 PowerShell의 작동 방식, 즉 출력이 객체라는 방식을 수용하는 것이 좋습니다.이것은 당신에게 더 많은 제어력을 제공하고 모든 것을 간단하고 읽을 수 있게 해줍니다. (sed, awk 및 다른 명령 출력의 텍스트 출력에서 작동하지 않는 유닉스 명령은 매우 암호화될 수 있습니다!)

너무 열심히 하시는군요.

Get-Service *sql*

논리적 작업에 대한 자세한 내용은 Where-Object cmdlet 사용을 참조하십시오.

-lt - 보다 작음

-le - 다음보다 작거나 같음

-gt - 보다 큼

-ge - 보다 크거나 같음

-eq -- 다음과 같습니다.

-ne - 같지 않음

-좋아요 -좋아요, 패턴 일치에 와일드카드 사용

Get-Service | where {$_ -match 'sql'}되요지일 입니다.Get-Service | where {$_ -eq "sql"}

Get-Service | where {$_ -like 'sql'}되요지일 입니다.Get-Service | where {$_ -like "sql"}

그리고 이제 실제 예를 들어보겠습니다.

PS C:\> Get-Service | where {$_.name -like "net*"}

Status   Name               DisplayName
------   ----               -----------
Running  Net Driver HPZ12   Net Driver HPZ12
Running  Netlogon           Netlogon

이름의 텍스트가 개체의 속성인지 여부는 사용자의 머리를 움직여 필터에서 속성 값을 사용하는 방법에 중요합니다.

이 문제를 해결하기 위해 활용할 수 있는 PowerShell의 또 다른 측면은 Select-Object(가칭)가 있는 개체에서 속성을 선택하는 것입니다.select):

Get-Service | select -expand name

서버 이름이 포함된 문자열 배열을 제공합니다. 그러면 원래 필터 3개 중 2개가 작동합니다.-like테스트 문자열에 와일드카드가 없기 때문에 작동하지 않습니다.일치하는 것은 'sql'뿐입니다.

저는 여전히 제가 올린번째 솔루션이 최선이라고 생각합니다.지연 필터링을 수행하는 방법뿐만 아니라 가능한 경우 조기 필터링을 사용하는 방법도 알아야 합니다.

어때요?

Get-Service| Out-String -stream | Select-String sql

여기서 핵심은 -stream 옵션이 Out-String 출력을 별도의 텍스트 행으로 변환한다는 것입니다.

서비스 이름에 "sql"이 있는 모든 서비스를 나열하려면 다음을 사용합니다.

 get-service -name *sql*

당신은 아마 이것을 원할 것입니다.

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
}

여기서는 주어진 패턴과 일치하는지 확인하기 위해 개체의 각 속성을 살펴봅니다.개체에 이러한 속성이 하나 이상 포함되어 있으면 이 속성을 기록합니다.최종 결과: 개체의 모든 속성으로 grep합니다.

구성 파일에 저장한 후 원하는 대로 이동합니다.

언급URL : https://stackoverflow.com/questions/6635059/filter-the-output-of-a-command-as-if-it-was-text

반응형