Nhận chi tiết không gian mà không có tên ổ đĩa


2

nếu có một cách để có được các chi tiết không gian ổ đĩa mà không cần tên ổ đĩa. Ví dụ: đầu ra của

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G   15G  4.2G  78% /
/dev/sda6              68G   39G   26G  61% /u01
/dev/sda2              30G  5.8G   22G  21% /opt
/dev/sda1              99M   19M   76M  20% /boot
tmpfs                  48G  8.2G   39G  18% /dev/shm
/dev/mapper/vg3-KPGBKUP4
                   10T  7.6T  2.5T  76% /KPGBKUP4

Tôi muốn đầu ra như sau:

20G   15G  4.2G  78% 
68G   39G   26G  61% 
30G  5.8G   22G  21% 
99M   19M   76M  20% 
48G  8.2G   39G  18% 
10T  7.6T  2.5T  76%

Tại sao tôi muốn điều này? Tôi có một số máy chủ và phải báo cáo hàng ngày. Điều này sẽ giảm công việc của tôi xuống một phần mười. Bất kỳ đề nghị được đánh giá cao.

Câu trả lời:


2

Giả sử hệ thống tập tin và điểm gắn kết không chứa các ký tự trống, hãy thử:

df -hP | awk 'NR>1 { $1=$6="" ; print }' | column -t

df -hP liệt kê các thống kê hệ thống tập tin mà không ngắt dòng cho tên hệ thống tập tin dài.

awk 'NR>1 { ... }'hạn chế hành động đã cho thành dòng thứ 2 và tiếp theo để bỏ qua dfdòng tiêu đề ...

Các hoạt awkđộng thay { $1=$6="" ; print }đổi các trường không mong muốn và in phần còn lại.

Sử dụng { print $2,$3,$4,$5 }sẽ làm công việc tương tự.

column -t sắp xếp toàn bộ đầu ra dưới dạng bảng sạch.


$ cat x
#!/bin/sh
echo '<testing inside a script>'
df -hP | awk 'NR>1 { $1=$6="" ; print }' | column -t
echo '</testing inside a script>'
$ chmod +x x
$ ./x
<testing inside a script>
71G    39G   29G    58%
1006M  0     1006M  0%
10M    208K  9,8M   3%
1006M  0     1006M  0%
</testing inside a script>
$ _

(Tôi sẽ xóa vấn đề này một lần nữa khi vấn đề được đề cập trong các bình luận đã được giải quyết ...)


2
Bạn có thể (và nên) sử dụng df -Pđể chặn các ngắt dòng.
n.st

Phải ... tôi nhớ đã biết điều này khi não tôi còn trẻ ... ho! ho! :-D Cảm ơn ^ n!
yeti

Mối quan tâm của bạn là đúng, dòng cuối cùng không như tôi muốn. Dòng cuối cùng của tôi là tạo ra vấn đề. nó mang lại cho tôi "7.8T 2.3T 78% / CGFBKUP1" thay vì "10T 7.8T 2.3T 78%". Đó là vấn đề chính của tôi, nếu không tôi có thể đã sử dụng "df -h | awk {'in $ 2, $ 3, $ 4, $ 5'}"
Abhishek dot py

Xuất sắc. Câu hỏi của tôi khá khó hiểu, nhưng bạn đã ứng biến tốt. Nhưng tôi không giỏi lắm với awk, bạn có thể giải thích ngắn gọn những gì bạn đã làm ở đây không?
Abhishek chấm py

Mặc dù lệnh của bạn đang hoạt động hoàn hảo trên dòng lệnh, nhưng nó không hoạt động trên tập lệnh. Đó là khai báo lỗi gần ';'.
Abhishek dot py

5

Kể từ GNU coreutils 8.21 ( changelog ), dfcó một --outputtùy chọn. Sử dụng sedđể cắt tiêu đề:

df -h --output=size,used,avail,pcent | sed 1d

