PowerShell Get-Content의 PowerShell Tail 동등 기능

자동화로 텍스트 파일에서 데이터를 읽는 것은 흔한 시나리오입니다. 대부분의 프로그래밍 언어는 텍스트 파일을 읽는 방법을 하나 이상 가지고 있으며 PowerShell도 예외는 아닙니다. PowerShell Get-Content cmdlet은 텍스트 파일의 내용을 읽고 데이터를 PowerShell 세션으로 가져오는데 사용됩니다.

PowerShell Get-Content cmdlet은 스크립트의 입력으로 텍스트 파일을 사용해야 할 때 꼭 필요한 도구입니다. 아마도 PowerShell 스크립트가 컴퓨터 목록을 모니터링하거나 사용자에게 전송할 이메일 템플릿을 가져와야 할 수도 있습니다. PowerShell Get-Content는 이러한 시나리오를 쉽게 지원합니다!

실시간으로 로그 파일을 따라가는 것은 어떨까요? 네, PowerShell Get-Content로도 가능합니다! 이 문서를 계속 읽으면 PowerShell에서 텍스트 파일을 읽는 방법을 배우게 됩니다.

전제 조건

이 튜토리얼의 예제를 따라하려면 다음 요구 사항이 필요합니다.

  • Windows 10을 실행하는 컴퓨터가 필요합니다. 이 튜토리얼은 Windows 10 버전 20H2를 사용합니다. 하지만 걱정하지 마세요, 사용 중인 Windows 10 버전으로도 문제 없습니다.
  • 컴퓨터에 Windows PowerShell 5.1 또는 PowerShell 7.1 이상이 설치되어 있어야 합니다. 여기서는 PowerShell 7.1을 사용했지만 두 버전 중 어느 것이든 사용할 수 있습니다!
  • 당신은 명령을 작성하고 테스트할 것이기 때문에 코드 편집기가 필요합니다. 권장되는 편집기는 Windows PowerShell ISE(Windows에 내장)와 Visual Studio Code (VSCode)입니다. 이 문서에서는 VSCode를 사용합니다.
  • 또한 컴퓨터에 작업 디렉터리를 만들면 도움이 됩니다. 작업 폴더는 원하는 위치에 있어도 상관 없습니다. 그러나 이 튜토리얼의 예제는 보통 C:\demo 폴더에 있음을 알 수 있습니다.
  • 시작하려면 어떤 내용이든 필요합니다! 작업 디렉터리에 fruits.txt라는 이름의 파일을 만드세요. 이 파일에는 단순하게 열 가지 다른 과일이 포함되어 있어야 합니다. 이 텍스트 파일은 모든 예제에서 사용됩니다.
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

어떤 PowerShell 버전을 사용 중인지 모르겠나요? 기사 PowerShell 버전 확인하는 방법 (모두 다!)을 참조하세요.

텍스트 파일 읽기 및 결과를 문자열 배열로 반환하기

Get-Content cmdlet은 파일에서 내용을 읽으며 기본적으로 텍스트 파일의 각 줄을 문자열 개체로 반환합니다. 결과적으로 PowerShell 객체의 컬렉션이 문자열 객체의 배열이 됩니다.

아래 코드는 fruits.txt 파일의 내용을 읽고 결과를 PowerShell 콘솔에 표시합니다(아래 스크린샷 참조).

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Content는 내용을 배열로 읽어 저장하지만 확실한 방법은 무엇일까요? 먼저 PowerShell 객체에 내용을 저장한 다음 형식을 확인하여 알 수 있습니다.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

화면 캡처를 보면, $fruits 변수는 10개의 객체를 포함하는 배열입니다. 각 객체는 하나의 텍스트 줄을 나타냅니다.

Confirming that the text file content is stored as an array.

텍스트 파일에서 특정 줄 반환

이전 예제에서 기본 Get-Content 결과가 배열이거나 객체의 컬렉션임을 배웠습니다. 컬렉션의 각 항목은 인덱스 번호에 해당하며, PowerShell 인덱스는 일반적으로 0부터 시작합니다.

아래 스크린샷에서 문자열 배열에는 열 개의 항목이 있음을 보여줍니다. 배열은 0부터 9까지 열 개의 항목을 인덱싱했습니다.

Showing that the indexed items in the string array start at zero index.

컨텐츠의 다섯 번째 줄만 표시하려면, 배열 표기법으로 알려진 대괄호로 묶인 인덱스 번호 4를 지정해야 합니다.

