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을 포함한다.
다음은 기본 제공 방법 head
및 tail
. 큰 파일이 있으면 매우 느리므로 파이프를 사용하지 마십시오. 이러한 기본 제공 옵션을 사용하면 대용량 파일에서도 매우 빠릅니다.
gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
more.exe
Windows에 존재하며 포트를 less
쉽게 찾을 수 있습니다 ( PowerShell Community Extensions , PSCX에는 하나가 포함되어 있음).
PowerShell은 실제로 별도의 프로그램에 대한 대안을 제공하지 않지만 구조화 된 데이터의 Out-Grid
경우 도움이 될 수 있습니다.
Head
및 Tail
모두를 에뮬레이트 할 수있다 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
'Programing' 카테고리의 다른 글
메시지 펌프 란? (0) | 2020.08.26 |
---|---|
두 가지 조건을 하나로 확인하는 방법 (0) | 2020.08.26 |
JavaScript로 한 달의 일수를 결정하는 가장 좋은 방법은 무엇입니까? (0) | 2020.08.26 |
단일 소스 파일에서 몇 개의 타겟을 생성하는 GNU Makefile 규칙 (0) | 2020.08.26 |
REST API를 대체하는 Websocket API? (0) | 2020.08.26 |