Làm thế nào để có được một chuỗi con từ lệnh bash


8

Cho chuỗi con sau được cho từ lệnh df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Tôi muốn trích xuất 195297177274%từ chuỗi đó, để sử dụng nó trong tập lệnh bash.

Tôi biết tôi có thể sử dụng một số lệnh cắt hoặc một cái gì đó, nhưng nó sẽ không hoạt động nữa nếu kích thước thay đổi, ví dụ.

Tôi cũng đã có suy nghĩ về việc sử dụng regex hoặc một cái gì đó, nhưng tôi muốn có cách tiếp cận được khuyến nghị nhất.

Cảm ơn trước!


2
Bạn đang hỏi về trường hợp chung, hay nói dfriêng? Nếu sau này, bạn có thể xác định các lĩnh vực sản xuất đặc biệt một cách rõ ràng ví dụdf --output=pcent /dev/sdb1
steeldriver

2
Bạn đang sử dụng cutvị trí ký tự trên dòng khiến nó bị lỗi khi độ dài dòng thay đổi với sự dao động về kích thước tệp. Tôi tin rằng bạn có thể yêu cutcầu chọn cột 2và cột 5được phân định bằng khoảng trắng nhưng tôi đang nghe điện thoại và không thể nghiên cứu và đăng câu trả lời một cách hiệu quả.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix Số lượng khoảng trắng có thể thay đổi, vì vậy thật khó để biết số cột nào là chính xác. cutsẽ thấy một cột sau mỗi dấu phân cách.
mook765

Tôi nghĩ rằng hai hoặc nhiều không gian liền kề vẫn được tính là một không gian duy nhất để phân định các cột tôi nghĩ
WinEunuuchs2Unix

@ WinEunuuchs2Unix đúng :) Tôi các lệnh từ tệp văn bản tôi có trong tay: D
Rinzwind

Câu trả lời:


6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

cho tỷ lệ phần trăm và

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

cho kích thước.

Không có tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    lấy cột thứ 2 trong đó nhiều dấu phân cách được tính là 1. Vì vậy, cột thứ 2 luôn giống nhau cho hệ thống của bạn cho phần 1 của lệnh.

  • NR cung cấp cho bạn tổng số hồ sơ đang được xử lý hoặc số dòng.


1
Hoặc nếu bạn cần cả hai trong một dòng df /home | awk '{print $2; print $5;}'.
Videonauth

3
Awk giữ dòng cuối cùng trong ENDkhối vì vậy thay vì tailchỉ sử dụngawk 'END { print $2,$5}'
Kevin

Tên tôi đã bỏ bạn trong Meta :) meta.askubfox.com/questions/18584/ory
WinEunuuchs2Unix

8

Chỉnh sửa câu trả lời

Như @kevin đã nêu, bạn chỉ có thể sử dụng awkđể chọn dòng cuối cùng và tránh sử dụng đuôi bằng cách sử dụng ENDvà nếu bạn muốn in hai cột cùng một lúc, bạn có thể làm điều này:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Câu trả lời gốc

Bạn chỉ có thể chọn các cột thứ 2:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Trong đó $2chỉ ra vị trí của các cột tách TAB. Bạn có thể sử dụng cutvì nó chỉ xử lý một lần xuất hiện của TAB và ở đây có nhiều TAB để phân định một cột.


3
Awk giữ dòng cuối cùng trong ENDkhối vì vậy thay vì tailchỉ sử dụngawk 'END { print $2,$5}'
Kevin
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.