변경되는 동안 출력 파일 내용


47

예를 들어 파일이 foobar있고 내가 하는 경우 파일 내용이 변경되는 동안 파일 내용을 출력 하고 싶습니다.

magic_command foobar

현재 터미널에는 파일 내용이 표시되고 ^ C를 누를 까지 기다립니다 .

그런 다음 다른 터미널에서 나는 :

echo asdf >> foobar

첫 번째 터미널에는 원래 파일 내용 외에 새로 추가 된 행이 표시되어야합니다 (물론 ^ C를 누르지 않은 경우).

나는 리눅스를 탐구하고 배우고 싶기 때문에 이것을 숙제로 표시 할 것이지만 숙제는 아니며 단지 내 호기심 일뿐입니다.


답변:


79

tail command함께 사용할 수 있습니다 -f :

tail -f /var/log/syslog 

실시간 쇼를위한 좋은 해결책입니다.


스크립트를 작성하고 출력을 스크립트로 리디렉션 할 수 있습니다.
PersianGulf

6
-F(대문자 f)를 사용 하여 파일을 제거하고 다시 만들면 파일을 다시 열 수 있습니다.
peterph

19

하나의 터미널 화면에 맞는 짧은 파일을 표시하고 변경하는 것은 전체 파일 일 수 있습니다 watch.

watch cat example.txt

Every 2.0s: cat example.txt                                Sun Aug  3 15:25:20 2014

Some text
another line

옵션 헤더를 포함하여 기본적으로 2 초마다 전체 파일을 표시합니다.

옵션 -d( --differences)은 이전 버전의 출력 또는 첫 번째 버전의 변경 사항을 강조 표시합니다.


9

내가 파일 변경 사항을 감지하고있는 것보다 다른 것을해야 할 때 tail -f filename수행을, 내가 사용했습니다 inotifywait변화를 감지하고 그것을 바탕으로 행동하는 스크립트에서. 사용 예는 다음과 같습니다. man inotifywait다른 이벤트 이름 및 스위치를 참조하십시오 . inotify-tools를 통해 패키지 를 설치해야 할 수도 있습니다 sudo apt-get install inotify-tools.

다음은 예제 스크립트입니다 exec-on-change.

 #!/bin/sh

# Detect when file named by param $1 changes.
# When it changes, do command specified by other params.

F=$1
shift
P="$*"

# Result of inotifywait is put in S so it doesn't echo
while  S=$(inotifywait -eMODIFY $F 2>/dev/null)
do
  # Remove printf if timestamps not wanted 
  printf "At %s: \n" "$(date)"
  $P
done

두 콘솔에서 다음과 같이 명령을 입력했습니다 (여기서 A>는 콘솔 A의 항목을 의미하고 B>는 콘솔 B의 항목을 의미합니다).

A> rm t; touch t
B> ./exec-on-change t wc t
A> date >>t
A> date -R >>t
A> date -Ru >>t
A> cat t; rm t

cat t콘솔 A에 다음과 같은 출력이 나타 납니다 .

Thu Aug 16 11:57:01 MDT 2012
Thu, 16 Aug 2012 11:57:04 -0600
Thu, 16 Aug 2012 17:57:07 +0000

exec-on-change콘솔 B에 다음과 같은 출력이 나타 납니다 .

At Thu Aug 16 11:57:01 MDT 2012: 
 1  6 29 t
At Thu Aug 16 11:57:04 MDT 2012: 
 2 12 61 t
At Thu Aug 16 11:57:07 MDT 2012: 
 3 18 93 t

exec-on-change나는 경우 스크립트는 종료 rm거라고 t.


8

less팔로우 모드와 비슷한 tail -f- F열면 히트 합니다.


4

세 가지 해결책이 있습니다.

1) tail -f 좋은 생각이다

2) 우리는 또한 tailf사용해야합니다

3) 세 번째는 bash 스크립트입니다.

#!/bin/bash

GAP=10     #How long to wait
LOGFILE=$1 #File to log to

if [ "$#" -ne "1" ]; then
    echo "USAGE: `basename $0` <file with absolute path>"
    exit 1
fi


#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."

while :
do
    if [ -N $LOGFILE ]; then
        echo "`date`: New Entries in $LOGFILE: "
        newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
        newlines=`expr $newlen - $len`
        tail -$newlines $LOGFILE
        len=$newlen
    fi
sleep $GAP
done
exit 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.