Ít nhất là dftừ coreutils 8.12.197-032bb không có tùy chọn đó, vì vậy nó phải khá mới. (Đó là phiên bản Debian Wheezy hiện đang phát hành.) Mặc dù có vẻ hữu ích.
CVn

@ MichaelKjorling, vâng, không bao giờ nhận ra điều này. Kể từ phiên bản 8.21, tôi đã thêm câu này vào câu trả lời của mình.
Graeme

2
findmnt -Do SIZE,USED,AVAIL,USE%

Đây là đầu ra của tôi:

 SIZE   USED AVAIL USE%
11.8G      0 11.8G   0%
11.8G  63.1M 11.7G   1%
11.8G   920K 11.8G   0%
11.8G      0 11.8G   0%
  12G   8.9G  2.7G  74%
11.8G 410.6M 11.4G   3%
   3G 584.4M  2.4G  19%
   3G 584.4M  2.4G  19%
 2.4G     4K  2.4G   0%
   0      0     0    -

Vì vậy, nếu bạn chưa sử dụng findmntcho báo cáo của mình, có lẽ bạn nên làm vậy. Bạn có thể nhận được rất nhiều cụ thể hơn thế nữa - nhưng trong trường hợp trên, chúng tôi xác định -Dođể bắt chước df(như các tùy chọn được mô tả) và để hạn chế các cột đầu ra. Để loại bỏ các tiêu đề cột, chỉ cần thêm -n. Bạn không cần bất kỳ phân tích chuỗi; đó là nguyên tử cho đầu ra.

Nhưng đừng hiểu ý tôi:

man mount

... Để sử dụng đầu ra mạnh mẽ và chắc chắn hơn findmnt(8), đặc biệt là trong các tập lệnh của bạn ...


Tôi có thể tìm thấy findmnt trên hệ thống của tôi. Có cần phải được cài đặt riêng.
Abhishek chấm py

Nó không nên - bạn có phiên bản kernel nào?
mikeerv

1
@Abhishekdotpy Trên Debian ít nhất, nó được cung cấp bởi mountgói chắc chắn sẽ được cài đặt.
một CVn

@Abhishekdotpy findmntlà một phần của util-linux(như vậy mount). Lưu ý rằng đây là gói nguồn cho gói gắn kết trong Debian. Các phân phối khác có thể phá vỡ mọi thứ khác nhau (hoặc chỉ sử dụng util-linuxcho mọi thứ).
Graeme

Nó sử dụng linux ở đây, nhưng những công cụ này - lsblk mới, blockdev, findmnt - tất cả đều được đưa vào khoảng 3.6 hoặc hơn tôi nghĩ vậy. Tuy nhiên, chúng vẫn tồn tại đủ lâu để trang chủ của mount nói với chúng tôi sử dụng chúng - thay vì nó, không ít hơn - vì vậy có lẽ bạn cần cập nhật?
mikeerv

1

Hãy thử lệnh này

df -Ph | awk '{print $2, $3, $4, $5}'

1
Bạn có thể (và nên) sử dụng df -Pđể chặn các ngắt dòng.
n.st

0

Thử đi:

$ df -h | awk 'NR==1{next}{for(i=2;i<NF;i++){printf("%s\t",$i)};print""}'
92G     5.2G    82G     6%  
2.9G    4.0K    2.9G    1%  
1.2G    932K    1.2G    1%  
5.0M    0       5.0M    0%  
2.9G    700K    2.9G    1%  
360G    53G     289G    16% 

Tôi đánh giá cao câu trả lời của bạn, nhưng dòng cuối cùng của tôi đang tạo ra vấn đề. nó mang lại cho tôi "7.8T 2.3T 78% / CGFBKUP1" thay vì "10T 7.8T 2.3T 78%". Đó là vấn đề chính của tôi, nếu không tôi có thể đã sử dụng "df -h | awk {'in $ 2, $ 3, $ 4, $ 5'}"
Abhishek dot py
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.