it-swarm-vi.com

Sử dụng xargs với đầu vào từ một tập tin

Nói rằng tôi có một tập tin với những điều sau đây

bob
john
sue

Bây giờ những mẫu này trực tiếp ăn mòn (trong trường hợp này) mẫu URL, chẳng hạn như http://example.com/persons/bob.tar, john.tar, sue.tar.

Tôi muốn lấy các dòng này và chạy chúng qua xargs. Tôi không biết những gì được truyền cho lệnh đang được thực thi mặc dù. Làm cách nào để tôi truy cập tham số từ Lời nhắc (nói rằng tôi muốn chỉ đơn giản lặp lại từng dòng như cat file | xargs echo $PARAM) hoặc từ một tập lệnh bash.

44
Josh K

Michael's câu trả lời là đúng, và nên giải quyết vấn đề của bạn. Đang chạy

cat file | xargs -I % curl http://example.com/persons/%.tar

sẽ tải tập tin bob.tarjohn.tar.sue.tar như mong đợi.

[~ # ~] nhưng [~ # ~] : con mèo ở đây là vô dụng

thay vì sử dụng:

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

Tôi nghĩ rằng bạn đang hỏi làm thế nào để chèn các dòng riêng lẻ được kéo từ xargs 'stdin vào giữa một lệnh, thay vì chỉ dán nó ở cuối luôn. Nếu vậy, cờ -I Lấy đối số replacement-string; xargs sau đó sẽ thay thế replacement-string trong lệnh bằng dòng được đọc từ stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
[.__.] $ man  xargs  [.__.] ... [.___ từ tập tin thay vì đầu vào tiêu chuẩn. Nếu bạn sử dụng tùy chọn [.__.], Stdin vẫn không thay đổi khi các lệnh được chạy. Khác - [.__.] Khôn ngoan, stdin được chuyển hướng từ /dev/null.[.__.[...[.__.]

Bạn có thể muốn đặt --delimiter=/-d đến '\n' cũng.


Mặt khác, nếu bạn chỉ cố gắng biến mỗi dòng trong tệp thành một URL,

[.__.] $  sed  -e #. * # http: //example.com/persons/&.tar# 'tệp [.__.]

sẽ làm, và nếu bạn muốn tìm nạp tất cả chúng, chỉ cần đưa nó vào | wget -i.

9
ephemient

một cách khác với vòng lặp Shell:

for i in `cat file`; do curl -I http://foo.com/$i; done

bạn cũng có thể chạy mỗi lần lặp trong nền bằng cách nối thêm & trước dấu chấm phẩy cuối cùng - đối với các lượt tải rất lớn, điều này có thể hữu ích

8
Brad Clawsie

Với GNU Song song bạn có thể làm:

cat urls | parallel curl {} ">" {/}

Hoặc là:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

Xem video giới thiệu cho GNU Song song để tìm hiểu thêm: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop đơn giản nhưng rất linh hoạt:

while read Word; do wget http://example.com/persons/$Word; done < file
1
musiphil

Đây là phiên bản chung hơn của câu trả lời của Stefan: nhưng tôi đang sử dụng awk ở giữa để chuẩn bị "chuỗi" chính xác mà tôi muốn xargs thực thi. Và sau đó xargs đang sử dụng bash để thực hiện "công việc" thực tế.

Ví dụ này hơi quá mức cần thiết, nhưng đây là một giải pháp chung mà với một số sửa đổi có thể giải quyết nhiều vấn đề ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan