Windows เทียบเท่ากับคำสั่ง 'tail'


107

มีวิธีจำลองคำสั่ง* nix tailบนบรรทัดคำสั่งของ Windows หรือไม่? ฉันมีไฟล์และต้องการวิธีตัดข้อความnบรรทัดแรกออก ตัวอย่างเช่น:

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three

10
ไม่headแสดงเฉพาะnบรรทัดแรกแทนที่จะปล่อยไว้?
Joey

กรุณาคริสพิจารณาคำตอบใหม่ตั้งแต่ปี 2009 มากขึ้นโดยเฉพาะคำตอบ Amit พอร์ทนอย เนื่องจากคำถามของคุณเป็นเรื่องทั่วไปผู้ใช้หลายคนอาจพบหน้าเว็บนี้ และพวกเขาอาจหยุดอ่านคำตอบหลังจากข้อแรก: คำตอบที่คุณยอมรับ คุณสามารถเปลี่ยนคำตอบที่คุณยอมรับเป็นคำตอบอื่นที่อัปเดตเป็นไปได้ในปัจจุบัน ไชโย;)
olibre

ฉันสับสนเล็กน้อย คำถามเดิมเป็นเรื่องเกี่ยวกับรูปแบบ Unix headคำสั่ง tailแต่ผลลัพธ์ที่ต้องการดูเหมือนว่ามันเป็นที่ต้องการ ดูเหมือนว่าคำตอบจะเกี่ยวและไม่ได้head tail
blakeoft

@blakeoft คำถามเดิมกำลังถามถึงพฤติกรรมtailอย่างไรก็ตามชื่อกล่าวว่าhead
MM

คำตอบ:


89

ไม่มีค่าเทียบเท่าแน่นอน อย่างไรก็ตามมีคำสั่ง DOS ดั้งเดิม "เพิ่มเติม" ที่มีตัวเลือก + n ที่จะเริ่มส่งออกไฟล์หลังจากบรรทัดที่ n:

พรอมต์ DOS:

C:\>more +2 myfile.txt

คำสั่งดังกล่าวจะแสดงผลทุกอย่างหลังจาก 2 บรรทัดแรก
นี่คือค่าผกผันของ Unix head :

คอนโซล Unix:

root@server:~$ head -2 myfile.txt

คำสั่งดังกล่าวจะพิมพ์เฉพาะ 2 บรรทัดแรกของไฟล์


8
ไม่มันไม่เหมือนกัน tailเริ่มนับจากท้ายไฟล์ ดังนั้นtail -2จะพิมพ์สองบรรทัดสุดท้าย
ADTC

5
พิมพ์ n ตัวแรกด้วยได้ไหม
Qwerty

@ADTC (เวอร์ชันของฉัน) tail ไม่สนับสนุนเชิงลบ เฉพาะหัวเท่านั้น (gnuwin32)
nl-x

@ nl-x -2ไม่ใช่ค่าลบ เป็นเพียงเวอร์ชันชวเลขของ-n 2(จำนวนบรรทัด) น่าเสียดายที่tailไม่สนับสนุนการใช้งานมากเกินไป-2ทำให้ไม่สอดคล้องกับheadการใช้งานที่มาพร้อมกัน มันทำให้ฉันรำคาญหลายครั้งเกินไป
ADTC

@ADTC อ่าขอโทษ ผมกำลังสับสนกับที่แตกต่างจากhead -n -2 head -n 2แต่ด้วยหางหลังไม่มีอยู่
nl-x

111

หากคุณมีWindows PowerShellติดตั้ง (ฉันคิดว่ารวมไว้ตั้งแต่ XP) คุณสามารถเรียกใช้จาก cmd.exe:

คำสั่งหัวหน้า:

powershell -command "& {Get-Content *filename* -TotalCount *n*}"

คำสั่งหาง:

powershell -command "& {Get-Content *filename* | Select-Object -last *n*}"

หรือโดยตรงจาก PowerShell:

Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*


อัพเดต

PowerShell 3.0 (Windows 8 และสูงกว่า) เพิ่มคำสั่งที่มีนามแฝง Tail และชื่อแทนเป็นLastHeadFirstTotalCountมีการเพิ่ม

ดังนั้นคำสั่งสามารถเขียนใหม่เป็นไฟล์

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*

ไม่ทำตัวแบบนี้headแทนtailเหรอ?
blakeoft

@blakeoft ใช่แล้ว ... ฉันได้อัปเดตคำตอบแล้ว น่าทึ่งมากที่ต้องใช้เวลา 2 ปีและมีการโหวต 17 ครั้งก่อนที่จะมีคนแสดงความคิดเห็น
Amit Portnoy

