Puncte:0

Cum să afișați dimensiunea hard disk-urilor instalate

drapel in

Vreau să scriu un script Linux simplu, care va afișa dimensiunea reală a hard disk-ului instalat. Dacă există SSD de 128 GB, lsblk arată mai puțin de 128. Trebuie să verific dimensiunea reală a memoriei și să o imprim așa: 128 GB instalați = scriptul dă rezultate

128

Dacă sunt instalate două hard disk-uri, dă ieșire

128/512

Ar trebui să funcționeze atât pe unitățile sata, cât și pe cele nvme

Artur Meinild avatar
drapel vn
Trebuie să înțelegeți [diferența dintre Gigabytes și Gibibytes](https://docs.ukcloud.com/articles/other/other-ref-gib.html). Un hard disk de 128 GB este de 119 GiB (Gibibytes), care este de obicei ceea ce este raportat de sistemul de operare. Nu este clar ce vrei să spui prin „dimensiune reală” - nu există așa ceva ca „dimensiune falsă” AFAIK.
Grzegorz Michalak avatar
drapel in
Da, știu asta, îmi pare rău. Mă refer la Gigaocteți, dimensiunea „completă” a hard disk-ului
Artur Meinild avatar
drapel vn
Dimensiunea completă este aceeași, indiferent de unitatea în care o raportați.Există, de asemenea, instrumente de conversie între [unități] (https://linux.die.net/man/1/units).
Grzegorz Michalak avatar
drapel in
Înțeleg.. am nevoie doar de o comandă pentru a afișa dimensiunea hard disk-urilor în GB (nu GiB)
Artur Meinild avatar
drapel vn
`lsblk -b` arată dimensiunea în octeți - pe care apoi îi puteți extrage și converti după bunul plac.
Grzegorz Michalak avatar
drapel in
Dar cum să extragi doar unitățile instalate?
Artur Meinild avatar
drapel vn
Aici intră în joc abilitățile tale de scripting. Cu toate acestea, se pare că scriptul dvs. nu va fi foarte diferit de `lsblk` sau `df` cu parametrii corecti. Luați în considerare `alias dfs='\df -hl -T -x"squashfs" -x"tmpfs" | grep -v „/var/lib/docker” | (citește h; echo "$h"; sort -V)'` care este sortat `df`, dar fără volume docker sau dispozitive squashfs și tmpfs.
Puncte:1
drapel in
Cas

Necesită sudo pentru a fi folosit, dar funcționează:

sudo lshw | grep -Pzo "\*-(disc|namespace)(\n.*)+?\s+size:.*?\(\K\d+\w+" | tr "\0" "\n" | paste - sd/

Oferă rezultatul astfel:

1TB/750GB

Altfel nu ai ști dacă a fost TB/GB/MB așa că de aceea le-am păstrat.

EDIT: Am observat o .* în regex nu era nevoie. Comanda de mai sus a fost actualizată.

Explicaţie:

sudo lshw: bine... enumerați hardware-ul. Avem nevoie de sudo pentru a vedea unitățile din sistem. Aceasta va fi sursa noastră de informații.

grep -Pzo: vom folosi regex pentru a obține informațiile necesare

-P = activați regex perl
-z = tratează totul ca pe o singură linie lungă; acest lucru este necesar deoarece vom folosi regex pe mai multe linii
-o = în loc să afișeze rezultatul și să marcheze rezultatul cu roșu, arată doar rezultatul

regex (sfat: eliminați -o (alias -Pz) și adăugați regexe-urile de mai jos una câte una pentru a vedea ce se întâmplă pas cu pas; textul roșu este ceea ce s-a potrivit cu expresia regex, astfel încât să puteți vedea pas cu pas cum ne apropiem la rezultatul dorit și ceea ce se schimbă fiecare pas la rezultat):

\*-(disk|namespace) = Găsiți tot textul care este „*-disk” sau „*-namespace”. Trebuie să scăpăm (= \) de „*” deoarece în regex înseamnă zero sau mai mult, dar nu vrem asta, vrem să căutăm un „*” literal.
(\n.*)+ = Continuați să adăugați („+” = una sau mai multe) linii („\n” = mergeți la linia următoare; „.*” = tot ce este pe acea linie) la textul potrivit; veți vedea că acum totul sub prima potrivire a „\*-(disk|namespace)” este roșu.
?\s+dimensiune: = continuăm să adăugăm linii până când găsim prima potrivire ("?" = non-lacom, a.k.a. prima potrivire în loc de ultima potrivire) a unuia sau mai multor spații albe (= "\s+"; "\ s" este spațiu alb (tab, spațiu etc.); "+" este unul sau mai multe) și apoi "dimensiune:"; veți vedea că se apropiau mai mult de numărul dorit din rezultat.
.* = potriviți restul liniei respective,
?\( = până la prima potrivire (= ?) a unui „(”, din care trebuie să evadăm, deoarece este folosit în regex (puteți vedea că este folosit în prima parte a regex-ului aici).
\K\d+\w+ = potrivește un număr (= \d) o dată sau de mai multe ori (= "+") și după aceea un caracter cuvânt (= \w) o dată sau de mai multe ori (= "+"). Acum avem textul dorit în potrivire, dar nu vrem tot textul potrivit înainte de acesta în rezultat, așa că punem un „\K” înaintea textului dorit pentru a elimina textul potrivit înainte de „\K” din ieșirea. Este încă necesar să se potrivească, pur și simplu nu este inclus în rezultat. Acest lucru face ca toate expresiile regex dinaintea ei să fie pozitive (caută-l în sus; „pozitive lookbehind perl regex”) cu capabilități regex.

tr "\0" "\n": Veți vedea că avem textul dorit potrivit și nimic mai mult sau mai puțin. Când adăugăm din nou -o, veți vedea că rezultatele sunt afișate într-un mod ciudat (toate după altele). Asta pentru că sunt separate cu un caracter nul (= \0) pe care nu îl puteți vedea, în loc de o nouă linie. Acesta este un artefact al opțiunii „-z” a grep. Pentru a le afișa într-o listă normală, urma să înlocuim caracterele nule cu o linie nouă folosind tr.

paste -sd/: acum că avem rezultatele într-o listă, putem folosi comanda paste pentru a le pune unul după altul, folosind un „/” ca devider.

Cas avatar
drapel in
Cas
Regex-ul este destul de complex, dar mi se pare distractiv să scriu, așa că nu a fost nicio problemă.Mi se pare amuzant că Marosg vorbea despre faptul că nu vrea să scrie un scenariu întreg când am făcut-o într-o singură pistă, așa că nu asculta prea mult pe oamenii care se plâng așa, deși sunt de acord că ar trebui să știi mereu ce vrei. faci și nu doar copia în gol un script pe care cineva l-a făcut pentru tine. Înțelegerea a ceea ce a făcut scriitorul este o modalitate excelentă de a învăța!
Grzegorz Michalak avatar
drapel in
Mulțumesc, mă bucur să aud asta :) Poți să descrii ce face fiecare parte a scenariului tău?
Grzegorz Michalak avatar
drapel in
Multumesc, e grozav! Am folosit asta pentru moment: `lsscsi -s | awk '/N:/ {printf $NF}' | rev | tăiat -c 3- | rev && lsscsi -s | awk '$3 ~ /ATA/ {printf $NF}' | rev | tăiat -c 3- | rev`
Cas avatar
drapel in
Cas
Vezi editarea răspunsului meu!
sudodus avatar
drapel jp
+1; Dar aveam nevoie de prefixul LANG=C pentru ca comanda ta să funcționeze, pentru că nu folosesc engleza. Poate vă puteți edita răspunsul pentru a-l include.
Puncte:1
drapel vn

Nu este clar care este întrebarea ta. Sper că nu doriți ca cineva să scrie întregul scenariu, ci mai degrabă vă întrebați cum să obțineți numerele cu care doriți să lucrați.

Utilizați lshw, aceasta este o ieșire (redatată) din sistemul meu, un NVMe și un SSD prezent

$ lshw -c disc
  *-namespace               
       descriere: spațiu de nume NVMe
       nume logic: /dev/nvme0n1
       dimensiune: 953 GiB (1024 GB)
...
  *-disc
       descriere: ATA Disk
       produs: Samsung SSD 850
       nume logic: /dev/sda
       dimensiune: 931 GiB (1TB)
...
Grzegorz Michalak avatar
drapel in
Da, este o comandă bună, dar vreau să afișeze doar dimensiunea și, dacă este posibil, această dimensiune între paranteze (1TB, 1024GB etc)
marosg avatar
drapel vn
Nu este prea complicat să îl analizați și să afișați așa cum doriți. Nu vă așteptați ca oamenii să vă scrie întregul scenariu.
Puncte:0
drapel jp

Următoarea comandă dintr-o linie ar trebui să facă ceea ce doriți.

pentru i în $(lsblk -bdno name,size|tr -s ' ' '_'); do j=${i##*_};j=$((((j+500000000)/1000000000));printf „${i%_*}\t$j\tGB\n”;terminat

Puteți pune o funcție cu ea în dvs ~/.bashrc fișier lângă aliasuri pentru a-l rula cu o comandă scurtă, de exemplu mydrives

function mydrives { for i in $(lsblk -bdno name,size|tr -s ' ' '_'); do j=${i##*_};j=$(((j+500000000)/1000000000));printf „${i%_*}\t$j\tGB\n”;terminat }

La mine funcționează așa, după

sursa ~/.bashrc

și în toate ferestrele de terminal pe care le deschideți după ce ați modificat ~/.bashrc fişier.

Pe computerul meu se tipărește așa

$ mydrives
sda 256 GB
sdb 4001 GB
sr0 1 GB
nvme0n1 250 GB

Sunt obișnuit cu GiB (gibibytes), așa că folosesc adesea simplă lsblk comanda

lsblk

sau când vreau mai multe detalii și am o fereastră largă de terminal

lsblk -fm

sau altfel

lsblk -m

Comanda care se potrivește cu ceea ce ți-am sugerat, dar cu mibibytes, gibibytes, tibibytes (baza 2 mai degrabă decât baza 10) ar fi

$ lsblk -dno nume, dimensiune
sda 238,5G
sdb 3,7T
sr0 1024M
nvme0n1 232,9G

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.