bash: 최신 n개 레코드 필터링

bash: 최신 n개 레코드 필터링

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또는 여기를 사용 하고 각 끝점에 대해 끝점을 호출하는 것과 같은 것을 파이프할 수 있습니다.tailxargs 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

관련 정보