วิธีรับส่วนของไฟล์หลังจากบรรทัดแรกที่ตรงกับนิพจน์ทั่วไป


169

ฉันมีไฟล์ที่มีประมาณ 1,000 บรรทัด ฉันต้องการส่วนของไฟล์ของฉันหลังจากบรรทัดที่ตรงกับคำสั่ง grep ของฉัน

นั่นคือ:

$ cat file | grep 'TERMINATE'     # It is found on line 534

ดังนั้นฉันต้องการไฟล์จากบรรทัด 535 ถึงบรรทัด 1000 สำหรับการประมวลผลเพิ่มเติม

ฉันจะทำสิ่งนั้นได้อย่างไร


34
UUOC (การใช้แมวอย่างไร้ประโยชน์):grep 'TERMINATE' file
ยาโคบ

30
ฉันรู้ว่ามันเหมือนฉันใช้อย่างนั้น ให้กลับมาที่คำถาม
Jugal Jindle

3
นี่เป็นคำถามการเขียนโปรแกรมที่ดีอย่างสมบูรณ์และเหมาะสำหรับ stackoverflow
aioobe

13
@Jacob มันไม่ได้ใช้ประโยชน์จากแมวเลย การใช้งานคือการพิมพ์ไฟล์ไปยังเอาต์พุตมาตรฐานซึ่งหมายความว่าเราสามารถใช้grepอินพุตอินเทอร์เฟซมาตรฐานเพื่ออ่านข้อมูลแทนที่จะต้องเรียนรู้ว่าสวิตช์ใดที่จะนำไปใช้กับgrepและsedและawkและpandocและและและffmpegอื่น ๆ เมื่อเราต้องการอ่าน จากไฟล์ มันช่วยประหยัดเวลาเพราะเราไม่ต้องเรียนรู้สวิตช์ใหม่ทุกครั้งที่เราต้องการทำสิ่งเดียวกัน: อ่านจากไฟล์
runeks

@runeks ผมเห็นด้วยกับความเชื่อมั่นของคุณ - grep 'TERMINATE' < fileแต่คุณสามารถบรรลุว่าไม่มีแมว: บางทีมันอาจจะทำให้อ่านบิตยาก - แต่นี้เป็นเชลล์สคริปต์เพื่อให้ของเสมอไปจะมีปัญหา :)
LOAS

คำตอบ:


307

ต่อไปนี้จะพิมพ์การจับคู่บรรทัดTERMINATEจนถึงจุดสิ้นสุดของไฟล์:

sed -n -e '/TERMINATE/,$p'

อธิบาย: -nการทำงานเริ่มต้นปิดการใช้งานของsedการพิมพ์แต่ละบรรทัดหลังจากรันสคริปต์ของมันที่มัน-eชี้ให้เห็นสคริปต์ไปsed, /TERMINATE/,$เป็นอยู่ (สาย) การเลือกหมายถึงบรรทัดแรกตรงกับช่วงTERMINATEการแสดงออกปกติ (เช่น grep) ไปยังจุดสิ้นสุดของไฟล์ ( $) และpเป็นคำสั่งพิมพ์ที่พิมพ์บรรทัดปัจจุบัน

สิ่งนี้จะพิมพ์จากบรรทัดที่ตามหลังการจับคู่บรรทัดTERMINATEจนถึงจุดสิ้นสุดของไฟล์:
(จากหลังบรรทัดที่ตรงไปยัง EOF ไม่รวมบรรทัดที่ตรงกัน)

sed -e '1,/TERMINATE/d'

อธิบาย: 1,/TERMINATE/เป็นการเลือกช่วงที่อยู่ (บรรทัด) หมายถึงบรรทัดแรกสำหรับอินพุตไปยังบรรทัดแรกที่ตรงกับTERMINATEนิพจน์ทั่วไปและdเป็นคำสั่งลบที่ลบบรรทัดปัจจุบันและข้ามไปที่บรรทัดถัดไป เนื่องจากsedพฤติกรรมเริ่มต้นคือการพิมพ์บรรทัดมันจะพิมพ์บรรทัดหลังจากTERMINATE ถึงจุดสิ้นสุดของอินพุต

