Bash에서 로그를 변수로 할당하는 방법

Bash에서 로그를 변수로 할당하는 방법

로그 출력을 "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 루프를 사용하여 IFSNone으로 설정하고 -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에 표시된 것처럼 데이터가 손상되는 것을 방지하고 싶지만 -rsyslog 항목은 매우 잘 구조화되어 있으며 어떤 경우에도 그럴 필요가 없습니다. OTOH는 아프지 않으며 좋은 습관이라고 덧붙였습니다.

예를 들어 now-10min이 "11월 31일 23:55"이고 지금이 "12월 01일 00:05"인 경우 실제로는 이 날짜 사이의 모든 날짜 문자열이 날짜 문자열 비교가 작동하지 않습니다. 두 번은 될 거야실패하다시험을 치르다$line > $d1 && $line < $d2

관련 정보