Xin lưu ý rằng tr -s ' '
tùy chọn này sẽ không loại bỏ bất kỳ khoảng trắng đầu nào. Nếu cột của bạn được căn phải (như với ps
pid) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
Sau đó, việc cắt sẽ dẫn đến một dòng trống cho một số trường đó nếu đó là cột đầu tiên:
$ <previous command> | cut -d ' ' -f1
19645
19731
Trừ khi bạn đặt trước nó bằng một khoảng trắng, rõ ràng
$ <command> | sed -e "s/.*/ &/" | tr -s " "
Bây giờ, đối với trường hợp cụ thể của số pid (không phải tên), có một hàm được gọi là pgrep
:
$ pgrep ssh
Các chức năng của vỏ
Tuy nhiên, nói chung vẫn có thể sử dụng các hàm shell một cách ngắn gọn, bởi vì có một điều gọn gàng về read
lệnh:
$ <command> | while read a b; do echo $a; done
Tham số đầu tiên để đọc, a
chọn cột đầu tiên và nếu có nhiều hơn, mọi thứ khác sẽ được đưa vào b
. Do đó, bạn không bao giờ cần nhiều biến hơn số cột +1 của mình .
Vì thế,
while read a b c d; do echo $c; done
sau đó sẽ xuất ra cột thứ 3. Như đã nêu trong nhận xét của tôi ...
Một lần đọc theo đường ống sẽ được thực thi trong một môi trường không chuyển các biến cho tập lệnh gọi.
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
Giải pháp mảng
Vì vậy, sau đó chúng tôi kết thúc với câu trả lời của @frayser là sử dụng biến shell IFS mặc định là một khoảng trắng, để chia chuỗi thành một mảng. Nó chỉ hoạt động trong Bash. Dash và Ash không hỗ trợ nó. Tôi đã gặp khó khăn khi tách một chuỗi thành các thành phần trong một thứ Busybox. Thật dễ dàng để lấy một thành phần duy nhất (ví dụ: sử dụng awk) và sau đó lặp lại điều đó cho mọi tham số bạn cần. Nhưng sau đó bạn liên tục gọi awk trên cùng một dòng hoặc liên tục sử dụng khối đọc có echo trên cùng một dòng. Cái nào không hiệu quả hoặc không đẹp. Vì vậy, bạn kết thúc việc chia nhỏ bằng cách sử dụng ${name%% *}
và như thế. Khiến bạn khao khát một số kỹ năng Python vì trên thực tế, viết kịch bản shell không còn thú vị nữa nếu một nửa hoặc nhiều tính năng bạn quen thuộc đã biến mất. Nhưng bạn có thể giả định rằng ngay cả python cũng sẽ không được cài đặt trên hệ thống như vậy và nó không phải vậy ;-).