ต่อท้ายบรรทัดไปยังไฟล์ในคำสั่ง cat?


12

ฉันสามารถทำได้cat file.txtเพื่อรับเนื้อหาของไฟล์ แต่ฉันยังต้องการที่จะใช้วิธีสุดท้ายในการเลือกของฉันเอง

ฉันลองใช้ piping (cat file.txt ; echo "My final line") |แต่มีเพียงบรรทัดสุดท้ายเท่านั้นที่ถูกส่งผ่านท่อ ฉันจะเข้าร่วมแมวและบรรทัดสุดท้ายได้อย่างไร

แก้ไขเพื่อความกระจ่าง: ฉันไม่ต้องการแก้ไขไฟล์เอง ผมทราบว่าถ้าเป็นกรณีที่ฉันจะทำecho "My final line" >> file.txtหรือecho "My final line" | tee -a file.txtแต่ฉันเป็นเพียงการพยายามที่จะทำผนวกในบริบทของคำสั่งนี้โดยเฉพาะอย่างยิ่งเพื่อให้สามารถท่อเรียงต่อกันของและfile.txt"My final line"


1
บางทีสิ่งที่ชอบecho "My final line" >> file.txt?
edwinksl

ฉันไม่ต้องการที่จะผนวกสายไปยังวัตถุไฟล์เพียงแค่ในคำสั่ง / ท่อ ฉันรู้แล้วว่าฉันสามารถต่อท้ายบรรทัดด้วย>>หากฉันต้องการแก้ไขไฟล์เอง
DoubleBass

11
คุณลบโดยไม่ตั้งใจfile.txtหรือไม่? ตัวอย่างข้อมูลท่อของคุณควรใช้งานได้
Bracken

@ DoubleBass: คำตอบของ Mathieu Mitchell เป็นคำตอบที่ดีกว่าเนื่องจากไม่ได้แก้ไขไฟล์ (ในหน่วยความจำหรือบนดิสก์) แต่ใช้คุณสมบัติของคำสั่งในตัวแทน
Bryan Boettcher

คำตอบ:


30

คุณสามารถใช้ประโยชน์จากcatความสามารถในการอ่านจาก stdin เมื่อรวมกับความสามารถในการอ่านหลาย ๆ ไฟล์เพื่อให้ได้สิ่งนี้

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

คุณยังสามารถเติมบรรทัดได้เช่น:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

โปรดทราบว่าคุณไม่ จำกัด เพียงบรรทัดเดียว catจะอ่านจาก stdin จนกว่าจะถึง EOF คุณสามารถส่งผ่านเอาท์พุทจากตัวอย่างเช่นต้องเพิ่มหรือผนวกกับการส่งออกของcurlcat

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …ก็จะทำเช่นนั้น แต่การใช้catสำหรับสิ่งที่ออกแบบมานั้นดีกว่า +1
ctrl-alt-delor

@ ctrl-alt-delor: เชลล์ย่อยยังมีข้อเสียของกระบวนการเพิ่มเติมในการแยกซึ่งค่อนข้างแพง ลองยกตัวอย่างเช่นecho "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catเมื่อเทียบกับหรือแม้กระทั่ง( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
David Foerster

12

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

echo 'My final line' >>file.txt

ตอนนี้ถ้าคุณต้องการเพียงแค่ดูเนื้อหาของไฟล์ที่มีบรรทัดสุดท้ายต่อท้ายฉันจะใช้catกับสองข้อโต้แย้ง:

  • ก่อนอื่นไฟล์ของคุณอย่างชัดเจนสมมติว่า file.txt
  • อาร์กิวเมนต์ที่สองจะเป็นสตริงของทางเลือกของคุณและจะผ่านสตริงเป็นชื่อไฟล์ (ตามcatข้อตกลงเฉพาะกับไฟล์) คุณสามารถใช้ประโยชน์ทดแทนกระบวนการ<()ซึ่งจะกลับมาอธิบายไฟล์ /proc/self/fd/<fd_number>)(

การนำสิ่งเหล่านี้มารวมกัน:

cat file.txt <(echo 'My final line')

หากคุณต้องการเอาท์พุทที่จะเพจlessจิ้งสมมติว่าเป็นเพจเจอร์ที่คุณชื่นชอบ:

less file.txt <(echo 'My final line')

<()ใช้งานได้กับ bash แต่มันใช้งานได้กับ shell อื่น ๆ บ้าง? ksh? รีบ?
jpaugh

1
@jpaugh ksh, zsh- ใช่, dash- ไม่
heemayl

สิ่งนี้จะแก้ไขต้นฉบับ
ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

จากman sedตัวเลือก-e

-e script, --expression=script
    add the script to the commands to be executed

$ตรงกับบรรทัดสุดท้ายและ aผนวกสตริง

หากคุณต้องการผนวกบรรทัดไปยังไฟล์อย่างถาวรให้ใช้ -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

การเปลี่ยนคำสั่งเป็น

sed -i -e '$aMy final line' file.txt

1
ใช้เครื่องหมายคำพูดเดี่ยวและคุณไม่จำเป็นต้องใช้เครื่องหมายแบ็กสแลช
Wildcard

7

มีการชี้แจงในความคิดเห็นของคำถาม แต่เพิ่มไว้อีกครั้งเป็นคำตอบที่นี่

คำสั่งที่ระบุไว้ในคำถาม

(cat file.txt ; echo "My final line") | other command

ทำงานตามที่คาดไว้ - เอาต์พุตทั้งหมดจาก subshell ที่สร้างโดยวงเล็บจะถูกไพพ์ไปยังคำสั่งที่สอง

หากไฟล์ไม่ได้ลงท้ายด้วยบรรทัดใหม่สตริง echoed จะถูกต่อท้ายบรรทัด - นี่เป็นเรื่องปกติของโซลูชันอื่น ๆ ทั้งหมดที่นี่และสามารถแก้ไขได้โดยการเพิ่ม echo (ว่าง) อีกอันก่อน


1
ถ้าไฟล์ที่ไม่ได้จบด้วยการขึ้นบรรทัดใหม่ให้ฉันใช้:awk เป็นเคล็ดลับที่ดีในการชดเชย EOL ที่ขาดหายไปในตอนท้ายของไฟล์ awk 1 file.txt; echo "My final line"awk 1 file
muru

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