![Python 스크립트를 사용하여 테이블 생성](https://linux55.com/image/109986/Python%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8C%EC%9D%B4%EB%B8%94%20%EC%83%9D%EC%84%B1.png)
출력은 다음과 같습니다.
Name: s210_21tb_800gb-ssd_128gb
Nodes: 1, 2, 3
Requested Protection: +2d:1n
HDD Used: 13.2094T
HDD Total: 55.9520T
HDD % Used: 23.61%
이 출력에서 다음 정보를 추출합니다.
- 패리티는
y
"요청된 보호" 행 끝에 있는 값입니다. 우리는 마지막에서 두 번째 문자n
(이 경우 1) 를 원합니다. - 노드 수는
c
"노드:" 줄의 마지막 값입니다. - 개별 용량(TB 단위)은
m
"HDD 합계" 행의 값입니다. - 사용된 용량은
p
"HDD Used" 행의 값이기도 합니다.
이 값을 바탕으로 다음 계산을 수행합니다.
- 총계 = m/c * (cy)TB
- 유효 총 용량 = m / c * (cy)*0.8TB
- 중고 = p/c TB
- 유효 사용량 = p / c* (cy)*0.8TB
- 사용 가능한 볼륨 = (m - p)/c * (cy)*0.8TB
Python 스크립트를 사용하여 테이블에 다음 출력을 얻을 수 있습니까?
현재 스크립트는 다음과 같습니다.
#!/bin/bash
y=$(grep -n Protection storage_info | cut -d ':' -f4 | cut -c1)
echo y=$y
c=$(grep -n Node storage_info | awk '{print substr($0,length,1)}')
echo c=$c
m=$(grep "HDD Total" storage_info | cut -d ':' -f2|rev|cut -c 2- | rev)
echo m=$m
p=$(grep "HDD Used" storage_info_info | cut -d ':' -f2|rev|cut -c 2- | rev)
echo p=$p
echo parity=$y
echo Nodenumber=$c
div=$(echo $m/$c| bc)
div1=$(echo $p/$c| bc)
minus=$(echo $c-$y|bc)
minus1=$(echo $m-$p|bc)
Total=$(echo $div \* $minus |bc)
echo "Total = $Total TB"
EffectiveTotalvolume=$(echo $div \* $minus \* 0.8 |bc)
echo "Effective Total volume = $EffectiveTotalvolume TB"
echo "USED =$div1 TB"
Effectiveused=$(echo $div1 \* $minus \* 0.8 |bc)
echo "Effective used=$Effectiveused TB"
Availablevolume=$(echo $minus1/$c \* $minus \* 0.8|bc)
echo "Available volume=$Availablevolume TB"
원하는 출력은 다음과 같습니다.
Total = 36 TB
Effective Total volume = 28.8 TB
USED =4 TB
Effective used=6.4 TB
Available volume=22.4 TB
(이 값은 예제 출력과 일치하지 않으며 서로 다른 실행입니다. 죄송합니다.)
답변1
실제로 Python에는 다양하고 상세한 인쇄 서식 지정 도구가 있습니다. 좋은 개요는 다음에서 찾을 수 있습니다.https://pyformat.info/코드 예제 등
그러나 내 생각엔 당신의진짜여기서 질문은 "이 스크립트를 덜 취약하게 만들기 위해 어떻게 수정합니까?"입니다. 내 제안은 Awk를 사용하는 것입니다.
Awk 스크립트의 일반적인 구문은 다음과 같습니다.조건부 {
동작}
조각. awk는 입력 파일의 한 줄을 읽고 각 조건에 대해 테스트합니다. 조건은 일반적으로 정규식이 될 수 있으며, 이는 정규식이 현재 줄의 어느 위치와 일치하면 true입니다. 조건이 true이면 작업을 수행합니다.
substr
length
기대하고 $n
해결하는 기능을 수행하는 것 입니다.N현재 행의 첫 번째 필드(기본적으로 행은 단순히 빈 필드로 구분되지만 구성 가능) NF
현재 줄의 필드 수를 포함하는 변수이므로 $NF
현재 줄의 마지막 필드를 참조합니다.
마지막으로 END
전체 입력 파일을 읽었을 때 조건이 실행됩니다. ( BEGIN
입력을 읽기 전에 조건을 사용하여 작업을 수행할 수도 있습니다.)
isi storagepool list -v |
awk '# Assume parity is second to last character on this line?
/Requested Protection:/ { parity=substr($NF,length($NF)-1,1) }
/Nodes:/ { nodes=$NF }
/HDD Total/ { hdd_total=$NF } # Awk helpfully ignores T suffix
/HDD Used/ { hdd_used=$NF } # here too
END {
multiplier=nodes-parity
total=hdd_total/nodes*multiplier
used=hdd_used/nodes
print "Total = " total " TB"
print "Effective Total volume = " total*0.8 " TB"
print "USED =" used " TB" # no space after =, really?
print "Effective used=" used*multiplier*0.8 " TB" # double ditto
print "Available volume=" (hdd_total-hdd_used)/nodes*multiplier*0.8 " TB" }'
귀하의 예제에는 "요청된 보호" 출력에 콜론으로 구분된 4개의 필드가 포함되어 있지 않으므로 스크립트가 이를 정확히 어떻게 처리하는지 확실하지 않지만 설명에 따라 substr
및 를 사용하여 마지막 필드의 두 번째 문자에서 역수를 얻습니다 length
.
귀하의 예에서는 HDD 필드 T
에 접미사가 포함되어 있지만 Awk는 추출된 숫자에 대해 연산을 수행할 때 해당 접미사를 무시하므로 그대로 둡니다. (접미사가 M 또는 G일 수도 있다면 문제가 될 것입니다!)
인터넷 검색으로는 isi storagepool
나에게 유용한 문서가 전혀 나오지 않았습니다. (그러나 이 도구에서 기계가 읽을 수 있는 올바른 출력을 얻을 수 있는 방법은 없는 것 같습니다. 이는 확실히 최선의 선택입니다. 많은 도구에는 XML 또는 JSON 출력을 생성하는 옵션이 있으므로 다음을 수행할 필요가 없습니다. 장치를 자동화하려는 각 도구에 대해 자신을 구문 분석합니다.
특별히 일치하는 항목이 없으면 여전히 실패할 수 있지만 Nodes:
(그러면 0으로 나누기 오류가 발생함) 전반적으로 이것이 Bash 스크립트보다 더 우아하고 읽기 쉽고 강력하다는 데 동의할 것입니다. (물론 원하는 경우 설명에 단일 문자 변수 이름을 사용할 수 있지만 사람이 읽을 수 있는 변수 이름을 사용하는 것이 일반적으로 유지 관리하기 더 쉽습니다.)