ตรงข้ามกับหัวอะไร ฉันต้องการทั้งหมดยกเว้น N บรรทัดแรกของไฟล์


142

ด้วยไฟล์ข้อความที่มีความยาวที่ไม่รู้จักฉันจะอ่านได้อย่างไรเช่นทั้งหมดยกเว้น 2 บรรทัดแรกของไฟล์ ฉันรู้ว่าtailจะให้ N บรรทัดสุดท้าย แต่ฉันไม่รู้ว่า N มีอะไรก่อนเวลา

ดังนั้นสำหรับไฟล์

AAAA
BBBB
CCCC
DDDD
EEEE

ฉันต้องการ

CCCC
DDDD
EEEE

และสำหรับไฟล์

AAAA
BBBB
CCCC

ฉันจะได้รับเพียงแค่

CCCC

คำตอบ:


211

tail --help ให้ดังต่อไปนี้:

  -n, --lines=K            output the last K lines, instead of the last 10;
                           or use -n +K to output lines starting with the Kth

ดังนั้นในการกรอง2บรรทัดแรก-n +3ควรให้ผลลัพธ์ที่คุณต้องการ (เริ่มจากอันดับ 3)


2
หน้าคนของฉันไม่ได้แสดงรายการตัวเลือก แต่ใช้งานได้ดี - ขอบคุณ!
Nicholas MT Elliott

@ นิโคลัส: แปลกฉันคิดว่ามันจะเป็นเอกสารมาตรฐานโดยไม่คำนึงถึงระบบปฏิบัติการ ฉันดึงมันมาจาก Cygwin ใน Windows ดังนั้นฉันไม่รู้ว่ามันดูเหมือนอะไรใน Linux distros ต่างๆ ดีใจที่มันทำงาน
Joe Enos

@NicholasMTElliott man7แสดงรายการเหมือน manpage ของ Joe Enos ดังนั้นจึงน่าจะเป็นปัญหารุ่น manpage
Uli Köhler

@SteveJorgensen: ฉันไม่เข้าใจว่าความคิดเห็นของคุณหมายถึงอะไร ดูเหมือนจะไม่มีใครแนะนำให้ใช้headสำหรับสิ่งนี้?
ruakh

22

สมมติว่ารุ่นหางของคุณรองรับคุณสามารถระบุการเริ่มหางหลังจากเส้น X ในกรณีของคุณคุณต้องทำ 2 + 1

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

วิธีง่ายๆในการใช้ awk:

awk 'NR > 2 { print }' file.name

พวกเราคนหนึ่งสับสน คำถามบอกว่า: "ทั้งหมดยกเว้น 2 บรรทัดแรกของไฟล์" คำสั่งนั้นไม่ตรงตามข้อกำหนดอย่างไร
janm

6
{ print }เป็นการกระทำเริ่มต้นและสามารถละเว้นได้
tripleee

8

ลองsed 1,2dดู แทนที่ 2 ตามต้องการ


ทำงานอย่างที่คาดไว้ .. เนื่องจากไม่ทราบจำนวนบรรทัดหลังจาก 2 บรรทัดแรก
kumarprd

6

tail -n +linecount filenameจะเริ่มต้นการส่งออกที่บรรทัดlinecountของfilenameดังนั้นtail -n +3 filename ควรจะทำสิ่งที่คุณต้องการ


สิ่งนี้จะไม่ทำงานในเปลือกของฉัน แต่tail -n +17 filenameจะ ฉันใช้ bash / ubuntu LTS
isomorphismes

2
@ iso: ขอบคุณสำหรับ heads-up - tailยอมรับเวอร์ชันเก่าของไวยากรณ์ที่ฉันใช้ในคำตอบเดิมของฉัน แต่ตอนนี้หนึ่งต้องใช้-nตัวเลือกที่ชัดเจน ฉันอัพเดตคำตอบแล้ว
Jim Lewis

0