แก้ไข:

ถ้าคุณต้องการเส้นก่อนTERMINATE:

sed -e '/TERMINATE/,$d'

และถ้าคุณต้องการทั้งสองบรรทัดก่อนและหลังTERMINATEใน 2 ไฟล์ที่แตกต่างกันในการส่งผ่านครั้งเดียว:

sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file

ไฟล์ก่อนและหลังจะมีบรรทัดที่ถูกยกเลิกดังนั้นในการประมวลผลแต่ละไฟล์ที่คุณต้องใช้:

head -n -1 before
tail -n +2 after

Edit2:

หากคุณไม่ต้องการรหัสฮาร์ดชื่อไฟล์ในสคริปต์ sed คุณสามารถ:

before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file

แต่คุณต้องหลีกเลี่ยง$ความหมายของบรรทัดสุดท้ายดังนั้นเชลล์จะไม่พยายามขยาย$wตัวแปร (โปรดทราบว่าตอนนี้เราใช้เครื่องหมายคำพูดคู่ล้อมรอบสคริปต์แทนที่จะเป็นเครื่องหมายคำพูดเดี่ยว)

ฉันลืมที่จะบอกว่าบรรทัดใหม่มีความสำคัญหลังจากชื่อไฟล์ในสคริปต์เพื่อให้รู้ว่าชื่อไฟล์สิ้นสุด


แก้ไข: 2016-0530

SébastienClémentถามว่า: "คุณจะเปลี่ยนฮาร์ดโค้ดTERMINATEด้วยตัวแปรได้อย่างไร"

คุณจะสร้างตัวแปรสำหรับข้อความที่ตรงกันจากนั้นทำเช่นเดียวกับตัวอย่างก่อนหน้า:

matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file

เพื่อใช้ตัวแปรสำหรับข้อความที่ตรงกันกับตัวอย่างก่อนหน้านี้:

## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the 
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"

จุดสำคัญเกี่ยวกับการแทนที่ข้อความด้วยตัวแปรในกรณีเหล่านี้คือ:

  1. ตัวแปร ( $variablename) อยู่ในsingle quotes[ '] จะไม่ "ขยาย" แต่ตัวแปรภายในdouble quotes[ "] จะ ดังนั้นคุณต้องเปลี่ยนทั้งหมดsingle quotesไปdouble quotesถ้าพวกเขามีข้อความที่คุณต้องการแทนที่ด้วยตัวแปร
  2. sedช่วงยังมีและมีการปฏิบัติตามทันทีด้วยตัวอักษรเช่น:$ , , พวกเขายังจะมีลักษณะเช่นตัวแปรที่จะขยายตัวดังนั้นคุณจะต้องหลบหนีบรรดาตัวอักษรที่มีเครื่องหมาย [ ] ที่ชอบ: , ,$p$d$w$\\$p\$d\$w

เราจะได้รับบรรทัดก่อนที่จะยุติและลบทั้งหมดที่ตามมา?
Jugal Yindle

คุณจะแทนที่เทอร์มินัลฮาร์ดโค้ดโดยตัวแปรอย่างไร
SébastienClément

2
กรณีการใช้งานอย่างหนึ่งที่ขาดหายไปที่นี่คือวิธีการพิมพ์บรรทัดหลังเครื่องหมายสุดท้าย (หากมีหลายบรรทัดในไฟล์ .. คิดว่าไฟล์บันทึกเป็นต้น)
mato

ตัวอย่างsed -e "1,/$matchtext/d"ไม่ทำงานเมื่อ$matchtextเกิดขึ้นในบรรทัดแรก sed -e "0,/$matchtext/d"ผมต้องเปลี่ยนไป
Karalga

61

เป็นการประมาณง่ายๆที่คุณสามารถใช้

grep -A100000 TERMINATE file

ซึ่ง greps สำหรับTERMINATEและส่งออกได้สูงสุดถึง 100,000 บรรทัดต่อจากบรรทัดนั้น

จากหน้าคน

-A NUM, --after-context=NUM

พิมพ์ NUM บรรทัดบริบทการติดตามหลังการจับคู่บรรทัด วางบรรทัดที่มีตัวคั่นกลุ่ม (-) ระหว่างกลุ่มที่อยู่ติดกัน ด้วยตัวเลือก -o หรือ - เฉพาะการจับคู่สิ่งนี้จะไม่มีผลกระทบและจะได้รับคำเตือน


อาจใช้งานได้ แต่ฉันจำเป็นต้องเขียนโค้ดลงในสคริปต์เพื่อประมวลผลไฟล์จำนวนมาก ดังนั้นแสดงวิธีแก้ปัญหาทั่วไป
Jugal Yindle

3
ฉันคิดว่านี่เป็นทางออกหนึ่งที่ใช้งานได้จริง!
michelgotta

2
-B NUM, --before-context = NUM ​​พิมพ์ NUM บรรทัดของบริบทนำหน้าก่อนการจับคู่บรรทัด วางบรรทัดที่มีตัวคั่นกลุ่ม (-) ระหว่างกลุ่มที่อยู่ติดกัน ด้วยตัวเลือก -o หรือ - เฉพาะการจับคู่สิ่งนี้จะไม่มีผลกระทบและจะได้รับคำเตือน
PiyusG

วิธีนี้ใช้ได้ผลกับฉันเพราะฉันสามารถใช้ตัวแปรเป็นสตริงของฉันเพื่อตรวจสอบได้อย่างง่ายดาย
Jose Martinez

3
ความคิดดี! หากคุณไม่แน่ใจเกี่ยวกับขนาดของบริบทคุณอาจนับจำนวนบรรทัดของfileแทน:grep -A$(cat file | wc -l) TERMINATE file
เล็มมิ่ง

26

เครื่องมือที่ใช้ที่นี่คือ awk:

cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1}  {if (found) print }'

