Programing

Powershell에서 head, tail, more, less, sed를 수행하는 방법은 무엇입니까?

lottogame 2020. 8. 26. 08:22
반응형

Powershell에서 head, tail, more, less, sed를 수행하는 방법은 무엇입니까? [닫은]


Windows에서 로그 파일을 확인하려면 이러한 명령이 필요하지만 프로그램을 설치하지 않고 Windows와 함께 Powershell을 좋아합니다.


Get-Content(별칭 gc:)은 텍스트 파일을 읽기위한 일반적인 옵션입니다. 그런 다음 추가로 필터링 할 수 있습니다.

gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt     # also head
gc log.txt | select -last 10  # tail
gc -Tail 10 log.txt           # also tail (since PSv3), also much faster than above option
gc log.txt | more             # or less if you have it installed
gc log.txt | %{ $_ -replace '\d+', '($0)' }         # sed

이것은 작은 파일에 대해 충분히 작동하며 큰 파일 (수 MiB 이상)은 아마도 약간 느립니다.

PowerShell을 커뮤니티 확장 전문 파일 물건 (예 : GET-FileTail)에 대한 몇 가지 cmdlet을 포함한다.


다음은 기본 제공 방법 headtail. 큰 파일이 있으면 매우 느리므로 파이프를 사용하지 마십시오. 이러한 기본 제공 옵션을 사용하면 대용량 파일에서도 매우 빠릅니다.

gc log.txt -head 10 
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f

more.exeWindows에 존재하며 포트를 less쉽게 찾을 수 있습니다 ( PowerShell Community Extensions , PSCX에는 하나가 포함되어 있음).

PowerShell은 실제로 별도의 프로그램에 대한 대안을 제공하지 않지만 구조화 된 데이터의 Out-Grid경우 도움이 될 수 있습니다.

HeadTail모두를 에뮬레이트 할 수있다 Select-Object은 USING -First-Last각각 파라미터.

Sed기능은 모두 사용할 수 있지만 구조가 다소 다릅니다. 필터링 옵션은 Where-Object(또는 via Foreach-Object및 범위에 대한 일부 상태) 에서 사용할 수 있습니다 . 기타, 변형, 작업은 및를 사용 Select-Object하여 수행 할 수 있습니다 Foreach-Object.

그러나 PowerShell이 ​​(.NET) 개체를 전달함에 따라 모든 유형이 지정된 구조 (예 : 날짜는 DateTime인스턴스로 남아 있습니다. 각 명령이 자체적으로 구문 분석해야하는 문자열이 아니라 많은 sed프로그램과 다른 프로그램이 중복됩니다.


Windows에서 큰 (또는 작은) 로그 파일을 쿼리해야하는 경우 내가 찾은 최고의 도구는 Microsoft의 무료 Log Parser 2.2 입니다. 원하는 경우 PowerShell에서 호출 할 수 있으며 모든 무거운 작업을 매우 빠르게 수행 할 수 있습니다.


이 인스턴스에서 "-TotalCount"는 "-head"와 똑같이 응답합니다. 그런 명령을 실행하려면 -TotalCount 또는 -head를 사용해야합니다. 그러나 -TotalCount는 오해의 소지가 있습니다. 실제로는 어떤 카운트도 제공하지 않습니다.

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

PS 5.1에서 테스트 한 위의 스크립트는 아래와 같은 응답입니다.

gc -head 25 C:\scripts\logs\robocopy_report.txt

그러니 이미 '-head 25'를 사용하세요!


더 나은 솔루션이 있습니다.

gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head
gc log.txt | %{$num=0;}{$num++;"$num $_"}             # cat -n
gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed

$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = “SilentlyContinue” #Suppresses errors
#Script
    #gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
    #gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"}             # cat -n
    gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script 
$ErrorActionPreference = $Push_Pop #Suppresses errors

푸시 팝 코드 BTW에 모든 오류가 발생하는 것은 아닙니다. 코드는 "sed"옵션에서만 작동합니다. 나머지는 gc와 path를 제외한 모든 것을 무시합니다.

참고 URL : https://stackoverflow.com/questions/9682024/how-to-do-what-head-tail-more-less-sed-do-in-powershell

반응형