คำสั่งเชลล์เพื่อตรวจสอบการเปลี่ยนแปลงในไฟล์ - มันเรียกว่าอะไรอีก?


159

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

คุณรู้ไหมว่ามันเรียกว่าอะไร?

คำตอบ:


213

คุณหมายถึง

tail -f logfile.log

?

( หน้าคนสำหรับหาง )


6
ใช่มันเป็นเวลาจริง
Adam Gibbins

18
Sidenote: หากการแจกจ่ายของคุณมีคำสั่ง tailf ให้ใช้คำสั่ง tail -f tailf มีประสิทธิภาพมากขึ้นเพราะมันไม่จำเป็นต้องเข้าถึงไฟล์ดูหากยังไม่ได้ถูกเขียนไป (การเข้าถึงการสำรวจเป็นที่น่ารำคาญถ้าคุณติดตั้งระบบไฟล์ที่มีการปรับปรุง atime.)
หมดเวลาLimbăşan

10
ที่ผู้ใช้ระดับสูงฉันพบคำตอบแนะนำหาง -Fแทน-fด้วย
Rafa

17
tail -Fจะติดตามชื่อไฟล์แทนวัตถุไฟล์ซึ่งมีประโยชน์อย่างยิ่งในกรณีที่มีการหมุนไฟล์บันทึก
อาเมียร์อาลีอัคบารี

2
อัปเดตไม่กี่ปีต่อมา: tailfเลิกใช้แล้วและtail -fปลอดภัย (ยืนยันสิ่งนี้ในระบบของคุณด้วยman tailf) ดูเอกสารประกอบ: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

คุณอาจหมายถึงหางตามคำตอบของ Jon Skeet

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

ดู -n 10 -d ls -l / var / adm / ข้อความ

จะรันคำสั่งls -l /var/adm/messagesทุก 10 วินาทีและเน้นความแตกต่างในเอาต์พุตระหว่างการรันครั้งต่อไป (มีประโยชน์สำหรับการดูว่า logfile เติบโตเร็วแค่ไหน)


38

inotifywaitจากinotify-toolsมีประโยชน์ถ้าคุณต้องการเรียกใช้คำสั่งทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ (หรือไฟล์ใด ๆ ในไดเรกทอรี) ตัวอย่างเช่น:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

เพียงทราบว่าpathไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับชื่อตัวแปร บนzshดูเหมือนว่าสภาพแวดล้อมไม่ได้เป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก สำหรับฉันแล้วการตั้งค่ายังpathทำให้เกิดPATHการตั้งค่าและนั่นก็หมายความว่าไม่มีอะไรจะทำงานจนกว่าคุณจะแก้ไข เปิดbashการตั้งค่าpathไม่มีผลใดPATH
Thanatos

36

ฉันชอบใช้มากกว่าless +FG1tail -fเพราะฉันพบว่าตัวเองต้องการค้นหาไฟล์บันทึกสำหรับข้อผิดพลาดหรือรหัสเฉพาะ หากฉันต้องการค้นหาสิ่งใดฉันพิมพ์^Cเพื่อหยุดติดตามไฟล์และ?เริ่มค้นหาย้อนหลัง

viผูกที่สำคัญจะสวยมากเช่นเดียวกับใน คำสั่งใด ๆ สามารถเริ่มต้นเมื่อเริ่มต้นโดยใช้+ตัวเลือก:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

สำหรับบันทึกที่ยาวมากฉันคิดว่ามันสะดวกที่จะใช้-nตัวเลือกที่จะปิดหมายเลขบรรทัด จาก manpage:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Hat-tip ถึงrgmarchaเพื่อชี้เรื่องนี้ในความคิดเห็น


อย่าลืมตั้งค่าaliasด้วยตัวเลือกที่คุณต้องการดังนั้นคุณไม่จำเป็นต้องพิมพ์มันทุกครั้ง
Michael Hampton

ที่จริงแล้วคุณควรชอบฟังก์ชั่นเชลล์มากกว่านามแฝงในกรณีส่วนใหญ่
tripleee

21

หางเป็นที่ดี ... น้อยนอกจากนี้ยังสามารถนำมาใช้เริ่มน้อยลงในไฟล์เช่น myfile น้อยแล้วกด+Shift Fมันมีหางเล็กน้อย


5
น้อย + F myfile จะทำให้มันมากเกินไป
rgmarcha

16

ฉันกำลังแก้ไขไฟล์ LaTeX และต้องการตรวจสอบมันสำหรับการเปลี่ยนแปลงที่อยู่ตรงกลาง ฉันทำวิปเชลล์เชลล์ต่อไปนี้ซึ่งพิสูจน์แล้วว่ามีประโยชน์กับฉัน ฉันหวังว่ามันจะเป็นประโยชน์กับคนอื่นเช่นกัน

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