มันทำงานอย่างไร:

  1. เราตั้งค่าตัวแปร 'พบ' เป็นศูนย์โดยประเมินว่าเป็นเท็จ
  2. หากการจับคู่สำหรับ 'ยุติ' พบกับการแสดงออกปกติเราตั้งค่าให้เป็นหนึ่ง
  3. ถ้าตัวแปร 'found' ของเราหาค่าเป็น True ให้พิมพ์ :)

โซลูชันอื่นอาจใช้หน่วยความจำจำนวนมากหากคุณใช้ในไฟล์ขนาดใหญ่มาก


เรียบง่ายสง่างามและทั่วไปมาก ในกรณีของฉันมันกำลังพิมพ์ทุกอย่างจนกว่าจะเกิดเหตุการณ์ที่สองของ '###':cat file | awk 'BEGIN{ found=0} /###/{found=found+1} {if (found<2) print }'
Aleksander Stelmaczonek

3
เครื่องมือไม่ได้catที่จะใช้ที่นี่เป็น awkมีความสามารถอย่างสมบูรณ์ในการรับชื่อไฟล์อย่างน้อยหนึ่งชื่อเป็นอาร์กิวเมนต์ ดูเพิ่มเติมstackoverflow.com/questions/11710552/useless-use-of-cat
tripleee

9

หากฉันเข้าใจคำถามของคุณถูกต้องคุณต้องการให้บรรทัดหลังจาก TERMINATEนั้นไม่รวมTERMINATE-line awkสามารถทำได้ด้วยวิธีง่ายๆ:

awk '{if(found) print} /TERMINATE/{found=1}' your_file

คำอธิบาย:

  1. แม้ว่าจะไม่ใช่วิธีปฏิบัติที่ดีที่สุดคุณสามารถพึ่งพาข้อเท็จจริงที่ว่า vars ทั้งหมดมีค่าเริ่มต้นเป็น 0 หรือสตริงว่างถ้าไม่ได้กำหนดไว้ ดังนั้นนิพจน์แรก ( if(found) print) จะไม่พิมพ์อะไรเพื่อเริ่มต้นด้วย
  2. หลังจากการพิมพ์เสร็จสิ้นเราจะตรวจสอบว่านี่เป็นสายเริ่มต้น (ซึ่งไม่ควรรวม)

