Lưu trữ đầu ra của lệnh vào mảng


23

Đây là lệnh: pdc status -a 2>&1 | grep 'okay'Nó cho đầu ra sau

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

Tôi đã viết lệnh này trong tập tin shell scrip. Nhưng tôi muốn lưu trữ đầu ra của lệnh này vào mảng để xử lý một số giá trị chỉ mục trong mảng.

Làm thế nào tôi có thể lưu trữ đầu ra của lệnh này vào mảng?

Câu trả lời:


24

Nếu bạn chỉ muốn các số ở cuối mỗi dòng:

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

Nếu bạn muốn lưu trữ từng dòng vào mảng

mapfile -t lines < <(pdc ...)

Để lấy dữ liệu từ các mảng:

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
Lỗi cú pháp: chuyển hướng bất ngờ, khi tôi sử dụngmapfile -t array < <(grep.....)
Sachith Muhandiram

Bạn đang sử dụng bash hoặc một số vỏ khác?
glenn jackman

20

Trước hết, bạn không nhất thiết cần mảng, để xử lý dòng đầu ra theo dòng bạn có thể làm:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

Nếu bạn cần mảng, Glenn Jackman đã cung cấp cho bạn cách tốt nhất để làm điều đó nhưng đây là một cách tiếp cận khác:

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

Giải trình:

  • $IFS=$'\n': $IFSdấu tách trường đầu vào của bash , chỉ đặt nó thành ký tự dòng mới ( \n) đảm bảo rằng các dòng đầu ra của bạn sẽ không bị phân tách trên khoảng trắng để bạn có thể lưu mỗi dòng thành một thành phần mảng riêng biệt. Không có điều này, mỗi từ của đầu ra lệnh của bạn sẽ là một yếu tố khác nhau.

    Tùy thuộc vào những gì bạn muốn làm, có thể là một ý tưởng tốt để lưu giá trị cũ $IFSvà khôi phục nó sau khi mảng được đọc:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Đây được gọi là thay thế lệnh và cho phép bạn lưu đầu ra của lệnh trong một biến. Có hai cách để làm điều này:

    var=$(command)

    var=`command`

    Trong hai, $()tốt hơn là vì:

    • Nó có thể xử lý các lệnh lồng nhau:

      var=$(command1 $(command 2))

      Ví dụ var=$(cat $(find ~/))

    • Nó có ít vấn đề hơn với trích dẫn và kết quả trong cú pháp sạch hơn. Xem ở đây để biết thêm.


6

Một cách khác trực quan hơn bằng cách sử dụng readarraynội dung (xem help -m readarray):

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

Tiếp theo, để in một phần tử mảng, giả sử phần tử thứ hai, bạn có thể sử dụng:

echo "${array[1]}"

Để in tất cả các thành phần mảng trên các dòng riêng biệt, bạn có thể sử dụng:

printf -- "%s\n" "${array[@]}"
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.