(Get-Content .\fruits.txt)[4]

Get-Content 명령이 괄호로 묶인 것을 알 수 있습니다. 이 표기법은 PowerShell에게 다른 작업보다 먼저 괄호로 묶인 명령을 실행하라고 알려줍니다.

아래 스크린샷에서 반환된 결과가 raspberry뿐인 것을 볼 수 있습니다. 이것은 인덱스 4의 항목으로, 텍스트 파일의 다섯 번째 줄에 해당합니다.

Returning a specific line from Get-Content results.

마지막 줄의 내용을 가져와야 할 때는 어떻게 해야 할까요? 다행히도 전체 줄 수를 알 필요가 없습니다. 대신 인덱스로 [-1]을 사용하면 Get-Content가 파일의 마지막 줄만 표시합니다.

(Get-Content .\fruits.txt)[-1]

Get-Content가 반환하는 최상위 결과의 수 제한

TotalCount 매개변수를 사용하여 Get-Content로 텍스트 파일에서 지정된 행 수를 검색합니다. TotalCount 매개변수는 long 값을 허용하며 이는 9,223,372,036,854,775,807의 최대 값입니다.

예를 들어, 아래 명령은 내용을 읽고 결과를 세 항목으로 제한합니다.

Get-Content .\fruits.txt -TotalCount 3

당연히 아래 결과는 텍스트 파일의 처음 세 줄만 표시합니다.

Reading the top three results using the Get-Content command and the TotalCount parameter.

파일 끝에서 결과를 반환하려면 PowerShell Tail 매개변수를 사용하십시오

이전 예에서는 PowerShell Get-Content cmdlet을 사용하여 텍스트 파일을 읽고 상위 결과를 제한했습니다. PowerShell Get-Content을 사용하여 반대로도 가능합니다. PowerShell Tail 매개변수를 사용하여 파일 끝에서 지정된 행 수를 읽습니다.

아래 코드 예제는 텍스트 파일을 읽고 하단 네 줄의 내용을 표시합니다.

Get-Content .\fruits.txt -Tail 4

PowerShell tail 명령을 실행한 후 예상되는 결과는 아래 이미지에서와 같이 내용의 마지막 네 줄로 제한됩니다.

Getting the results from the end of a file using the Get-Content Tail parameter.

Tail 매개변수는 종종 Wait 매개변수와 함께 사용됩니다. Wait 매개변수를 사용하면 파일이 열린 채로 유지되며 매 초마다 새로운 내용을 확인합니다. 아래 데모에서는 TailWait 매개변수가 작동하는 것을 보여줍니다. Wait를 종료하려면 CTRL+C 키 조합을 사용합니다.

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

결과를 단일 문자열로 반환합니다.

이전 예제에서 알 수 있듯이 PowerShell Get-Content 출력으로 문자열 배열을 처리했습니다. 그리고 지금까지 배운 대로 배열의 성질은 콘텐츠를 한 항목씩 처리할 수 있게 합니다.

배열은 종종 훌륭하게 작동하지만 문자열을 대체하는 것이 더 어려울 수 있습니다. Get-ContentRaw 매개변수는 파일의 전체 내용을 단일 문자열 객체로 읽습니다. 아래 코드는 첫 번째 예제에서 사용한 것과 동일하지만, Raw 매개변수는 파일 콘텐츠를 단일 문자열로 저장합니다.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

아래 스크린샷은 Get-ContentRaw 매개변수를 추가하면 콘텐츠를 단일 문자열로 처리하고 객체 배열이 아니라는 것을 보여줍니다.

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

파일의 내용을 Raw 매개변수를 사용하여 단일 문자열로 얻은 후에는 어떻게 할 수 있을까요? 아마도 해당 파일의 콘텐츠 내에서 문자열을 찾아 대체해야 할 수도 있습니다. 아래 예제에서 Get-Content는 파일의 내용을 단일 문자열로 읽습니다. 그런 다음 replace 연산자를 사용하여 특정 단어를 다른 단어로 대체합니다.관련: 문자열 찾기 및 대체

# 텍스트 파일의 원시 콘텐츠 가져오기
$fruits = Get-Content .\fruits.txt -Raw
# 콘텐츠 표시
$fruits
# 'apricot'이라는 단어를 'mango'로 찾아 대체
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

필터와 일치하는 파일에서만 콘텐츠를 읽습니다.

