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.