다음 작업을 수행하는 데 약간의 시간이 걸립니다.
hostname:timestamp
다음을 포함하는 파일이 있습니다.
hostname1:1445072150
hostname2:1445076364
타임 스탬프가 1 시간 이상 지난 경우 확인하기 위해이 파일 (cron 작업 사용)을 쿼리하는 bash 스크립트를 만들고있는 경우 해당 줄을 제거하려고합니다. 아래는 지금까지 내가 가지고 있지만 파일에서 줄을 제거하지 않는 것 같습니다.
#!/bin/bash
hosts=/tmp/hosts
current_timestamp=$(date +%s)
while read line; do
hostname=`echo $line | sed -e 's/:.*//g'`
timestamp=`echo $line | cut -d ":" -f 2`
diff=$(($current_timestamp-$timestamp))
if [ $diff -ge 3600 ]; then
echo "$hostname - Timestamp over an hour old. Deleting line."
sed -i '/$hostname/d' $hosts
fi
done <$hosts
한 시간이 넘었지만 파일에서 시간을 제거하는 데 문제가있는 호스트를 식별 할 때 타임 스탬프 부분이 올바르게 작동하도록 관리했습니다.
파일을 열어 두는 while 루프 때문일 수 있지만 해결 방법은 100 % 확실하지 않습니다. 또한 파일의 사본을 만들고 편집을 시도했지만 여전히 아무것도 없습니다.
대안 :이 작업을 수행하고 동일한 결과를 생성하는 더 좋은 방법이 있다면 제안을받을 수 있습니다. :)
어떤 도움이라도 대단히 감사하겠습니다.
건배
스크립트의 문제는 다음 줄이었습니다.
sed -i '/$hostname/d' $hosts
작은 따옴표 안의 변수는 해당 값으로 확장되지 않으므로 명령은 값 대신 문자 그대로 "$ hostname"을 바꾸려고합니다. 작은 따옴표를 큰 따옴표로 바꾸면 변수가 여기에 필요한 값으로 확장됩니다.
sed -i "/$hostname/d" $hosts
가능한 개선이 있습니다.
#!/bin/bash
hosts=/tmp/hosts
current_timestamp=$(date +%s)
while read line; do
set -- ${line/:/ }
hostname=$1
timestamp=$2
((diff = current_timestamp - timestamp))
if ((diff >= 3600)); then
echo "$hostname - Timestamp over an hour old. Deleting line."
sed -i "/^$hostname:/d" $hosts
fi
done <$hosts
개선 사항 :
((...))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다