วิธีการพิมพ์บรรทัดแรกโดยใช้คำสั่ง grep


17

file.txtฉันมีไฟล์ที่เรียกว่า ฉันจะพิมพ์บรรทัดแรกโดยใช้grepคำสั่งได้อย่างไร


4
จะhead -1 file.txtไม่ทำงาน
clk

@steeldriver คุณต้องทำให้มันเป็นคำตอบเพราะมันเป็นวิธีการทำมันด้วย grep ซึ่งเป็นเครื่องมือที่เลือกมาอย่างแปลกประหลาดสำหรับงาน
MelBurslan

1
grepไม่ใช่เครื่องมือที่ดีที่สุดสำหรับการพิมพ์บรรทัดแรกของไฟล์ หากคุณต้องการพิมพ์บรรทัดแรกที่ตรงกับgrepหรือหากคุณมีการใช้งานเฉพาะเจาะจงgrepโปรดแจ้งให้เราทราบว่าคืออะไร หากเรามีบริบทมากขึ้นเราอาจให้คำตอบที่จะช่วยคุณและชุมชนได้ดีขึ้น
DKing

@MelBurslan ใน file.txt ฉันมีสามบรรทัดเช่น: นี่คือไฟล์ใหม่ บรรทัดที่สอง: ชื่อของไฟล์คือ newFile Third line: ฉันยังไม่ได้สร้างบรรทัดใหม่ ดังนั้นโดยใช้คำสั่ง grep ฉันจะพิมพ์บรรทัดแรกได้อย่างไร คำสั่งใดที่จะช่วยให้ฉันพิมพ์ทั้งบรรทัดแรกและบรรทัดสุดท้าย พวกคุณช่วยเล่าคำสั่งให้กับคำถามทั้งสองได้ไหม
Nithin Santhosh

หากคำตอบใด ๆ ที่มีอยู่แก้ปัญหาของคุณได้โปรดลองตอบรับด้วยเครื่องหมายถูก ขอขอบคุณ!
Jeff Schaller

คำตอบ:


38

แม้ว่าจะเป็นแอปพลิเคชัน grep ที่ไม่ธรรมดา แต่คุณสามารถทำได้โดยใช้

grep -m1 "" file.txt

มันใช้งานได้เพราะนิพจน์ที่ว่างเปล่าจับคู่อะไรก็ได้ในขณะที่-m1ทำให้ grep ออกจากการแข่งขันครั้งแรก

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1 สำหรับแสดงว่ากล้วยที่เคลือบช็อคโกแลตไม่ได้ไร้ประโยชน์อย่างที่คิด
Kamil Maciorowski

4
ซึ่งอาจใช้งานได้กับบางระบบ แต่ไม่สามารถพกพาได้:grep: unknown option -- m
Kusalananda

1
สังเกตความแตกต่างระหว่าง 'บรรทัดแรก' กับ 'การจับคู่บรรทัดแรก'
ชาร์ลส์

13

นี่ไม่ใช่สิ่งที่grepจะทำ ชื่อ "grep" เป็นคำย่อของ " globalนิพจน์และพิมพ์ปกติ" ซึ่งเป็นสิ่งที่edคำสั่งg/re/pทำ (สำหรับนิพจน์ทั่วไปที่กำหนดre)

edเป็นตัวแก้ไขบรรทัดแบบอินเทอร์แอคทีฟจาก 1969 แต่ก็มีโอกาสมากที่จะติดตั้งในระบบของคุณในทุกวันนี้ เราได้grepมาจากedและมันสามารถถูกมองว่าเป็นทางลัดหรือนามแฝงสำหรับการทำงานเฉพาะของedและsedซึ่งก็คือ " edกระแส -" เช่นตัวแก้ไขกระแส (ไม่ใช่แบบโต้ตอบ)

มาใช้sedแทน:

$ sed -n '1p' file.txt

1pสตริงเป็นเล็ก ๆsed"สคริปต์" ที่พิมพ์ ( p) บรรทัดที่สอดคล้องกับที่อยู่ที่กำหนด ( 1บรรทัดแรก) คำสั่งแก้ไข1pจะ (ไม่แปลกใจ) ทำสิ่งเดียวกันในตัวedแก้ไขโดยวิธี

