จะทำอย่างไรให้หัวหางมากขึ้นน้อยลงใน Powershell? [ปิด]


111

บน Windows, ใช้ Powershell สิ่งที่เป็นคำสั่งที่เทียบเท่ากับลินุกซ์head, tail, more, lessและsed?


ไฟล์บันทึกใหญ่เกินไปประมาณหลายเมกะไบต์ มันยากเกินไปที่จะดูโดย notepad.exe
Yue Zhang

หากคุณใช้notepadเป็นฐานของคุณฉันขอแนะนำให้ดูเครื่องมือแก้ไขข้อความทางเลือกมีทางเลือกมากมาย (ทั้งฟรีและจ่ายเงิน) ทั้งหมดนี้เหนือกว่า notepad (แม้ว่าจะไม่ใช่เรื่องท้าทายมากนัก)
Richard

อาจซ้ำกันของPowerShell กับ Unix Shells
manojlds

ฉันจัดการกับไฟล์ขนาดใหญ่และฉันใช้ / ติดตั้ง Vim ซึ่งพิสูจน์ได้เร็วกว่าเครื่องมืออื่น ๆ ที่ฉันเคยใช้
sfanjoy

คำตอบ:


176

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 ส่วนขยายของชุมชนได้แก่ cmdlets บางสิ่งไฟล์เฉพาะ (เช่นได้รับ FileTail)


3
วัวศักดิ์สิทธิ์นี่คือการเพิ่มประสิทธิภาพ CPU ของฉันเพื่อทำ-last 2CSV 1GB เครื่องดื่มร้อน: ☕
mlissner

9
@mlissner: หากคุณใช้ PowerShell v3 คุณสามารถใช้Get-Content -Tail 2แทนได้ เร็วกว่าแน่นอน
Joey

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sedนั่นไม่ใช่เครื่องมือ sed อย่างแท้จริงเนื่องจากไม่ได้ใส่เนื้อหากลับ ต้องมีเนื้อหาชุด
Artyom

3
@ นีล-Lastช้าด้วยเหตุผลเดียวกันawkจะช้าสำหรับงานเดียวกัน: ต้องกินสตรีมให้หมดก่อน นั่นเป็นเหตุผลที่Get-Content -Tailมีอยู่ และไม่มีheadเพราะมันไม่เข้ากับหลักการตั้งชื่อและจุดประสงค์ของมันได้รับการตอบSelect-Itemสนองแล้ว
Joey

3
@neil @joey พวกเขามีนามแฝงสำหรับ-head. ดูคำตอบของฉันstackoverflow.com/a/41626586/1081043
wisbucky

54

นี่คือในตัววิธีที่จะทำและhead tailอย่าใช้ไพพ์เพราะถ้าคุณมีไฟล์ขนาดใหญ่มันจะช้ามาก การใช้ตัวเลือกในตัวเหล่านี้จะรวดเร็วมากแม้กับไฟล์ขนาดใหญ่

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

แต่ความคิดเห็นของโจอี้ดูเหมือนจะบ่งบอกตรงกันข้าม! ฉันจะรู้ได้อย่างไรว่าใครควรเชื่อถือหรือวิธีใด (ในตัว) ที่มีประสิทธิภาพมากที่สุด
เอช.

2
@NH คำตอบของฉันสอดคล้องกับความคิดเห็นของโจอี้ ความคิดเห็นของเขาระบุว่า "- สุดท้ายช้า ... นั่นเป็นเหตุผลว่าทำไม Get-Content -Tail จึงมีอยู่" | select -lastใช้ท่อ ฉันใช้-tailโดยไม่ใช้ท่อ แต่ถ้าคุณเคยพบคำตอบที่ขัดแย้งกันสองคำคุณอาจจะเชื่อใจคนที่มีชื่อเสียงสูงกว่ามาก นอกจากนี้คุณสามารถลองใช้สองวิธีในไฟล์ขนาดใหญ่ได้ จะเห็นได้ชัดมากในไฟล์ขนาดใหญ่
วิสบัคกี้

เข้าใจแล้ว ขอโทษทีฉันต้องสับสนในครั้งแรกที่อ่านกระทู้
เอช.

8

more.exeมีอยู่ใน Windows พอร์ตlessต่างๆสามารถพบได้ง่าย (และPowerShell Community Extensions , PSCX รวมอยู่ด้วย)

PowerShell ไม่มีทางเลือกอื่นให้กับโปรแกรมที่แยกจากกันสำหรับทั้งสองโปรแกรม แต่สำหรับข้อมูลที่มีโครงสร้างOut-Gridจะเป็นประโยชน์

HeadและTailสามารถจำลองได้Select-Objectโดยใช้พารามิเตอร์-Firstและ-Lastตามลำดับ

Sedมีฟังก์ชันทั้งหมด แต่มีโครงสร้างค่อนข้างแตกต่างกัน ตัวเลือกการกรองมีอยู่ในWhere-Object(หรือผ่าน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! ขอบคุณที่พยายามตอบคำถามนี้โปรดให้คำอธิบายโดยละเอียดเพิ่มเติมได้ไหม ไม่ชัดเจนว่าคุณกำลังพยายามเสนอวิธีแก้ปัญหาหรือเพียงแค่เพิ่มความคิดเห็นเกี่ยวกับปัญหา
Luque

มันเป็นความคิดเห็นและความหงุดหงิด "-TotalCount" ไม่ทำอะไรที่ "-Head" ยังทำไม่ได้แล้วใคร ๆ ก็ไม่รู้จะรับ TotalCount ได้อย่างไร
Patrick Burwell

อ่านอีกครั้ง ... ฉันเพิ่มคำตอบและชี้แจงว่าอะไรได้ผล ...
Patrick Burwell

1

หากคุณจำเป็นต้องแบบสอบถามที่มีขนาดใหญ่ (หรือเล็ก) ล็อกไฟล์บน Windows, เครื่องมือที่ดีที่สุดที่ฉันได้พบคือ Microsoft ฟรีเข้าสู่ระบบ Parser 2.2 คุณสามารถเรียกใช้จาก PowerShell ได้หากต้องการและจะช่วยยกของหนักทั้งหมดให้คุณและเร็วมากด้วย


ยังไงก็ตามสภาพแวดล้อมของฉันคือ Win2k8R2 ซึ่งไม่อยู่ในข้อกำหนดของระบบของ Log Parser2.2
Yue Zhang

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

คุณไม่ได้รับข้อผิดพลาดทั้งหมดด้วยรหัส pushpop BTW รหัสของคุณใช้งานได้กับตัวเลือก "sed" เท่านั้น ส่วนที่เหลือทั้งหมดไม่สนใจอะไรเลยนอกจาก gc และ path

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.