นี้จะพิมพ์ทุกบรรทัดหลังจากTERMINATEบรรทัด


ลักษณะทั่วไป:

  • คุณมีไฟล์ที่มีจุดเริ่มต้น - และท้าย -lines และคุณต้องการเส้นระหว่างเส้นเหล่านั้นไม่รวมเริ่มต้น - และท้าย -lines
  • start - และend -line สามารถกำหนดโดยนิพจน์ทั่วไปที่ตรงกับบรรทัด

ตัวอย่าง:

$ cat ex_file.txt 
not this line
second line
START
A good line to include
And this line
Yep
END
Nope more
...
never ever
$ awk '/END/{found=0} {if(found) print} /START/{found=1}' ex_file.txt 
A good line to include
And this line
Yep
$

คำอธิบาย:

  1. หากพบว่าบรรทัดสุดท้ายไม่ควรทำการพิมพ์ โปรดทราบว่าการตรวจสอบนี้ทำก่อนการพิมพ์จริงเพื่อไม่รวมส่วนท้ายบรรทัดจากผลลัพธ์
  2. พิมพ์บรรทัดปัจจุบันหากfoundตั้งไว้
  3. หากพบบรรทัดเริ่มต้นfound=1ให้ตั้งค่าเพื่อให้พิมพ์บรรทัดต่อไปนี้ โปรดทราบว่าการตรวจสอบนี้เสร็จสิ้นหลังจากการพิมพ์จริงเพื่อแยกบรรทัดเริ่มต้นออกจากผลลัพธ์

หมายเหตุ:

  • รหัสขึ้นอยู่กับข้อเท็จจริงที่ว่า awk-vars ทั้งหมดมีค่าเริ่มต้นเป็น 0 หรือสตริงว่างถ้าไม่ได้กำหนดไว้ สิ่งนี้ถูกต้อง แต่อาจไม่ใช่วิธีปฏิบัติที่ดีที่สุดดังนั้นคุณสามารถเพิ่ม a BEGIN{found=0}ไปยังจุดเริ่มต้นของ awk-expression
  • หากพบว่าจุดเริ่มต้นหลายจุดสิ้นสุดบล็อกทั้งหมดจะถูกพิมพ์ทั้งหมด

1
ตัวอย่างที่ดีเลิศ ใช้เวลาเพียง 2 ชั่วโมงในการดู csplit, sed และคำสั่ง awk ที่ซับซ้อนทั้งหมด ไม่เพียงทำสิ่งที่ฉันต้องการ แต่แสดงให้เห็นง่ายพอที่จะอนุมานว่าจะแก้ไขอย่างไรเพื่อทำสิ่งอื่น ๆ ที่เกี่ยวข้องที่ฉันต้องการ ทำให้ฉันจำได้ว่า awk นั้นยอดเยี่ยมมากและไม่เพียง แต่เป็นระเบียบที่ไร้สาระเท่านั้น ขอบคุณ
user1169420

{if(found) print}เป็นรูปแบบการต่อต้านเล็กน้อยใน awk มันเป็นสำนวนที่จะเปลี่ยนบล็อกด้วยfoundหรือfound;ถ้าคุณต้องการตัวกรองอื่นในภายหลัง
user000001

@ user000001 โปรดอธิบาย ฉันไม่เข้าใจสิ่งที่จะเปลี่ยนและวิธีการ อย่างไรก็ตามฉันคิดว่าวิธีการเขียนของมันชัดเจนมากว่าเกิดอะไรขึ้น
UlfR

1
คุณจะแทนที่awk '{if(found) print} /TERMINATE/{found=1}' your_fileด้วยawk 'found; /TERMINATE/{found=1}' your_fileพวกเขาทั้งสองควรทำสิ่งเดียวกัน
user000001

7

ใช้การขยายพารามิเตอร์ bash ดังนี้:

content=$(cat file)
echo "${content#*TERMINATE}"

คุณช่วยอธิบายว่าคุณกำลังทำอะไรอยู่
Jugal Yindle