บันทึกเป็นและทำwatch.sh chmod u+x watch.shจากนั้นฉันก็รันมันดังนี้:

./watch.sh file.tex pdflatex

หากคุณต้องการคำสั่งเท่านั้นที่จะทำงานถ้าการเปลี่ยนแปลงที่เกิดขึ้นจริงที่เกิดขึ้นคุณสามารถใช้แทน`md5sum "$FILE"``ls -l "$FILE"`


1
เพื่อดูไดเรกทอรีและเนื้อหาแทนไฟล์เดียว:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

คุณยังสามารถใช้ inotifywatch / inotifywait ซึ่งขอให้เข้าไปในระบบย่อยของเมล็ด วิธีนี้คุณสามารถดูสิ่งต่าง ๆ เช่น "เปิด", "ปิด" หรือ "เข้าถึง"

แต่ถ้าคุณเพียงแค่ต้องการได้รับบรรทัดต่อท้ายเพื่อ stdout ฉันเห็นด้วยกับหาง


3

Tail เป็นเครื่องมือมาตรฐานดั้งเดิมพร้อมใช้งานได้ทุกที่ เครื่องมือที่ซับซ้อนกว่านี้คือมัลติทาสก์ซึ่งสามารถตรวจสอบไฟล์หลายไฟล์พร้อมกันและเน้นไวยากรณ์


3

หากฉันต้องการค้นหาไฟล์เพิ่มเติมนอกเหนือจากการปรับแต่งมันฉันใช้คำสั่ง "F" น้อยลง

เมื่อใช้ tail โปรดจำไว้ว่าจำเป็นต้องมีอาร์กิวเมนต์เพิ่มเติมหากไฟล์นั้นอาจจะพลิกหรือแทนที่ด้วยการแก้ไข (โหมดเริ่มต้นสำหรับ vim's: w)

tail -f จะทำให้ tail จัดเก็บไฟล์ descriptor และติดตามมัน หากไฟล์ถูกแทนที่ descriptor จะถูกเปลี่ยน ประโยชน์ของการอธิบายไฟล์ต่อไปนี้คือถ้าหากไฟล์ถูกเปลี่ยนชื่อคุณจะยังคงติดตามมันอยู่

tail --follow = จะทำให้ tail ติดตามไฟล์ที่มีชื่อโดยเปิดใหม่เป็นระยะเพื่อดูว่ามันถูกแทนที่

--retry เป็นอีกตัวเลือกที่มีประโยชน์ถ้าคุณต้องการ tail log log แต่ยังไม่ได้สร้างไฟล์

tail -F เป็นทางลัดสำหรับ --follow = --retry


2

ลืม tailf, diff เป็นคำสั่งที่คุณต้องการ นี่คือเคล็ดลับที่ดีในการดูความแตกต่างที่เกิดขึ้นแบบเรียลไทม์ (หรือปิด) ระหว่าง 2 ไฟล์หรือในไฟล์เดียวที่ถูกเขียนไป

คุณสามารถใช้วิธีการเหล่านี้เพื่อปรับเปลี่ยนพฤติกรรมตามที่คุณต้องการเช่นการเขียนการเปลี่ยนแปลงไปยังไฟล์เพื่อเก็บบันทึก เล่นกับช่วงเวลาของการดูหรือตัวเลือกอื่น ๆ สำหรับคำสั่งด้านล่าง

คุณมี 1 ไฟล์และคุณต้องการดูเมื่อมีการเปลี่ยนแปลง:

ดังนั้นนี่คือสิ่งที่ต้องทำ:

  1. คัดลอกไฟล์

cp file file2

  1. เขียนสคริปต์ทุบตีเพื่อค้นหาความแตกต่างและอัปเดต file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. นี่เป็นแนวคิดพื้นฐานสำหรับสคริปต์ ทำให้มันเขียนไฟล์ถ้าคุณต้องการ

#!/bin/bash

diff file file2

cp file file2

  1. ถัดไปคุณสามารถดูความแตกต่างบนหน้าจอโดยใช้นาฬิกา

watch ./check-differences

สิ่งนี้จะอัปเดตทุก ๆ 2 วินาทีโดยค่าเริ่มต้น ดังนั้นหากคุณต้องการย้อนกลับไปอ่านแล้วเขียนผลลัพธ์ของ diff ไปยังไฟล์ในสคริปต์

หรือใช้ cron เพื่อเรียกใช้สคริปต์ของคุณเป็นประจำหากคุณไม่ต้องการเห็นผลลัพธ์


1

ในขณะที่tail -f somefile.txtยังคงเลื่อนไปพร้อมกับข้อมูลใหม่บางครั้งฉันก็ชอบless +G somefile.txtที่จะดูแพทช์ของข้อมูลล่าสุดในไฟล์


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