파워셸 그렙

파워셸 코드 개발 시 문자열 내 또는 전체 텍스트 파일의 내용을 스캔해야 할 때 어디로 가십니까? 리눅스를 많이 사용했다면 인기 있는 grep 유틸리티에 익숙할 것입니다. grep 유틸리티는 다양한 매개변수를 사용하여 텍스트를 찾을 수 있게 해 주지만, Windows에서는 사용할 수 없습니다. 따라서 이 경우, 파워셸에서 Select-String cmdlet을 사용합니다.
Select-String
Cmdlet
Select-String은 기본적으로 각 줄에서 처음 일치를 확인하고, 이후 일치하는 줄의 줄 번호, 파일 이름 및 텍스트를 보여줍니다. Select-String은 바이트 순서 표시(BOM)를 사용하여 인코딩 유형을 결정함으로써 유니코드 텍스트와 같은 여러 파일 인코딩 방식에서도 작동합니다. BOM이 없으면 Select-String은 UTF8 파일로 간주합니다.
Select-String
cmdlet의 몇 가지 사용 예시는 아래에 설명되어 있습니다.
PowerShell을 사용한 전형적인 Grep 작업
예제를 통해 시작해 보겠습니다. 이름과 주소가 포함된 문자열이 있으며, 이 문자열은 비구조적이라고 가정해 보겠습니다. 우리는 이름을 추출하고자 합니다. 그래서 우리가 어떻게 할지를 아래에서 설명하겠습니다.
||Sara Peiris|| 37, De silva road, Panadura
--||Tim Gangster||-- 345, Yolks street,KL
==|Suz Maker|== 44 Main, Cydney, CA
위의 텍스트는 users
변수에 할당됩니다. 따라서 ‘Pattern’ 매개변수를 사용하여 이름을 검색하려고 시도할 것입니다.
test | Select-String -Pattern 'Sara Peiris'
출력:
여기서 Select-String 메서드가 작동했지만 전체 문자열을 전달했기 때문에 지정된 결과를 반환하지 않았다는 것을 이해할 수 있습니다. 따라서 각 특정 항목이 단일 줄로 제공되므로, 줄 바꿈 문자를 사용하여 단일 줄을 전송해 보겠습니다.
PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'
출력:
여기서 단일 줄을 반환하는 것을 볼 수 있습니다. 다음으로, 우리는 여러 줄을 반환할 수 있는 방법을 살펴봐야 합니다.
패턴 찾기를 위한 PowerShell Select-String 사용
여기서는 모든 줄에 대해 유효한 일반 패턴을 찾아야 합니다. 따라서 이전 예제를 보면 모든 이름은 |
로 둘러싸여 있고, 이름은 공백으로 구분되어 있습니다. 이제 이 패턴을 정규 표현식을 사용하여 ‘Pattern’ 매개변수와 함께 전송해 보겠습니다.
Select-String
은 각 줄을 검색하기 위해 정규 표현식을 사용했습니다. 그 후, 모든 이름을 분리해야 합니다. 현재로서는 각 주소가 필요하지 않습니다. 이를 수행하기 위해 Select-String이 반환한 각 일치 객체의 Matches
속성을 사용할 것입니다.
PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}
출력:
이제 값 속성이 필요한 이름을 가지고 있지만 여전히 |
문자로 둘러싸여 있는 것을 볼 수 있습니다. 이는 정규 표현식 일치에 이름의 |
문자가 포함되었기 때문입니다.
파이프 문자는 여전히 필터에 포함되어야 하지만, 우리는 그것들이 일치로 반환되기를 원하지 않습니다. 정규 표현식 그룹이 하나의 방법입니다. 반환하고자 하는 결과는 정규 표현식 그룹을 나타내는 괄호로 둘러싸여 있습니다. 이 상황에서는 정규 표현식을 처음 이름과 마지막 이름을 나타내는 문자열로 다시 시도해 보겠습니다.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}
출력:
값에 |
문자가 표시되지만, 무엇보다도 그룹이 {0,1}
로 변한 것을 볼 수 있습니다. 이는 Select-String이 그룹을 식별했음을 나타냅니다.
for
각 루프에 참조를 다시 삽입하여 이 그룹을 확인하겠습니다. 각 그룹 속성이 배열이기 때문에, 첫 번째 멤버를 괄호로 포함한 후 값 속성을 사용하여 참조할 수 있습니다.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}
출력:
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.