상세 컨텐츠

본문 제목

PowerShell(파워쉘) 파일 내용 한 줄씩 읽기 (Feat. head & tail)

Windows/PowerShell&Command

by Hoonjo 2023. 7. 4. 23:59

본문

PowerShell(파워쉘) 파일 내용 한 줄씩 읽기 (Feat. head & tail)

Read PowerShell file contents line by line (Feat. head & tail)

 

 

 

 

 

에이전트에서 로그 파일을 모니터링하는 기능을 추가하던 중

날짜(타임스탬프)가 같이 찍히지 않는 로그

로그가 찍힌 시점에 날짜(타임스탬프)를 수동으로 찍어내기 위한 방법으로 사용하였습니다.

 

 

 

 

 

파워쉘에서 파일 내용이 여러 줄 일 때 한 줄씩 읽어와 변수에 저장하고 출력하는 방법에 대해 알아보겠습니다.

 

 

저는 한 줄씩 읽어서 원하는 값을 찾기 OR 추가,

다른 내용과 조합하여 새로운 형태의 내용을 만들어내는데 유용하게 사용하고 있습니다.

 

 

 

 

1. 파일 윗 줄부터 출력하기(리눅스 head 기능)

 

Get-Content파일을 읽고 파이프( ' | ' )를 통해 명령을 이어줍니다.

Select-Object 명령에서 -first 옵션을 주고 원하는 라인 개수 를 입력하면 됩니다.

1은 위부터 1줄, 2는 위부터 2줄이 출력됩니다.

 

logFile.txt

5줄이 존재하는 logFile에서 맨 위 첫 줄만 출력해보겠습니다.

 

명령어:

Get-Content .\logFile.txt | Select-Object -first 1

 

맨 윗 라인만 출력된 모습

 


 

2. 파일 아랫 줄부터 출력하기(리눅스 tail 기능)

 

Get-Content 파일을 읽고 -Tail 옵션으로 원하는 라인 개수를 입력해 출력합니다.

1은 아래부터 1줄, 2는 아래부터 2줄이 출력됩니다.

logFile.txt

5줄이 존재하는 logFile에서 마지막 줄만 출력해 보겠습니다.

 

명령어:

 Get-Content .\logFile.txt -Tail 1

 

마지막 줄만 출력된 모습

 


 

3. 파일 내용한 줄씩 읽고 출력하기

 

핵심은 Select-Object 명령에서 -Skip -first 두 가지 옵션을 같이 사용하는 것입니다.

-Skip 숫자 = 생략할 라인 개수

즉, 5줄이 있으면 -Skip 옵션에 있는 숫자에 따라 내용이 생략되고

-first 옵션에 의해 생략된 다음 가장 맨 첫 줄이 출력됩니다.

 

아래 코드를 복사하여 testShell.ps1 파일을 만들어 줍니다.

$LOG_DIR = "C:\tistory"
$LOG_FILENAME = "logFile.txt"

$FILE_LINE = (Get-Content "$LOG_DIR\$LOG_FILENAME").Length

for($VAR=0; $VAR -lt $FILE_LINE; $VAR++) { # -lt = '<'
  $DATETIME = Get-Date -Uformat "%Y-%m-%d %H:%M:%S"
  $LINE = Get-Content $LOG_FILENAME | Select-Object -Skip $VAR -first 1
 
  Write-Output "$DATETIME`: $LINE"
 
  Start-Sleep -Seconds 1
}

logFile.txt의 총 라인 수(Length)를 구하고

라인 수만큼 for문을 돌려 각 메시지 앞에 날짜(타임스탬프)를 같이 출력해 보겠습니다.

 

로그 내용 앞에 타임스탬프가 찍힌 모습

 

짠🎉 로그 내용 앞에 현재 시각이 같이 출력된 모습입니다.

 

 

한 줄씩 잃어와서 내가 원하는 내용을 추가하여 내용을 변형하는 방법으로 활용해 볼 수 있습니다.

 

 

 

 

관련글 더보기