ใช้สิ่งนี้โดยสมมติว่าตัวอย่างแรกเรียกว่า sample1.dat tail --lines=3 sample1.datซึ่งจะพิมพ์ทุกบรรทัดจากบรรทัดที่ 3 ถึงบรรทัดสุดท้าย

สำหรับตัวอย่างที่สองสมมติว่ามันถูกเรียกว่า sample2.dat อีกครั้งtail --lines=-1 sample2.datซึ่งจะพิมพ์บรรทัดสุดท้าย ...


@ จิม: อะไรคือสิ่งที่แตกต่างกับของคุณและของฉัน? .... สิ่งเดียวกัน .... : o ฉันหมายถึงอินพุตไฟล์ข้อมูลตัวอย่างสองรายการตามคำถามของเขาและแสดงวิธีการบรรลุสิ่งที่เขากำลังมองหา ... .
t0mm13b

ตกลง ... แล้วทำไมเขาถึงขอตัวอย่างที่สองและแสดงผลลัพธ์ที่เขาต้องการซึ่งก็คือสิ่งที่ฉันใช้ 'tail --lines = -1' ...... แน่นอนคุณสามารถละเว้นชื่อไฟล์ได้อย่างสมบูรณ์และยังคงอยู่ สามารถทำหน้าที่เป็น
ไพพ์

@ ทอมมี่: โอ๊ะลืมสิ่งที่ฉันพูดเกี่ยวกับท่อ ... ฉันต้องคิดถึงยูทิลิตี้อื่น ๆ แต่ประเด็นของฉันคือคำสั่งเดียวtail +3 anyfileให้ผลลัพธ์ที่ต้องการสำหรับกรณีทั่วไปในขณะที่tail --lines=Nต้องการทราบ N ล่วงหน้าเพื่อให้ได้ผลลัพธ์ที่ต้องการ
Jim Lewis

@ ทอมมี่: แต่นี่คือtail... ไม่ควรที่จะ "ก้น" ใช่มั้ย? (Ba-dum TISH ขอขอบคุณฉันจะอยู่ที่นี่ตลอดทั้งสัปดาห์ ... )
Jim Lewis

0

ฉันไม่รู้ว่าจะทำอย่างไรจากแค่หางหรือหัว แต่ด้วยความช่วยเหลือของwc -l(การนับบรรทัด) และการแสดงออกของ bash คุณสามารถบรรลุเป้าหมายนั้นได้

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

หวังว่านี่จะช่วยได้


1
การดำเนินการนี้ต้องผ่านไฟล์ทั้งหมดก่อนที่จะรัน tail หากไฟล์มีขนาดใหญ่กว่าขนาดของหน่วยความจำสิ่งนี้จะไม่มีประสิทธิภาพมาก มันไม่ได้จัดการไฟล์น้อยกว่าสองบรรทัด มันไม่ได้จัดการกับขนาดการเปลี่ยนไฟล์ระหว่าง wc และส่วนท้าย
janm

2
@janm: คุณไม่เป็นไร คำตอบอื่น ๆ ดีกว่า ฉันรู้สึกอับอาย :-p
NawaMan

-1

ใช้ awk เพื่อรับทั้งหมดยกเว้น 2 บรรทัดสุดท้าย

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

awk เพื่อรับทั้งหมดยกเว้น 2 บรรทัดแรก

awk 'NR>2' file

หรือคุณสามารถใช้มากขึ้น

more +2 file

หรือเพียงแค่ทุบตี

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

ตอนนี้สิ่งนี้ไม่เป็นไปตามข้อกำหนด คำถามบอกว่า "ทั้งหมดยกเว้น 2 บรรทัดแรกของไฟล์" และให้สองตัวอย่างแต่ละคนมีไฟล์เดียวที่สองบรรทัดแรกจะถูกข้ามและส่วนที่เหลือของไฟล์จะถูกส่งไปยัง stdout นั่นไม่ใช่สิ่งที่คำสั่งนี้ทำ
janm

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