Làm thế nào để tạo lệnh ps hiển thị bộ nhớ trong mb thay vì kb?


11

Lệnh Linux ps hiển thị các cách sử dụng bộ nhớ khác nhau như rss, kích thước tính theo kb theo mặc định. Có cách nào để hiển thị trong mb hoặc gb như ls -s --human-readablekhông?


1
Việc thiếu đề cập trong man psgợi ý cho tôi rằng không có tùy chọn tích hợp như vậy.
Ulrich Schwarz

Câu trả lời:


20

AFAIK bạn không thể đạt được nó chỉ bằng pslệnh thuần túy với các tùy chọn. Tuy nhiên, bạn có thể sử dụng một số bộ xử lý văn bản như awkvà làm cho nó để làm những gì bạn muốn:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Điều này nhận kết quả từ psvà sau đó cho mỗi dòng ngoại trừ dòng đầu tiên nó thay thế cột thứ 5 trong KB thông thường, để MB thêm hậu tố M.

Bạn có thể biến nó thành bí danh và lưu trữ nó trong tệp .bashrc để bạn có thể gọi nó bằng một cái gì đó như myps.

Hầu hết mọi người đang hỏi làm thế nào để bảo tồn định dạng hoặc sử dụng các đơn vị và độ chính xác khác.

Đối với phiên bản đơn giản, bạn có thể sử dụng column -tbộ lọc đầu ra:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

Điều này tuy nhiên không nhận ra không gian trong cột cuối cùng một cách chính xác. Thật không may, chúng tôi đã phải đối phó với định dạng văn bản và chuẩn bị chuỗi printfđịnh dạng giống như định dạng của chúng tôi .

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Giải trình:

  • NR==1điều kiện chỉ dành cho dòng đầu tiên (tiêu đề). Chúng tôi đang sử dụng đầu ra ps ban đầu để xác định nơi bắt đầu điều khiển:
    • o=$0 lưu trữ toàn bộ dòng chưa sửa đổi để chúng tôi có thể sử dụng nó sau
    • a=match($0,$11) tìm vị trí của trường thứ 11 (phải là nơi cột LỆNH đang bắt đầu ở đầu ra ban đầu)
  • NR>1dành cho các dòng sau (dữ liệu). Chúng tôi đang thay đổi lĩnh vực thứ 5:
    • $5=int(10*$5/1024)/10"M" thay đổi giá trị thành Megabyte với một chữ số thập phân và thêm hậu tố "M".
    • printf hiển thị tất cả các trường trong hương vị giống như cột:
      • %-10scó nghĩa là scho chuỗi, 10cho 10 ký tự, -cho căn lề trái
      • %8scó nghĩa là scho chuỗi, 8cho 8 ký tự rộng và do không có -đầu ra của trường này được căn phải.
    • substr(o, a)lấy chuỗi con của dòng gốc (do đó ođược lưu trữ trước đó) bắt đầu từ vị trí được atính trong điều kiện trước đó, vì vậy chúng ta có thể có đầu ra lệnh được hiển thị với các khoảng trắng được bảo toàn.

3
Được sửa đổi cho GB và có 2 chữ số thập phân (ví dụ 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff

1
Có thể đạt được cùng một mục tiêu duy trì psđịnh dạng? Các tab hoàn toàn bị loại bỏ vớiawk
Chris

Tôi thấy bạn đang truyền dưới dạng int, có thể có số thập phân như 1,2M không?
JavaSheriff

Tại sao các tab bị thiếu?
Alex78191

@ Alex78191: Đã thêm lệnh thay thế để định dạng với đầu ra giống như bảng
DevilaN
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.