일부 파일의 콘텐츠를 읽어야 하는 폴더가 있나요? PowerShell의 Get-Content를 사용하면 파일을 따로 필터링하지 않고도 파일 내용을 읽을 수 있습니다. Get-ContentFilter 매개변수를 사용하여 cmdlet이 읽을 파일을 제한할 수 있습니다.

일부 파일의 콘텐츠만 읽는 방법을 보여주기 위해 먼저 읽을 파일 몇 개를 생성하세요. 아래에 나와 있는대로 Add-Content를 사용하여 작업 폴더에 파일을 생성하세요.

# Add-Content를 사용하여 log1.log 및 log2.log 파일을 생성하고 주어진 값을 추가합니다.
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# 파일이 생성되었는지 확인합니다.
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

테스트 파일이 생성되었다면, FilterPath 매개변수를 사용하여 루트 디렉토리의 .log 파일만 읽습니다. 필터 정의에서 사용하는 별표는 .log로 끝나는 모든 파일을 읽도록 Get-Content에 알려줍니다. 경로 매개변수의 끝에 있는 별표는 파일을 루트 디렉토리만 읽도록 제한합니다.

Get-Content -Path C:\demo* -Filter *.log

아래 출력에서는 .log 파일의 콘텐츠만 표시됩니다.

Using the Filter parameter with PowerShell Get-Content to limit the read files.

관련 정보: Get-ChildItem: 파일, 레지스트리, 인증서 등을 한 번에 나열하기

파일의 대체 데이터 스트림 읽기

지금까지 텍스트 파일만 다루었지만, Get-Content는 파일의 대체 데이터 스트림(ADS)에서 데이터를 읽을 수 있습니다. 스트림에 대해 더 알아보기를 참고하십시오. 그러나 스트림은 일반적인 파일 내용과 함께 저장된 다른 데이터 속성으로 생각할 수 있습니다.

대체 데이터 스트림은 Windows NTFS 파일 시스템의 기능이므로, 비-Windows 운영 체제에서 Get-Content를 사용할 때는 해당되지 않습니다.

Stream 매개변수를 사용하여 Get-Item을 실행하여 대체 데이터 스트림을 볼 수 있습니다. 파일을 참조할 때 Stream 매개변수를 사용하면 아래에 표시된 것처럼 Stream이라는 속성을 반환합니다. 이 기본 파일 콘텐츠 스트림은 :$DATA로 표시됩니다.

기본 :$DATA 스트림을 보여주기 위해 Get-Item cmdlet을 사용하여 파일 fruits.txt의 모든 사용 가능한 스트림을 표시합니다. 아래에서 볼 수 있듯이, Get-Item은 단일 스트림을 표시합니다.

Get-Item -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

Get-ContentStream 매개변수는 아래에 표시된 것처럼 기본 :$DATA 스트림의 콘텐츠를 명시적으로 읽습니다. 반환된 내용은 기본 Get-Content 출력과 동일하며, 기본적으로 :$DATA 스트림이 읽힙니다.

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

Get-Content를 사용하여 대체 데이터 스트림을 검색하는 방법을 보여주기 위해 파일을 수정하고 Add-Content를 사용하여 새 스트림을 추가합니다. 아래 예제에서와 같이 Get-Item을 사용하여 새 스트림을 기본 :$DATA 스트림과 함께 표시합니다.

# Secret이라는 새로운 ADS를 fruits.txt 파일에 추가합니다
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

기본적으로 :$DATA 스트림만 읽히기 때문에, Get-ContentStream 매개변수를 사용하여 새로운 Secret 스트림 콘텐츠를 검색합니다. 아래 예제에서는 기본 파일 콘텐츠 대신 Secret 스트림 콘텐츠가 표시됩니다.

Get-Content -Path .\fruits.txt -Stream secret
Using Get-Content to read the Secret alternate data stream content.

PowerShell의 Get-Content로 다음 단계

이 문서에서는 Get-Content를 사용하여 콘텐츠를 읽고 조작하는 여러 가지 방법을 배웠습니다. 심지어 Get-Content가 대체 데이터 스트림에서 콘텐츠를 읽을 수 있는 유연성도 알게 되었습니다!

이 문서에서 배운 내용을 활용하여 Get-Content를 어떻게 사용할 수 있을까요? 예를 들어, 백업 파일이 구식인지 확인하고 자동으로 백업 작업을 실행하도록 호출하는 기능을 작성하는데 Get-Content를 사용할 수 있을 것입니다.

Source:
https://adamtheautomator.com/powershell-get-content/