2012-12-26 2 views
2

우리는 Autosys라는 패키지를 사용하며이 패키지의 특정 명령이 있습니다. Autosys 명령 중 하나에서 하나씩 변수로 전달하고자하는 변수 목록이 있습니다.ksh에서 줄 단위로 파일 읽기

예를 들어 하나 개의 변수는 내가 그것을 나에게 원하는 출력을 제공, 나는 아래 서면 명령을 실행할 때 지금이

autosys_showJobHistory.sh var1 

같은 명령 뭔가를 시작하려는이 VAR1을 사용하여 VAR1입니다.

echo "var1" | while read line; do autosys_showJobHistory.sh $line | grep 1[1..6]:[0..9][0..9] | grep 24.12.2012 | tail -1 ; done 

내가 파일에 VAR1을 넣어하지만 TEST.TXT 말 고양이를 사용하여 동일한 명령을 실행, 그것은 나에게 아무것도주지 않는다. 이 경우 autosys_showJobHistory.sh 명령이 작동하지 않는다는 인상을 받았습니다.

cat Test.txt | while read line; do autosys_showJobHistory.sh $line | grep 1[1..6]:[0..9][0..9] | grep 24.12.2012 | tail -1 ; done 

두 번째 명령에서 내가 잘못하고있는 것은 무엇입니까?

답변

4

아래 모두를 작성한 후 grep 문을 발견했습니다. ksh가 '이 범위의 값 확장'의 표시기로 ..을 지원하지 않는다는 것을 상기하십시오. (나는 그것이 당신의 의도라고 생각합니다). 또한 grep에 대한 인수를 인용하지 않아서 모호 해졌습니다. 쉘이 변환 할 구문을 사용하고 있다면 grep에 어떤 reg-exp가 보내지는지 알 수 없습니다. 따옴표로 묶지 않은 값이 필요한지 확실히 알지 못하는 한, 항상 인수를 인용하는 것이 좋습니다.

grep '1[1-6]:[0-9][0-9]' | grep '24.12.2012' 

또한 '사용자가'임의의 문자 '연산자'를 사용하고 있습니까? '로 다시 작성하십시오. 또는 마침표 만 일치 시키시겠습니까? 마침표 만 일치 시키려면 \.처럼 이스케이프 처리해야합니다.

마지막으로 처리중인 파일이 Windows 컴퓨터에서 생성 된 다음 Unix/Linux로 전송 된 경우 줄 끝 (Ctrl-MCtrl-J) (\ r \ n)이 너에게 문제가 생겼어. dos2unix file [file2 ...]으로 PC 기반 파일 (또는 ftp를 통해 전송 된 파일)을 정리하십시오.


위의 내용이 도움이되지 않는 경우 문제를 디버그하려면 "나누고 정복해야합니다." 나는 다음과 같은 테스트를했을 때

, 나는 당신에게 UUOC을 가져올 것이다

$ echo "var1" | while read line ; do print "line=${line}" ; done 
line=var1 
$ vi Test.txt 
$ cat Test.txt 
var1 
$ cat Test.txt | while read line ; do print "line=${line}" ; done 
line=var1 

귀하의 질문에 관련없는,하지만 의견이 맥락에서 cat commnad의 사용입니다 원인이 확실 예상 출력을 가지고 장학금. 즉, 하나

#!/bin/ksh -vx 

같은 스크립트합니다 (오두막 라인)의 외형을 변경하여 쉘 디버깅/추적 옵션을 켜 지금, 당신의 문제를 해결하기 위해

while read line ; do print "line=${line}" ; done < Test.txt 

그러나로 쓸 수있다 또는, 단지이 라인의 상태를 추적하기 위해 일치하는 쌍을 사용하여 즉

set -vx 
while read line; do 
    print -u2 -- "#dbg: Line=${line}XX" 
    autosys_showJobHistory.sh $line \ 
    | grep 1[1..6]:[0..9][0..9] \ 
    | grep 24.12.2012 \ 
    | tail -1 
done < Test.txt 
set +vx 

내가 추가 디버깅 단계를 추가 한의는 print -u2 -- .... (U2 = stderror는 - 인쇄를위한 옵션 처리를 종료) 이제 출력을보고 여분의 공백이나 탭 문자가 들어오는 것을 확인할 수 있습니다.

$line을 인용하지 않아도되므로 중요하지 않습니다. 테스트의 일환으로 "${line}"을 인용하는 것이 좋습니다.

그런 다음 꼬리와 grep 줄을 주석 처리합니다. 당신은 어떤 단계가 이것이 깨지는 원인인지 알고 싶습니까? 그렇다면 autosys_script 자체가 여전히 예상하고있는 중간 출력을 생성합니까? 그런 다음 autosys + 1 grep은 예상대로 +2 greps, + tail을 출력합니까? 출력을 잃어 버리는 곳을 쉽게 볼 수 있어야합니다.

ihth