ยับยั้งการส่งออกของอะไรไม่พิมพ์อย่างชัดเจนโดยสคริปต์ดังนั้นสิ่งที่เราได้รับเป็นบรรทัดแรกของไฟล์-nfile.txt

อีกวิธีหนึ่งคือ:

$ sed '1q' file.txt

สิ่งนี้จะพิมพ์ทุกบรรทัดของไฟล์ แต่ออก ( q) ที่บรรทัด 1 (หลังจากพิมพ์) head -n 1 file.txtตรงนี้เป็นเทียบเท่ากับ

ในมาตรฐาน POSIX มีข้อความระบุว่า (การวางหลักเกณฑ์ทั่วไป) ซึ่งhead -n Nเหมือนกับsed 'Nq'"พิมพ์ทุกบรรทัด แต่ออกจากบรรทัดN" เหตุผลที่headรวมอยู่ในมาตรฐานที่ทุกคนเป็นเพราะสมมาตรกับtail(และความเข้ากันได้ย้อนหลังกับการใช้งาน Unix ที่มีอยู่)


นี่คือคำตอบที่ส่องสว่างที่สุดคำตอบแรกคือแฮ็คแปลก ๆ ฉันรู้ว่ามีบางสิ่งแปลก ๆ ขอบคุณที่แสดงประวัติของ grep และ ed ให้ฉันดู ทุกอย่างสมเหตุสมผลแล้ว
Tomas Zubiri

6

ยกเว้นว่าบรรทัดแรกมีสตริงที่ไม่ซ้ำกันคุณไม่สามารถทำได้โดยใช้ grep เท่านั้น head -n 1 file.txtจะทำงานแทนมัน

หากคุณต้องการพิมพ์เฉพาะบรรทัดแรกหากตรงกับรูปแบบจากนั้นไปป์ที่หัวลงใน grep

head -n 1 * | grep [pattern]


2

แต่การใช้ Grep แบบไม่เป็นทางการอีกอย่างหนึ่ง - การแปลงแบบชวาร์เซี่ยนที่ผ่านการหมุนหลายรอบไปยังหมายเลขบรรทัดจากนั้นใช้ grep เพื่อค้นหาหมายเลขบรรทัดจากนั้นจึงถอดหมายเลขบรรทัดออก:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

ฉันกำลังวางคำตอบนี้ไว้ที่นี่เป็นตัวอย่างของความคิดที่ว่าเพียงเพราะคุณสามารถทำอะไรบางอย่างใน (grep หรือ bash หรือ ... ฯลฯ ) ไม่ได้หมายความว่าคุณควรจะมีเครื่องมือที่ดีกว่าสำหรับงานนี้ sed ( sed 1qหรือsed -n 1p) และhead ( head -n 1) เป็นเครื่องมือที่เหมาะสมกว่าสำหรับการพิมพ์บรรทัดแรกจากไฟล์ สำหรับการพิมพ์บรรทัดสุดท้ายของไฟล์คุณมีtail -n 1หรือsed -n '$p'. เครื่องมือเหล่านี้ไม่เพียง แต่เป็นคำสั่งเดียว (แทนที่จะเป็น 3+ ในฟังก์ชั่นด้านบน) แต่ยังมีความชัดเจนมากขึ้นสำหรับผู้อ่านในอนาคต - บางทีอาจเป็นตัวคุณเอง! - ของสคริปต์ที่มีอยู่ในขณะที่ฉันไม่ใช่หนึ่งในผู้ลงคะแนน (ตอนนี้ 3) ของคำถามของคุณเป็นไปได้ว่าการยืนยันของคุณเกี่ยวกับเครื่องมือโดยพลการสำหรับงาน (โดยไม่มีเหตุผลสนับสนุน) เป็นเหตุผลสำหรับ downvotes มันเป็นอย่างมากไม่น่าที่ระบบที่มีgrepไม่ได้ยังมีhead, และtailsed

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