ฉันคัดลอกเนื้อหาของ "file" ลงในตัวแปร $ content จากนั้นฉันก็ลบตัวละครทั้งหมดจนกว่าจะเห็น "TERMINATE" มันไม่ได้ใช้การจับคู่แบบโลภ แต่คุณสามารถใช้การจับคู่แบบโลภได้ด้วย $ {content ## * TERMINATE}
Mu Qiao

นี่คือลิงค์ของคู่มือทุบตี: gnu.org/software/bash/manual/…
Mu Qiao

6
จะเกิดอะไรขึ้นหากไฟล์มีขนาด 100GB
Znik

1
downvote: นี้เป็นที่น่ากลัว (อ่านไฟล์ลงในตัวแปร) และไม่ถูกต้อง (ใช้ตัวแปรโดยไม่ต้องอ้างมันและคุณอย่างถูกต้องควรใช้printfหรือให้แน่ใจว่าคุณรู้ว่าสิ่งที่คุณกำลังผ่านไปecho.)
tripleee

6

grep -A 10,000000 ไฟล์ 'ยุติการใช้งาน'

  • มากเร็วกว่า sed โดยเฉพาะอย่างยิ่งการทำงานกับไฟล์ขนาดใหญ่จริงๆ มันใช้งานได้ถึง 10M line (หรืออะไรก็ตามที่คุณใส่) ดังนั้นจึงไม่มีอันตรายใด ๆ ในการทำให้ใหญ่พอที่จะรับมือกับทุกสิ่งที่คุณตี

4

มีหลายวิธีที่จะทำด้วยsedหรือawk:

sed -n '/TERMINATE/,$p' file

สิ่งนี้จะมองหาTERMINATEในไฟล์ของคุณและพิมพ์จากบรรทัดนั้นไปจนถึงท้ายไฟล์

awk '/TERMINATE/,0' file

sedตรงนี้เป็นพฤติกรรมเดียวกับ

ในกรณีที่คุณทราบจำนวนบรรทัดที่คุณต้องการเริ่มพิมพ์คุณสามารถระบุพร้อมกับNR(จำนวนเรคคอร์ดซึ่งท้ายที่สุดจะระบุจำนวนบรรทัด):

awk 'NR>=535' file

ตัวอย่าง

$ seq 10 > a        #generate a file with one number per line, from 1 to 10
$ sed -n '/7/,$p' a
7
8
9
10
$ awk '/7/,0' a
7
8
9
10
$ awk 'NR>=7' a
7
8
9
10

สำหรับหมายเลขของคุณสามารถใช้more +7 file
123

ซึ่งรวมถึงบรรทัดการจับคู่ซึ่งไม่ใช่สิ่งที่ต้องการในคำถามนี้
mivk

@mkk ดีนี่เป็นกรณีของคำตอบที่ได้รับการยอมรับและอันดับสูงสุดอันดับ 2 ดังนั้นปัญหาอาจเกิดจากชื่อที่ทำให้เข้าใจผิด
fedorqui 'ดังนั้นหยุดทำอันตราย'

3

ถ้าด้วยเหตุผลใดก็ตามคุณต้องการหลีกเลี่ยงการใช้ sed สิ่งต่อไปนี้จะพิมพ์การจับคู่บรรทัดTERMINATEจนถึงจุดสิ้นสุดของไฟล์:

tail -n "+$(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)" file

และสิ่งต่อไปนี้จะพิมพ์จากการจับคู่บรรทัดต่อไปนี้TERMINATEจนถึงจุดสิ้นสุดของไฟล์:

tail -n "+$(($(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)+1))" file

ใช้เวลา 2 กระบวนการในการทำสิ่งที่ sed สามารถทำได้ในหนึ่งกระบวนการและหากไฟล์เปลี่ยนระหว่างการประมวลผลของ grep และ tail ผลลัพธ์อาจไม่สอดคล้องกันดังนั้นฉันจึงแนะนำให้ใช้ sed นอกจากนี้หากไฟล์ dones ไม่มีTERMINATEอยู่คำสั่งที่ 1 จะล้มเหลว


ไฟล์จะถูกสแกนสองครั้ง เกิดอะไรขึ้นถ้ามันเป็นขนาด 100GB?
Znik

1
Downvoted เพราะนี่เป็นทางออกที่เส็งเคร็ง แต่แล้วก็เพิ่มขึ้นเพราะ 90% ของคำตอบคือ caveats
นักฟิสิกส์บ้า


0

นี่อาจเป็นวิธีหนึ่งในการทำมัน หากคุณรู้ว่าไฟล์ใดที่คุณมีคำศัพท์ grep และมีกี่บรรทัดในไฟล์ของคุณ:

grep -A466 'ยุติ' ไฟล์


1
หากทราบหมายเลขบรรทัดก็grepไม่จำเป็นต้องมีแม้แต่ คุณสามารถใช้tail -n $NUMดังนั้นนี่ไม่ใช่คำตอบ
Samveen

-1

sed เป็นเครื่องมือที่ดีกว่ามากสำหรับงาน: ไฟล์ sed -n '/ re /, $ p'

โดยที่ regexp

อีกตัวเลือกหนึ่งคือการตั้งค่าสถานะ - after-context ของ grep คุณต้องผ่านตัวเลขเพื่อสิ้นสุดที่การใช้ wc ในไฟล์ควรให้ค่าที่ถูกต้องเพื่อหยุดที่ รวมสิ่งนี้กับ -n และนิพจน์การจับคู่ของคุณ


- หลังจาก - บริบทนั้นใช้ได้ แต่ไม่ใช่ในทุกกรณี
Jugal Yindle

คุณช่วยแนะนำอย่างอื่น ..
Jugal Yindle

-2

สิ่งเหล่านี้จะพิมพ์ทุกบรรทัดจากบรรทัดที่พบล่าสุด "TERMINATE" จนถึงจุดสิ้นสุดไฟล์:

LINE_NUMBER=`grep -o -n TERMINATE $OSCAM_LOG|tail -n 1|sed "s/:/ \\'/g"|awk -F" " '{print $1}'`
tail -n +$LINE_NUMBER $YOUR_FILE_NAME

การแยกหมายเลขบรรทัดด้วยgrepดังนั้นคุณสามารถป้อนมันเพื่อtailเป็น antipattern ที่สิ้นเปลือง การค้นหาการจับคู่และการพิมพ์จนถึงจุดสิ้นสุดของไฟล์ (หรือในทางกลับกันการพิมพ์และการหยุดที่การจับคู่ครั้งแรก) จะทำอย่างเด่นชัดด้วยเครื่องมือ regex ปกติที่จำเป็น มหึมาgrep | tail | sed | awkก็มีอยู่ในตัวของมันเองการใช้งานgrepและมิตรสหายที่ไร้ประโยชน์มากมาย
tripleee

ฉันคิดว่า s * เขากำลังพยายามให้บางสิ่งบางอย่างแก่เราที่จะพบ / ตัวอย่างสุดท้าย / ของ 'ยุติ' และให้บรรทัดจากอินสแตนซ์นั้น การใช้งานอื่น ๆ ให้อินสแตนซ์แรกเป็นต้นไป LINE_NUMBER น่าจะมีหน้าตาแบบนี้แทน: LINE_NUMBER = $ (grep -o -n 'TERMINATE' $ OSCAM_LOG | tail -n 1 | awk -F: '{พิมพ์ $ 1}') อาจไม่ใช่วิธีที่หรูหราที่สุด แต่มัน ดูเหมือนว่าจะทำงานให้เสร็จ ^. ^
fbicknel

... หรือทั้งหมดในหนึ่งบรรทัด แต่น่าเกลียด: tail -n + $ (grep -o -n 'TERMINATE' $ YOUR_FILE_NAME | tail -n 1 | awk -F: '{print $ 1}') $ YOUR_FILE_NAME
fbicknel

.... และฉันจะกลับไปแก้ไข $ OSCAM_LOG แทน $ YOUR_FILE_NAME ... แต่ไม่สามารถทำได้ด้วยเหตุผลบางอย่าง ไม่มีความคิดที่มาจาก $ OSCAM_LOG; ฉันแค่แคร์มันอย่างไร้เหตุผล oO
fbicknel

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