@blakeoft เพิ่งรู้ตัวว่าแก้ไขคำถามแล้ว! (ดู stackoverflow.com/posts/1295068/revisions) เดิมมันขอคำสั่งหัวหน้า ... อัปเดตเพื่อรวมทั้งสองคำตอบ ...
Amit Portnoy

2
@AmitPortnoy ฉันพบคำตอบอื่นในการแลกเปลี่ยนสแต็กนี้โดยบอกว่าGet-Contentมีคำสั่ง tail แล้ว ตัวอย่างเช่นGet-content -Tail 5 file.txtจะพิมพ์ file.txt ห้าบรรทัดสุดท้าย ขอบคุณสำหรับการอัปเดตคำตอบของคุณ btw
blakeoft

2
วิธีใดที่จะใช้เป็นตัวกรอง? (เช่นการอ่าน stdin แทนไฟล์)
eadmaster

24
more /e filename.txt P n

โดยที่ n = จำนวนแถวที่จะแสดง ทำงานได้รวดเร็วและเหมือนกับheadคำสั่ง


14
คำสั่งเช่น P, S และอื่น ๆ สามารถป้อนได้โดยผู้ใช้ที่พร้อมต์เท่านั้น ไม่สามารถส่งผ่านไปยังคำสั่ง more ดังนั้นตัวอย่างข้างต้นจึงใช้ไม่ได้
Philibert Perusse


12

นี่เป็นการแฮ็กทั้งหมด แต่ถ้าเป็นไฟล์ขนาดใหญ่ที่คุณต้องการตรวจสอบรูปแบบส่วนหัวและอื่น ๆ และคุณกำลังมองหาวิธีแก้ปัญหาคุณสามารถเปลี่ยนเส้นทางผลลัพธ์ 'เพิ่มเติม' ไปยังไฟล์ใหม่และ CTRL-C ได้ตลอดเวลา อย่างรวดเร็ว. ไม่สามารถควบคุมแถวเอาต์พุตได้อย่างแม่นยำและคุณมักจะฆ่ามันในช่วงกลางของบรรทัดเอาต์พุต แต่เป็นวิธีที่ถูกในการคว้าไฟล์ขนาดเล็กที่ใช้ไม่ได้

เช่น

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
บรรทัด 1
บรรทัด 2
ฯลฯ ...... ค:\

9

สิ่งนี้จะทำได้แต่ก็เร็วเท่าที่เห็น (ประมาณ O (n * m) โดยที่ n คือจำนวนบรรทัดที่จะแสดงและ m คือจำนวนบรรทัดทั้งหมดในไฟล์):

for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" filename ^| findstr /r "^%l:"') do @echo %b

โดยที่ "10" คือจำนวนบรรทัดที่คุณต้องการพิมพ์และ "ชื่อไฟล์" คือชื่อของไฟล์


6
+1 สำหรับโซลูชันที่ใช้เวลาพิมพ์นานกว่าการดาวน์โหลดพอร์ตของhead.
Camilo Martin

1
หมายเหตุ: ใส่นิพจน์นี้ในวงเล็บ - (expr) > out.txt- เมื่อส่งผลลัพธ์ไปยังไฟล์หรือคุณจะได้รับเฉพาะบรรทัดสุดท้าย หรือต่อท้าย - expr >> out.txt.
cz


7

เมื่อใช้มากกว่า + n ที่ Matt ได้กล่าวไว้แล้วเพื่อหลีกเลี่ยงการหยุดชั่วคราวในไฟล์ขนาดยาวให้ลองทำดังนี้:

อีก +1 myfile.txt> con

เมื่อคุณเปลี่ยนเส้นทางเอาต์พุตจากมากกว่านั้นจะไม่หยุดชั่วคราว - และที่นี่คุณจะเปลี่ยนเส้นทางไปยังคอนโซล คุณสามารถเปลี่ยนเส้นทางไปยังไฟล์อื่นได้เช่นเดียวกันโดยไม่ต้องหยุดเพิ่มเติมหากนั่นคือผลลัพธ์ที่คุณต้องการ ใช้> เพื่อเปลี่ยนเส้นทางไปยังไฟล์และเขียนทับหากมีอยู่แล้วหรือ >> เพื่อต่อท้ายไฟล์ที่มีอยู่ (สามารถใช้อย่างใดอย่างหนึ่งเพื่อเปลี่ยนเส้นทางไปยัง con)



5

Get-content -Tail n file.txtด้วย powershell เป็นสิ่งเดียวที่เข้ามาใกล้tailใน linux

