
파일 크기를 모니터링하고 작업 ID를 파악하는 스크립트를 만들려고 합니다. 문제는 여러 프로세스가 실행 중이더라도 스크립트가 첫 번째 ID만 반환한다는 것입니다. 왜 이것이 작동하지 않는지 아시나요?
#!/bin/sh
filename='bigfiles'
find /opt/Logs -type f -size +10k > $filename
count='cat bigfiles | wc -l'
while read -r line
do
pid= more "$line" | grep ID | awk -F '=' '{print $2}'>> pid.txt
done < $filename
또한 여러 디렉터리를 스캔해야 하며 로그 파일 크기가 파일 시스템 사용률의 25%에 도달하면 스크립트가 파일을 스캔해야 합니다. 이것을 병합하는 방법에 대한 제안이 있으십니까?
while 대신 for를 사용하면 작동합니다.
for line in $(cat bigfiles)
do echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(more $line | grep JOBID | awk -F '=' '{print $2}') >> hist.txt;
done
답변1
우리는 당신이 다루고 있는 파일이 어떤 모습인지 모르기 때문에 당신의 스크립트가 제대로 수행되지 않는 이유를 말하기는 어렵습니다. 우리가 아는 것은 당신이 해당 문자열을 포함하는 줄에 관심이 있고 해당 줄에서 a 뒤에 오는 모든 것을 ID
얻고 싶어한다는 것입니다 .=
스크립트에는 두 개의 사용되지 않은 변수( count
쉘 명령이 포함된 문자열) 및 pid
(빈 변수)가 포함되어 있습니다. 다음 콘텐츠에 도달하려면 여전히 많은 어려움을 겪어야 합니다 =
.
more "$line" | grep ID | awk -F '=' '{ print $2 }'
명령 more
은 호출기입니다. 이는 유틸리티임을 의미합니다.보다문서. grep
다음을 사용하는 대신 파일을 직접 읽을 수 있습니다 .
grep ID "$line" | awk -F '=' '{ print $2 }'
하지만 단지 자신이 할 수 있는 grep
일을 하게 놔둘 뿐이죠 .awk
awk -F '=' '/ID/ { print $2 }' "$line"
하지만 우리는 더 잘할 수 있습니다. 모든 경로 이름을 파일에 저장하는 대신 $filename
파일이 모든 작업을 수행하도록 할 수 있습니다 .find
find /opt/Logs -type f -size +10k \
-exec awk -F '=' '/ID/ { print $2 }' {} + >pid.txt
/opt/Logs
이렇게 하면 10KB 이하의 모든 일반 파일을 찾습니다 . 각 파일에 대해 =
이 문자열을 포함하는 각 줄(첫 번째 줄) 뒤의 내용이 ID
인쇄됩니다. 결과는 에 저장됩니다 pid.txt
.
관련된:
답변2
filename='bigfiles' find /opt/Logs -type f -size +10k > $filename
for line in $(cat bigfiles)
do
echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(grep JOBID "$line" | awk -F '=' '{print $2}') >> hist.txt;
done