Logstash 데이터로 모든 스토리지를 채우는 것을 방지하기 위해 Elasticsearch 클러스터의 인덱스를 삭제하는 작은 스크립트를 만들고 있습니다.
레코드 목록이 있고 최신 n개 레코드(예: 7개)를 유지하고 다른 모든 레코드를 삭제하고 싶습니다.
컬을 사용하여 인덱스 목록을 얻을 수 있습니다.
drakaris:~/ # curl -sL localhost:9200/_cat/indices/logstash-* | awk '{print $3;}' | sort
logstash-2022.12.30
logstash-2022.12.31
logstash-2023.01.01
logstash-2023.01.02
logstash-2023.01.03
logstash-2023.01.04
logstash-2023.01.05
logstash-2023.01.06
logstash-2023.01.07
logstash-2023.01.08
logstash-2023.01.09
내 스크립트에서는 최신 7번째 인덱스만 유지하고 "curl -XDELETE localhost: 9200/index"를 사용하고 싶습니다.
Bash의 배열에서 이러한 레코드를 어떻게 얻을 수 있습니까?
감사해요
[편집] 누군가가 유용하다고 생각할 경우를 대비해 이 방법으로 해결했습니다.
RETENTION=7
nbk=$(curl -sL localhost:9200/_cat/indices/logstash-* | awk '{print $3;}' | wc -l)
if [ $nbk -gt $RETENTION ]; then
echo -e "======== Delete obsolete indexes (retention: $RETENTION)"
let ntodel=$nbk-$RETENTION
for efile in $(curl -sL localhost:9200/_cat/indices/logstash-* | awk '{print $3;}' | sort -r | /usr/bin/tail -$ntodel); do
curl -XDELETE localhost:9200/$efile
sleep 10
done
fi
답변1
이는 간단해야 합니다. 이것을 시도해 보세요(테스트되지 않았습니다!)
drakaris:~/ # curl -sL localhost:9200/_cat/indices/logstash-* | awk '{print $3;}' | sort | tail -n +8
logstash-2022.12.30
logstash-2022.12.31
logstash-2023.01.01
logstash-2023.01.02
원하는 것을 얻기 위해 head
또는 여기를 사용 하고 각 끝점에 대해 끝점을 호출하는 것과 같은 것을 파이프할 수 있습니다.tail
xargs curl...
DELETE
및 에 대한 맨페이지를 확인 head
하고 tail
명령의 사용법을 기록해 두십시오.+
답변2
Bash에서 목록을 배열에 매핑할 수 있습니다. 파이프/서브쉘은 변수를 반환하지 않으므로 readarray
프로세스 대체를 위해 (또는 별칭)을 사용합니다 .mapfile
readarray -t indexes < <(curl -sL localhost:9200/_cat/indices/logstash-* | awk '{print $3;}' | sort)
# now iterate the array, except the last 7 entries
# (if the array size is < 7, the loop would not enter)
for (( i=0; i < (${#indexes[*]}-7); i++ )); do
# delete unwanted indexes
curl ... ${indexes[$i]}
done