PowerShell로 Grep하는 방법

로그 또는 구성 파일에서 API에서 반환된 데이터까지 데이터 필터링,
노이즈를 제거하고 추가 분석을 가능하게 하는 중요한 작업입니다.

Bash에서 대부분은 grep , egrep 또는 awk 에 끌립니다.

고전적인 예는
  • 당신의 역사를보고

  •   $ history | grep ssh
      ssh [email protected]
      ssh [email protected]
      ssh [email protected]
    
  • 로그에서 오류 찾기

  •   $ cat /var/log/app.log | grep error
      2020-09-30 09:01:17 error: twitter api responded with 403
      2020-09-30 09:16:05 error: secret plan to take over the world failed
    

    그렙



    $ grep api app.conf
    api_key_twitter: '***'
    api_key_digitalocean: '***'
    

    가상 앱의 구성에 api가 포함된 모든 설정이 나열됩니다. 1

    PowerShell에서는 Select-String를 사용하고 -Pattern 매개변수에서 검색어를 정의합니다.

    PS> Select-String -Path "app.conf" -Pattern "api"
    app.conf:2:api_key_twitter: '***'
    app.conf:4:api_key_digitalocean: '***'
    


    중요한!

    명령에 이 추가-Raw를 비활성화하려는 경우 PowerShell에는 기본적으로 일치하는 파일과 행이 포함됩니다.


    그렙 -v



    $ grep -v api app.conf
    # Super awesome app config!
    super_secret_setting: 'the cake is a lie!'
    

    이것은 가상 앱의 구성에 api를 포함하지 않는 모든 설정을 나열합니다. 1

    PowerShell은 -NotMatch 매개변수를 사용하여 이를 복제할 수 있습니다.

    PS> Select-String -Path "app.conf" -Pattern "api" -NotMatch
    app.conf:1:# Super awesome app config!
    app.conf:3:super_secret_setting: 'the cake is a lie!'
    

    정규식 패턴



    PowerShell은 기본적으로 정규식을 지원하므로 더 복잡한 필터를 작성하는 데 문제가 없습니다.

    PS> Select-String -Path "app.conf" -Pattern "^\w*:"
    app.conf:2:api_key_twitter: '***'
    app.conf:3:super_secret_setting: 'the cake is a lie!'
    app.conf:4:api_key_digitalocean: '***'
    

    여러 파일



    $ grep super_secret_setting *.py
    debug.py:print(conf.super_secret_setting)
    server.py:# TODO: Maybe we should not print super_secret_setting
    server.py:#print(conf.super_secret_setting)
    

    이것은 my super_secret_setting 를 사용하여 모든 파이썬 코드를 나열합니다.

    PowerShell은 유사한 구문으로 이를 복제할 수 있습니다.

    PS> Select-String -Path "*.py" -Pattern "super_secret_setting"
    debug.py:7:print(conf.super_secret_setting)
    server.py:14:# TODO: Maybe we should not print super_secret_setting
    server.py:15:#print(conf.super_secret_setting)
    

    재귀적으로 파일을 검색하는 것은 Bash에서도 정말 간단합니다.

    $ grep -r super_secret_setting *.py
    debug.py:print(conf.super_secret_setting)
    server.py:# TODO: Maybe we should not print super_secret_setting
    server.py:#print(conf.super_secret_setting)
    utils.secrets.py:if conf.super_secret_setting:
    

    불행히도 PowerShell에서는 여러 명령을 함께 연결해야 하는 것처럼 간단하지 않습니다.

    Get-ChildItem -Recurse -Include "*.py" | Select-String -Pattern "super_secret_setting"
    debug.py:7:print(conf.super_secret_setting)
    server.py:14:# TODO: Maybe we should not print super_secret_setting
    server.py:15:#print(conf.super_secret_setting)
    utils/secrets.py:4:if conf.super_secret_setting:
    

    팁 및 요령



    이것은 전체 예를 들어볼 가치가 없는 몇 가지 사소한 기능을 설명하기 위해 소개하고 싶은 새로운 섹션입니다.
    그러나 때때로 여전히 흥미롭고 유용합니다.
  • 어떤 항목에 대해 모든 일치 항목이 필요한 것이 아니라 적어도 하나의 일치 항목이 포함된 파일을 빠르게 검색해야 하는 경우가 있습니다.
    이것은 -List 스위치
  • 로 달성할 수 있습니다.
  • 다른 경우에는 모든 일치 항목을 가져와야 할 수도 있습니다. 한 줄에 여러 개라도 포함됩니다.-AllMatches
  • 를 제공합니다
  • -CaseSensitive를 사용하여 대소문자를 구분하여 검색

  • 바로가기



    매번 작성Select-String하는 것은 바람직하지 않습니다. 고맙게도 몇 가지 지름길을 택하고 Bash 근육 메모리를 가져올 수도 있습니다.
  • 별칭Select-String을 사용하여 줄입니다sls.
  • grep처럼
  • -Pattern는 위치 인수 0
  • 으로 제공될 수 있습니다.
  • -Path는 위치 인수 1
  • 로 제공될 수 있습니다.

  • 내부에 공백이 없는 한 문자열 주위를 생략합니다"".
  • 명령은 항상 대소문자를 구분하지 않으며 이는 개인 취향에 더 가깝습니다.

  • 이 바로 가기를 사용하면 명령이 훨씬 더 짧아집니다.

    Select-String -Path "app.conf" -Pattern "api"
    sls api app.conf
    
    Select-String -Path "app.conf" -Pattern "api" -NotMatch
    sls api app.conf -NotMatch
    
    Select-String -Path "app.conf" -Pattern "^\w*:"
    sls "^\w*:" app.conf
    
    Select-String -Path "*.py" -Pattern "super_secret_setting"
    sls super_secret_setting *.py
    
    Get-ChildItem -Recurse -Include "*.py" | Select-String -Pattern "super_secret_setting"
    dir -Recurse -Include *.py | sls super_secret_setting
    
    

    더 나아가



    여기서는 PowerShell에서 grep을 대체하는 기본 예를 다룹니다.

    PowerShell의 객체 지향 파이핑 시스템 덕분에 화면에 표시되는 정보가 작업의 전부가 아닙니다.

    이전 예제에서 하나를 살펴보겠습니다.super_secret_setting 의 모든 용도에 대한 보고서를 생성하는 가상 파이프라인에 연결합니다.

    Select-String -Path "*.py" -Pattern "super_secret_setting" | Select-Object Path,LineNumber | Export-Csv -Path api_conf.csv -NoTypeInformation
    

    분명히 이것은 일치를 설명하는 풍부한 개체를 가질 수 있는 많은 가능성을 보여주는 예일 뿐입니다.
    나중에 사용하기 위해 변수에 쓸 수도 있고, 반복하거나 실제 프로그래밍 언어에서 허용하는 다른 작업을 수행할 수도 있습니다.

    빠른 참조를 위해 반환된 모든 MatchInfo 개체 내에서 액세스할 수 있는 모든 값입니다.

    IgnoreCase : True
    LineNumber : 2
    Line       : api_key_twitter: '***'
    Filename   : app.conf
    Path       : /Users/mkamner/projects/mkamner/blog/app.conf
    Pattern    : ^\w*:
    Context    :
    Matches    : {0}
    
    Context 값은 결과 객체에서 일치하는 라인 전후에 X 라인을 얻을 수 있는 가능성을 제공하므로 사용하기에 흥미로울 수 있습니다.

    # 3 lines before and after
    -Context 3
    
    # 1 line before, 3 after
    -Context 1,3
    

    더 자세히 알아볼 수 있는 훌륭한 리소스는 Microsoft의 official documentation입니다.

    Twitter에서 PowerShell 문제에 대해 언제든지 물어보세요!



    app.conf  

    좋은 웹페이지 즐겨찾기