2013-03-12 7 views
1

두 개의 명령을 실행하는 스크립트가 있습니다. 첫 번째 명령은 임시 파일에 데이터를 쓰는 것입니다. 두 번째 명령은 첫 번째 명령이 백그라운드에서 실행되는 동안 awk에 파이핑됩니다. awk는 두 번째 명령에서 임시 파일의 데이터를 읽어야하지만 데이터가 임시 파일에 기록되는 것보다 빠르게 자체 데이터를 파싱합니다.awk는 getline이 기록 될 때 파일에서 데이터를 읽습니다.

다음은 예입니다 :

#!/bin/bash 

command1 > /tmp/data.txt & 
# command1 takes several minutes to run, so start command 2 while it runs in the background 
command2 | awk ' 
    /SEARCH/ { 
     #Matched input so pull next line from temp file 
     getline temp_line < "/tmp/data.txt" 
    } 
' 

AWK 너무 빨리 지령 1이 따라갈 수없는 Command2를에서 데이터를 구문 분석하지 않는 한이 작품. 나는. awk는 command1이 쓰기를 끝내기 전에 /tmp/data.txt에서 EOF를 얻습니다.

나는 또한처럼의 getline 주위에 몇 가지 검사를 배치 시도했다 :

while ((getline temp_line < "/tmp/data.txt") < 0) { 
    system("sleep 1") # let command1 write more to the temp file 
} 
# Keep processing now that we have read the next line 

그러나이 임시 파일에 EOF 안타 일단 내가 생각, 그것에서 읽으려고하지 않는다. 아니면 그런 식으로.

awk가 awk가 읽는 것보다 빠르게 command1이 임시 파일에 쓰는 한 전체 스크립트가 작동합니다. 두 명령 사이에 sleep 10 명령을 넣으면 임시 파일은 충분한 버퍼를 만들고 스크립트는 필요한 출력을 생성합니다. 하지만 필자는 내가 테스트 한 것보다 훨씬 큰 파일을 파싱 할 수도 있고 명령이 다른 시스템에서 다른 속도로 실행될 수도 있으므로 데이터가 기록 될 때까지 파일을 기다리는 안전 메커니즘을 원합니다. .

어떻게하면됩니까?

답변

1

반복 할 때 파일을 닫고 처음부터 다시 읽어야하는 곳으로 이전에 읽은 곳 (예 : 테스트되지 않음)으로 되돌릴 필요가 있다고 생각합니다. 그것은 당신의 tmp 파일 당신의 두번째 명령이 각 반복에 대해 더 이상 대기 채우는 데 시간이 오래 걸리고 그래서 만약 내가 변수 "휴면"내장

sleepTime = 0 
while ((getline temp_line < "/tmp/data.txt") <= 0) { 
    close("/tmp/data.txt") 
    system("sleep " ++sleepTime) # let command1 write more to the temp file 
    numLines = 0 
    while (++numLines < prevLines) { 
     if ((getline temp_line < "/tmp/data.txt") <= 0) { 
      print "Aaargghhh, my file is gone!" | "cat>&2" 
      exit 
     } 
    } 
} 
++prevLines 

주 이상 루프를 통해 각 시간을 명령 수면을 가지고 . 너를 좋아하거나 좋아하지 마라.

system() 명령을 사용하여 중첩 루프에서 getline을 사용하면 모든 작업이 다소 번거롭고 오류가 발생하는 것으로 보입니다. 아마도 더 나은 방법이 있다고 생각할 수는 없지만 머리 꼭대기가 무엇인지 모릅니다.

+0

감사합니다. 이 스크립트는 현재 작업하는 것과 정말 가깝습니다. –

+0

@RustyLemur 여전히 작동하지 않는 것을 공유하면 도움이 될 수 있습니다. –