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


109

리눅스의에 해당하는 명령이 무엇인지 PowerShell을 사용하여 Windows,에 head, tail, more, lesssed?


로그 파일이 너무 큽니다 (약 수 MB). notepad.exe로보기가 너무 어렵습니다.
Yue Zhang

notepad기반 으로 사용 하는 경우 대체 텍스트 편집기를 사용 하는 것이 좋습니다. 많은 (무료 및 유료) 대안이 있습니다. 모두 메모장보다 우수합니다 (그다지 어렵지는 않지만).
리처드


나는 대용량 파일을 다루고 내가 사용한 다른 도구보다 훨씬 빠른 Vim을 사용 / 설치합니다.
sfanjoy

답변:


174

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을 포함한다.


3
이런 소, 이것은 -last 21GB CSV 에서 수행하기 위해 CPU를 최대로 사용하고 있습니다. 뜨거운 음료 : ☕
mlissner

9
@mlissner : PowerShell v3를 사용 Get-Content -Tail 2하는 경우 대신 사용할 수 있습니다 . 확실히 더 빠릅니다.
Joey

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sed콘텐츠를 되 돌리지 않기 때문에 실제로 sed 도구가 아닙니다. Set-Content가 필요합니다.
Artyom

3
@Neil, -Last같은 이유로 awk느립니다. 같은 작업에 대해 느릴 것입니다. 먼저 스트림을 완전히 소비해야합니다. 그것이 Get-Content -Tail존재하는 이유 입니다. 그리고 거기에는 없다 head가 명명 규칙에 적합하지 않기 때문에, 그 목적은 이미에 의해 제공됩니다 Select-Item.
조이

3
@neil @joey 그들은 -head. 내 대답 stackoverflow.com/a/41626586/1081043
wisbucky

52

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

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

그러나 Joey의 의견 은 정반대를 나타내는 것 같습니다! 누구를 신뢰해야하는지 또는 어떤 (내장) 방법이 가장 효율적인지 어떻게 알 수 있습니까?
NH.

2
@NH 내 대답은 Joey의 의견과 일치합니다. 그의 의견은 "-마지막은 느리다 ... 그것이 Get-Content -Tail이 존재하는 이유입니다." | select -last파이프를 사용합니다. -tail파이프없이 사용하고 있습니다. 그러나 두 가지 상충되는 답을 찾은 경우 훨씬 더 높은 평판을 가진 사람을 신뢰할 수 있습니다. 또한 대용량 파일에 대해 두 가지 방법을 시도해 볼 수도 있습니다. 큰 파일에서는 매우 분명합니다.
wisbucky

알았다. 죄송합니다. 게시물을 처음 읽을 때 혼란 스러웠을 것입니다.
NH.

8

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프로그램과 다른 프로그램이 중복됩니다.


훌륭한. gc가 파이프 입력을 지원하지 않는 것 같습니다. 명령의 출력을 필터링하려면 "... exe ... | select-object -first 20 | select-object -last 1"을 사용합니다.
A117

2

이 인스턴스에서 "-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'를 사용하세요!


@Patrick 안녕하세요, Stack Overflow에 오신 것을 환영합니다! 이 질문에 답해 주셔서 감사합니다. 더 자세한 설명을 제공해 주시겠습니까? 솔루션을 제공하려는 것인지 아니면 문제에 대한 의견을 추가하려는 것인지는 확실하지 않습니다.
Rocío García Luque

댓글이자 좌절이었습니다. '-head 이미하지 않는다 "-TotalCount"아무것도하지 "그래서는 TOTALCOUNT하는 방법을 누구 알고 있나요.?
패트릭 버웰

다시 읽어보십시오 ... 나는 대답에 추가하고 무엇이 효과가 있는지 명확히했습니다 ...
Patrick Burwell

1

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


어쨌든 덕분에, 내 환경은 로그인 Parser2.2의 시스템 요구 사항에하지 않은 Win2k8R2입니다
왕위 장

0

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

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

-1
$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를 제외한 모든 것을 무시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.