Cách hiệu quả nhất để grep cho hai thứ hoàn toàn riêng biệt và gán các giá trị cho các biến riêng biệt là gì?


8

CentOS 6.x

Tôi muốn lấy đầu ra từ curl, grep cho hai chuỗi hoàn toàn riêng biệt và gán giá trị tương ứng của chúng làm biến. Cách hiệu quả nhất để làm điều này (mà không ghi đầu ra vào đĩa) là gì?

Thông thường tôi sẽ nghĩ đến việc có một kịch bản với nội dung như:

#!/usr/bin/env bash
foo1=$(curl https://domain.com/file.xml | grep string1)
foo2=$(curl https://domain.com/file.xml | grep string2)

Nhưng điều này kết thúc bằng hai đường chuyền và không hiệu quả khủng khiếp. Có cách nào tốt hơn? Hy vọng một giải pháp liên quan đến ít vượt qua?

Câu trả lời:


10

1. Cắt thành 1 biến

Thử cái này:

foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")

Điều này sẽ chạy curl1 lần và grep cho các lần xuất hiện của string1hoặc string2.

2. Cắt thành 2 biến

Nếu chúng là các biến khác nhau thì thay đổi chiến thuật một chút. Nắm bắt đầu ra curlvà sau grepđó.

output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")

3. Cắt thành một mảng

Bạn cũng có thể lưu trữ kết quả trong một mảng thay vì các biến riêng biệt.

output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")

Đây là một mẹo nhỏ để xử lý nếu kết quả của bạn từ grep có thể không trả về kết quả, vì kết quả từ "chuỗi2" có thể là mục đầu tiên hoặc thứ hai trong mảng, nhưng tôi cung cấp nó ở đây chỉ như một minh chứng Tiếp cận.

4. Đọc vào vars từ grep

Một phương thức khác sử dụng readlệnh cùng với quá trình thay thế ( <( ..cmd..)).

$ read -d"\n" foo1 foo2 \
   <(curl https://domain.com/file.xml | grep -E "string1|string2")

Điều này một lần nữa có thể khó khăn nếu tìm kiếm "chuỗi1" không trả về kết quả nào, khiến bất kỳ kết quả khớp nào cho "chuỗi2" hiển thị $foo1. Ngoài ra, cách tiếp cận này có xu hướng ít di động hơn so với # 2 hoặc # 3 ở trên.


Lấy làm tiếc! Tôi đã có một lỗi đánh máy. Các biến thực sự khác nhau. :-( Tóm tắt hiện đã được cập nhật.
Mike B

Bạn có thể muốn lưu ý rằng quá trình thay thế mà bạn đề xuất khác xa với tùy chọn di động.
mikeerv

@mikeerv - cảm ơn đã phản hồi, cập nhật.
slm

3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

Nghiêm túc mà nói, anh bạn, có hàng triệu cách để lột da con mèo này.

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.