Get-Content *filename* | Select-Object -last *n*แนะนำข้างต้นโหลด / แยกสิ่งที่ทั้ง ไม่จำเป็นต้องพูดว่ามันไม่พอใจกับไฟล์บันทึก 10GB ของฉัน ... -Tailตัวเลือกนี้จะเริ่มต้นเมื่อสิ้นสุดไฟล์


2

หากคุณต้องการคำสั่ง head วิธีง่ายๆในการติดตั้ง Cygwin จากนั้นคุณจะมีเครื่องมือ UNIX ทั้งหมดที่คุณต้องการ

หากนั่นไม่ใช่วิธีแก้ปัญหาที่ดีคุณสามารถลองใช้ findstr และค้นหาอินดิเคเตอร์ end-of-line

findstr บน MSDN: http://technet.microsoft.com/en-us/library/bb490907.aspx


2

นี่คือคำสั่ง head แบบเนทีฟแบบรวดเร็วที่ให้ 9 บรรทัดแรกใน DOS

findstr /n "." myfile.txt | findstr "^.:"

อักขระ 2 ตัวแรกในแต่ละบรรทัดจะเป็นหมายเลขบรรทัด


2

มีชุดทรัพยากรที่สามารถดาวน์โหลดได้จากที่นี่: http://www.microsoft.com/downloads/th/confirmation.aspx?familyId=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displayLang=th

มีเครื่องมือ tail.exe แต่เข้ากันได้กับ Windows บางรุ่นเท่านั้น

(คัดลอกมาจากโพสต์นี้: คำสั่ง Tail สำหรับ windows )


2

ใน PS พยายามใช้คำสั่ง:

Select -Last 1

คำสั่งนี้สามารถไพพ์ไลน์ได้ด้วย

ตัวอย่างที่จะได้รับบรรทัดแรก:

type .\out.txt | Select -Last 1

หรือเพื่อรับบรรทัดแรก:

 type .\out.txt | Select -First 1

1

FWIW สำหรับผู้ที่ต้องการตัดจำนวนระเบียนที่ไม่แน่นอนจากส่วนหัวของไฟล์เพิ่มเติม>ทำงานได้ดี สิ่งนี้มีประโยชน์เพียงแค่มีไฟล์ขนาดเล็กที่จะใช้งานได้ในช่วงแรกของการพัฒนาบางสิ่ง


1

ฉันไม่ได้ลองแยกช่วง แต่ฉันสามารถรับบรรทัดโดยใช้คำสั่ง DOS ต่อไปนี้:

find /N " " *.log|find "[6]" 

เนื่องจากไฟล์ส่วนใหญ่มีช่องว่างคำสั่งนี้จะดึงทุกบรรทัดจากไฟล์ LOG ทั้งหมดและโดยพื้นฐานแล้วจะเริ่มจาก 1 สำหรับแต่ละไฟล์ ผลลัพธ์ที่เป็นตัวเลขจะถูกส่งไปยังFINDคำสั่งที่สองซึ่งค้นหาบรรทัดที่แท็กเป็นหมายเลข 6


1

มีheadยูทิลิตี้ฟรีในหน้านี้ที่คุณสามารถใช้ได้ ผมยังไม่ได้ลอง


1
ไม่แน่ใจว่าเหตุใดจึงถูกลดคะแนน มันรันว่าเหมือนยูทิลิตี้หัวยูนิกซ์
coson

1
มันเป็นลิงค์ดาวน์โหลด เขาควรจะเข้ารหัสไบนารีและฝังไว้ในคำตอบหรือไม่?
GargantuChet

0
set /p line= < file.csv 
echo %line%

มันจะส่งคืนบรรทัดแรกของไฟล์ของคุณใน cmd Windows ในตัวแปร% line%


0

เป็นคำตอบร่วมสมัยหากใช้ Windows 10 คุณสามารถใช้ "Linux Subsystem for Windows" ได้

https://docs.microsoft.com/en-us/windows/wsl/install-win10

สิ่งนี้จะช่วยให้คุณสามารถเรียกใช้คำสั่ง linux ดั้งเดิมจากใน windows และรัน tail ตามที่คุณต้องการใน linux


-2

ฉันไม่คิดว่าจะมีทางออกนอกกรอบ ไม่มีคำสั่งดังกล่าวใน DOS และไฟล์แบตช์นั้น จำกัด เพียงการจำลอง (โดยไม่ต้องเจ็บปวดมาก)


-2

คำเตือนการใช้ไฟล์แบตช์สำหรับโทเค็นและขีดความสามารถในการป้อนข้อความที่ไม่รู้จักอาจเป็นภัยพิบัติเนื่องจากการตีความอักขระพิเศษเช่น &,!, <ฯลฯ ควรสงวนวิธีการดังกล่าวไว้สำหรับข้อความที่คาดเดาได้เท่านั้น

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