Nó yêu cầu sudo để sử dụng nhưng nó hoạt động:
sudo lshw | grep -Pzo "\*-(đĩa|không gian tên)(\n.*)+?\s+size:.*?\(\K\d+\w+" | tr "\0" "\n" | dán - sd/
Nó cho đầu ra như thế này:
1TB/750GB
Nếu không, bạn sẽ không biết liệu đó có phải là TB/GB/MB hay không, đó là lý do tại sao tôi giữ chúng.
CHỈNH SỬA: Tôi nhận thấy một .*
trong regex là không cần thiết. Lệnh trên đã được cập nhật.
Giải trình:
sudo lshw
: tốt ... liệt kê phần cứng. Chúng ta cần sudo để xem các ổ đĩa trong hệ thống. Đây sẽ là nguồn thông tin của chúng tôi.
grep -Pzo
: chúng ta sẽ sử dụng regex để lấy thông tin cần thiết
-P = kích hoạt biểu thức chính quy Perl
-z = coi mọi thứ là một dòng dài; điều này là bắt buộc vì chúng tôi sẽ sử dụng biểu thức chính quy trên nhiều dòng
-o = thay vì hiển thị đầu ra và đánh dấu kết quả màu đỏ, chỉ hiển thị kết quả
biểu thức chính quy
(mẹo: xóa -o (a.k.a -Pz) và thêm từng biểu thức chính bên dưới để xem điều gì xảy ra từng bước; văn bản màu đỏ là biểu thức chính phù hợp, vì vậy bạn có thể thấy từng bước chúng ta tiến gần hơn như thế nào đến kết quả mong muốn và mỗi bước thay đổi như thế nào đối với đầu ra):
\*-(đĩa|không gian tên) = Tìm tất cả văn bản là "*-đĩa" hoặc "*-không gian tên". Chúng tôi cần thoát (= \) "*" vì trong biểu thức chính quy, nó có nghĩa là 0 hoặc nhiều hơn, nhưng chúng tôi không muốn điều đó, chúng tôi muốn tìm kiếm một chữ "*".
(\n.*)+ = Tiếp tục thêm (dấu "+" = một hoặc nhiều) dòng ("\n" = chuyển sang dòng tiếp theo; ".*" = mọi thứ trên dòng đó) vào văn bản phù hợp; bạn sẽ thấy rằng bây giờ mọi thứ trong kết quả khớp đầu tiên của "\*-(đĩa|không gian tên)" đều có màu đỏ.
?\s+size:= chúng tôi tiếp tục thêm các dòng cho đến khi chúng tôi bắt gặp trận đấu đầu tiên ("?" = không tham lam hay còn gọi là trận đấu đầu tiên thay vì trận đấu cuối cùng) của một hoặc nhiều khoảng trắng (= "\s+"; "\ s" là khoảng trắng (tab, dấu cách, v.v.); "+" là một hoặc nhiều) và sau đó là "size:"; bạn sẽ thấy rằng nó đang tiến gần hơn đến con số mong muốn trong đầu ra.
.* = khớp với phần còn lại của dòng đó,
?\( = cho đến khi khớp đầu tiên (= ?) của "(", mà chúng ta cần thoát vì nó được sử dụng trong biểu thức chính quy (bạn có thể thấy nó được sử dụng trong phần đầu tiên của biểu thức chính quy tại đây).
\K\d+\w+ = khớp một số (= \d) một hoặc nhiều lần (= "+") và sau đó là một ký tự từ (= \w) một hoặc nhiều lần (= "+"). Bây giờ chúng tôi có văn bản phù hợp trong kết quả phù hợp, nhưng chúng tôi không muốn tất cả văn bản phù hợp trước đó trong đầu ra, vì vậy chúng tôi đặt "\K" trước văn bản mong muốn để xóa văn bản phù hợp trước "\K" khỏi đầu ra. Nó vẫn bắt buộc phải khớp, nó chỉ không được bao gồm trong đầu ra. Điều này làm cho tất cả regex trước nó trở thành một giao diện tích cực (tra cứu nó; "regex perl lookbehind tích cực") với các khả năng của regex.
tr "\0" "\n"
:
Bạn sẽ thấy rằng chúng tôi có văn bản phù hợp mong muốn và không có gì hơn hoặc kém hơn.
Khi chúng tôi thêm -o một lần nữa, bạn sẽ thấy rằng các kết quả được hiển thị theo một cách kỳ lạ (tất cả nối tiếp nhau).
Đó là bởi vì chúng được phân tách bằng một ký tự rỗng (= \0) mà bạn không thể nhìn thấy, thay vì một dòng mới. Đây là một tạo tác của tùy chọn "-z" của grep.
Để hiển thị chúng trong một danh sách bình thường, chúng ta sẽ thay thế các ký tự rỗng bằng một dòng mới bằng cách sử dụng tr
.
dán -sd/
: bây giờ chúng ta có kết quả trong một danh sách, chúng ta có thể sử dụng lệnh dán để đặt chúng sau nhau, sử dụng "/" làm bộ chia.