로그 출력을 "line"에 할당하고 싶습니다. 다음을 시도했습니다.
line=tail -1000 /var/log/syslog
하지만 작동하지 않습니다.
myscript는 다음과 같습니다
#!/bin/bash
line=`tail -1000 /var/log/syslog`
d1=$(date --date="-10 min" "+%b %_d %H:%M")
d2=$(date "+%b %_d %H:%M")
while read line; do
[[ $line > $d1 && $line < $d2 || $line =~ $d2 ]] && echo $line
done
답변1
이 변화를 시도해 보세요
fd=""
tmplog="/tmp/temp_${$$}_${RANDOM}"
tail -1000 /var/log/syslog > "$tmplog"
exec {fd}<"$tmplog"
while IFS='' read -r -u $fd line || [[ -n $line ]]; do
#your commands here
done
exec {fd}>&-
rm "$tmplog"
작동 방식: fd
변수에 할당됩니다. 스크립트 PID와 내장된 "임의" 숫자를 사용하여 임시 파일을 생성합니다(대신 mktemp 명령을 사용할 수도 있음). fd
임시 파일을 읽기 위해 파일 설명자를 엽니다 . while 루프를 사용하여 IFS
None으로 설정하고 -u
읽기 옵션을 사용하여 읽기 명령을 실행합니다 fd
. 동일한 변수를 사용하여 루프 내부에 명령을 넣으십시오 line
. 파일 설명자를 닫습니다. 임시 파일을 삭제합니다.
답변2
$( ... )
백틱보다 더 강력하고 스타일이 더 좋지만 할당은 잘 작동합니다 . 하지만 read line
읽지는 않는다~에서행, stdin에서 읽습니다(리디렉션하지 않았으므로 터미널).입력하다좋습니다. 이전 콘텐츠를 파기합니다. 다음 중 하나를 시도해 보십시오.
data=$(tail -1000 /file)
while read line; do echo "$line"; done <<<"$data"
# bash ksh zsh but maybe not older shells
# or
while read line; do echo "$line"; done < <(tail -1000 file)
# ditto
data=$(tail -1000 /file)
echo "$data" | while read line; do echo "$line"; done
# or
tail -1000 file | while read line; do echo "$line"; done
# most shells, but any var set (or other shell change made) within the loop
# will disappear on _some_ shells because pipelines are run in subshells
루프에 적절한 명령을 추가합니다.
read
일반적으로 EnterUserNameHere에 표시된 것처럼 데이터가 손상되는 것을 방지하고 싶지만 -r
syslog 항목은 매우 잘 구조화되어 있으며 어떤 경우에도 그럴 필요가 없습니다. OTOH는 아프지 않으며 좋은 습관이라고 덧붙였습니다.
예를 들어 now-10min이 "11월 31일 23:55"이고 지금이 "12월 01일 00:05"인 경우 실제로는 이 날짜 사이의 모든 날짜 문자열이 날짜 문자열 비교가 작동하지 않습니다. 두 번은 될 거야실패하다시험을 치르다$line > $d1 && $line < $d2