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


41

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 corrospond trực tiếp (trong trường hợp này) mẫu URL như http://example.com/persons/bob.tar, john.tar, sue.tar.

Tôi muốn lấy những dòng này và chạy 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ừ dấu nhắc (giả sử tôi muốn chỉ đơn giản lặp lại từng dòng như thế cat file | xargs echo $PARAM) hoặc từ tập lệnh bash.


Tôi không hoàn toàn làm theo câu hỏi, xin lỗi. Đặc biệt tôi không chắc chắn "Tôi không biết những gì được truyền cho lệnh đang được thực thi" nghĩa là gì
Michael Mrozek

1
@Michael: Khi bạn chạy một danh sách thông qua xargsnó sẽ chia nó theo dòng và đưa từng dòng vào một lệnh, phải không? Làm thế nào để tôi truy cập mà nếu tôi cần phải nói một cái gì đó như thế cat file | xargs curl http://example.com/[PASSED FROM FILE].tarnào?
Josh K

Câu trả lời:


70

Câu trả lời của Michael 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.tar john.tar. sue.tarnhư 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

1
Tuy nhiên, trong một ví dụ về tập tin của tôi, nó có thể không lý tưởng, tuy nhiên,cat xaa xab xac xad ... xargs ...
Josh K

10
@Josh Vì một số lý do, mọi người có xu hướng sử dụng mèo không cần thiết thực sự nghiêm túc ở đây; Tôi đã bị hạ cấp cho nó hai lần bây giờ
Michael Mrozek

2
cho hồ sơ, bạn đã nhận được +1 từ tôi. Tôi nghĩ rằng việc sử dụng catlà thực sự tốt, chỉ muốn thêm thông tin ... :)
Stefan

Chắc chắn nó phải là xargs -I % curl …( tùy chọn xargs trước curlvà các tùy chọn / đối số của nó). Ít nhất xargs curl -I %(trong đó -I %có nghĩa là một tùy chọn cho xargs , không phải curl ) là không di động.
Chris Johnsen

@Chris, bắt đẹp, tnx. đã sửa.
Stefan

16

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, -Icờ có một replacement-stringđối số; xargssau đó sẽ thay thế replacement-stringtrong lệnh bằng dòng đọc từ stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

Được rồi, thế nào curl http://example.com/foobar.tar > foobar.tar?
Josh K

2
@Josh K: >là một cấu trúc shell và sẽ không hoạt động xargs. Mặt khác, curl -osẽ ghi vào một tệp có tên thay vì thiết bị xuất chuẩn, giống như những gì wgethiện có, vì vậy đó có lẽ là những gì bạn muốn sử dụng ở đây.
ephemient

9
$ man xargs
...
       --arg-file = tập tin
       -một tập tin
              Đọc các mục 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 thiết lập --delimiter=/ -dđến '\n'là tốt.


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 's #. * # http: //example.com/persons/&.tar#' tệp

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


8

một cách khác với shell looping:

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


2
Bạn đã rơi vào một trong những sai lầm ngớ ngẩn cổ điển ! <- liên kết bị hỏng, đây là phiên bản được lưu trong bộ nhớ cache: Giải thưởng sử dụng mèo vô dụng .
Sorpigal

@Sorpigal Url đó bị hỏng. 'Lỗi kinh điển' là gì?
starbeamrainbowlabs 13/07/2015

@starbeamrainbowlabs - việc sử dụng mèo vô dụng, tôi đã đặt một phiên bản được lưu trong bộ nhớ cache của liên kết đó trong nhận xét ở trên.
slm

@starbeamrainbowlabs: Tôi đặc biệt liên kết với Backticks nguy hiểm , nhưng việc sử dụng mèo cũng không cần thiết nếu bạn thay đổi cấu trúc trong một thời gian:while IFS= read i ; do curl ... ; done < file
Sorpigal 14/07/2015


1

while read VAR; do ... done vòng lặp đơn giản nhưng rất linh hoạt:

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

0

Đâ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
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.