bash를 사용하여 파일의 줄을 반복하고 변수에 전달합니다. 결과 변수가 파일 값과 다릅니다. 이유는 무엇입니까?

bash를 사용하여 파일의 줄을 반복하고 변수에 전달합니다. 결과 변수가 파일 값과 다릅니다. 이유는 무엇입니까?

나는 몇 년 동안 cron에서 실행해 온 bash 스크립트(간단한 로그 파일 패턴 일치를 수행함)를 가지고 있습니다. 최근에 문제가 발생하여 이상한 결과가 반환되기 시작했습니다. 스크립트를 자세히 살펴보고 디버깅을 한 후에 파일에서 수행하고 있던 while 루프에 문제가 있는 것 같다는 사실을 발견했습니다.

문제를 설명하기 위해 "cat /var/tmp/file" 파일을 분류하고 예상했던 타임스탬프와 일부(형식화되지 않은) ID를 얻었습니다.

15:56:14,965 [,PCC12345678(PSI12345678),,]
18:08:43,706 [,PCC23456789(PSI23456789),,]
12:01:49,233 [,PCC34567891(PSI34567891),,]

while 루프에 넣을 때 동일하게 유지될 것으로 예상했지만 그렇지 않습니다. 루프에서 해당 행을 에코하면 두 번째 필드(ID)가 항상 다음과 같이 "1"로 변경됩니다.

cat /var/tmp/file | while read line
do
echo $line
done

나에게 제공되는 결과는 다음과 같습니다.

15:56:14,965 1
18:08:43,706 1
12:01:49,233 1

이것은 분명히 파일에 있는 내용과 전혀 다르기 때문에 혼란스럽습니다.

지금까지 시도한 것:

  • $line 변수가 메모리에 갇혀 있을 수도 있다고 생각해서 지우려고 시도했지만 성공하지 못했습니다.
  • 더 나은 아이디어가 없기 때문에 서버를 "껐다가 다시 켜는" 방법을 시도해 보았습니다. 그러면 막힐 수 있는 모든 문제가 해결될 것이라고 생각했습니다.
  • 다른 두 서버에서 스크립트를 실행해 보았지만 동일한 문제가 발생했습니다.

현재 나는 파일 형식이 마음에 들지 않을 수도 있고 대괄호나 쉼표와 관련된 것일 수도 있다고 생각하고 있습니다. 왜 이런 일이 일어나는지, 왜 갑자기 이런 일이 일어나는지는 잘 모르겠습니다.

참고: 작성된 이후 스크립트나 스크립트가 실행되는 로그 파일은 변경되지 않았습니다. 이전에는 2년 동안 일해왔습니다.

편집: 제안한 대로 환경에 가능한 변화가 있는지 확인했는데 제가 알 수 있는 한 상황은 동일합니다. OS 업그레이드로 인해 변경된 사항이 없다면(확인 방법을 모르겠습니다):

  • .bash_profile 및 .profile은 3년 넘게 편집되지 않았습니다.
  • 다른 쉘 ksh, bash, csh에서 스크립트를 실행해 보았습니다. 그들 모두는 같은 문제에 직면했습니다.
  • 다른 사용자(루트 포함)와 함께 스크립트를 실행해 보았습니다. 그들 모두는 또 같은 문제를 겪었습니다.

고마워요 매트

답변1

1스크립트가 실행되는 디렉터리에 파일 이름이 있습니다.

~처럼멜 버슬랜드주석은 []셸에서 특별한 의미를 가지지만 정규식과는 별로 관련이 없습니다. 단지 "대괄호 사이의 모든 문자에서 가져온 단일 문자"를 의미할 뿐입니다. 그래서 당신이 달릴 때

echo 15:56:14,965 [,PCC12345678(PSI12345678),,]

,셸은 , 또는 P, C또는 ... 이라는 파일을 찾고 1, 하나 이상의 파일이 일치하면 [,PCC12345678(PSI12345678),,]출력에서 ​​일치하는 모든 파일 이름으로 바꿉니다. 그렇지 않으면 그대로 복사됩니다.

이 파일을 삭제하면 1이전 동작이 복원되어야 합니다. 스크립트를 보호하여 수정할 수 있습니다 $line.

cat /var/tmp/file | while read line
do
echo "$line"
done

관련 정보