Nhiệm vụ đầu tiên là trích xuất tỷ lệ từ dòng đó. Với GNU grep (Linux không nhúng hoặc Cygwin), bạn có thể sử dụng -o
tùy chọn. Phần bạn muốn là phần chỉ chứa các chữ số và theo sau là một %
dấu hiệu. Nếu bạn không muốn giải nén %
chính nó, bạn cần một mẹo bổ sung: một xác nhận nhìn rộng bằng 0 , không khớp với gì ngoài chỉ khi không có gì được theo sau %
.
command1 -p=aaa -v=bbb -i=4 | grep -o -P '[0-9]+(?=%)'
Một khả năng khác là sử dụng sed. Để trích xuất một phần của dòng trong sed, sử dụng s
lệnh, với biểu thức chính phù hợp với toàn bộ dòng (bắt đầu bằng ^
và kết thúc bằng $
), với phần được giữ lại trong một nhóm ( \(…\)
). Thay thế toàn bộ dòng bằng nội dung của nhóm để giữ. Nói chung, chuyển -n
tùy chọn tắt in mặc định và đặt công cụ p
sửa đổi để in các dòng có nội dung cần trích xuất (ở đây có một dòng duy nhất để nó không thành vấn đề). Xem Return chỉ một phần của một dòng sau khi một mô hình phù hợp và Extracting một regex phù hợp với 'sed' mà không cần in các nhân vật xung quanh để biết thêm thủ thuật sed.
command1 -p=aaa -v=bbb -i=4 | sed 's/^.*rate(\([0-9]*\)%).*$/\1/'
Linh hoạt hơn so với sed, là awk. Awk thực hiện các hướng dẫn cho mỗi dòng trong một ngôn ngữ mệnh lệnh nhỏ. Có nhiều cách để trích xuất tỷ lệ ở đây; Tôi chọn các trường thứ hai (các trường được phân cách bằng khoảng trắng theo mặc định) và xóa tất cả các ký tự trong đó không phải là một chữ số.
command1 -p=aaa -v=bbb -i=4 | awk '{gsub(/[^0-9]+/, "", $2); print $2}'
Bước tiếp theo, bây giờ bạn đã trích xuất tỷ lệ, là chuyển nó làm đối số command2
. Các công cụ cho đó là một susbtlation lệnh . Nếu bạn đặt một lệnh bên trong $(…)
(dấu ngoặc đơn), đầu ra của nó được thay thế vào dòng lệnh. Đầu ra của lệnh được chia thành các từ riêng biệt ở mỗi khối khoảng trắng và mỗi từ được coi là một mẫu ký tự đại diện; trừ khi bạn muốn điều này xảy ra, hãy đặt dấu ngoặc kép xung quanh lệnh thay thế : "$(…)"
. Với dấu ngoặc kép, đầu ra của lệnh được sử dụng trực tiếp dưới dạng một tham số duy nhất (biến đổi duy nhất là các dòng mới ở cuối đầu ra được loại bỏ).
command2 -t "$(command1 -p=aaa -v=bbb -i=4 |
sed 's/^.*rate(\([0-9]*\)%).*$/\1/')"