2011-07-18 27 views
6

đưa thêm một input stream với dòng sau:AWK: thực hiện CURL trên mỗi dòng và phân tích kết quả

123 
456 
789 
098 
... 

Tôi muốn gọi

curl -s http://foo.bar/some.php?id=xxx 

với xxx là số cho mỗi dòng, và mọi lúc để cho một tập lệnh awk lấy một số thông tin từ đầu ra curl được ghi vào luồng đầu ra. Tôi tự hỏi nếu điều này là có thể mà không sử dụng awk "hệ thống()" gọi theo cách sau:

cat lines | grep "^[0-9]*$" | awk ' 
    { 
     system("curl -s " $0 \ 
     " | awk \'{ #parsing; print }\'") 
    }' 
+0

Tôi thấy câu hỏi này thú vị trong các trường hợp đầu vào đến từ luồng "thực", không phải tệp. Ví dụ: thiết bị cảm biến tạo dữ liệu (đường) định kỳ, ví dụ: trên/dev/ttyUSB0. Trong những trường hợp như vậy, các câu trả lời được đề xuất (đọc từ một tệp) chỉ áp dụng nếu lưu trữ dữ liệu từ luồng một tệp tạm thời và định kỳ xử lý tệp (nếu dữ liệu đến khi xử lý?). Nhưng cách tiếp cận trực tiếp hơn (sử dụng đường ống) có thể tốt hơn ... –

+0

Ghi chú 'mèo | grep | awk' có thể được đơn giản hóa thành 'awk '/^[0-9] + $/{}' file'. Ngoài ra, bạn muốn làm loại phân tích cú pháp nào? Có lẽ nó không phải là cần thiết để sử dụng 'awk' ở tất cả và một 'while read' loop suffices. – fedorqui

Trả lời

0

Một vòng lặp vỏ sẽ đạt được một kết quả tương tự như sau:

#!/bin/bash 
for f in $(cat lines|grep "^[0-9]*$"); do 
    curl -s "http://foo.bar/some.php?id=$f" | awk '{....}' 
done 

phương pháp thay thế cho thực hiện các tác vụ tương tự bao gồm sử dụng Perl hoặc Python với một máy khách HTTP.

1

Bạn có thể sử dụng bash và tránh awk system gọi:

grep "^[0-9]*$" lines | while read line; do 
    curl -s "http://foo.bar/some.php?id=$line" | awk 'do your parsing ...' 
done 
0

Nếu tập tin của bạn được tự động nối của id, bạn có thể daemonize một while vòng nhỏ để liên tục kiểm tra để biết thêm dữ liệu trong file, như thế này:

while IFS= read -d $'\n' -r a || sleep 1; do [[ -n "$a" ]] && curl -s "http://foo.bar/some.php?id=${a}"; done < lines.txt

nếu không nếu nó tĩnh, bạn có thể thay đổi sleep 1-break và nó sẽ đọc các tập tin và bỏ khi không có lef dữ liệu t, khá hữu ích để biết làm thế nào để làm.

Các vấn đề liên quan