2010-09-02 36 views
9

Tôi đang cố gắng sử dụng một tệp chứa địa chỉ IP làm cơ sở để tìm kiếm thông qua tệp cấu hình tường lửa của Cisco. Thông thường, tôi sẽ sử dụng một cái gì đó như:Cách grep một tập tin bằng cách sử dụng các tham số tìm kiếm từ một tập tin khác

for i in $(cat ip.file); do grep $i fw.config; done 

Nhưng thực hiện điều đó hoàn toàn không có gì. Nếu tôi đưa kịch bản trên vào một tập tin và thực hiện nó với bash -xv cờ, mỗi dòng trả về một cái gì đó như thế này:

+ for i in '`cat ip.file`' 
+ grep $'1.2.3.4\r' fw.config (each IP address is different) 

grep 1.2.3.4 fw.config là chính xác những gì tôi muốn xảy ra, nhưng tôi không nhận được gì từ lệnh này.

Tôi biết tùy chọn grep -f, nhưng điều đó cũng không trả về gì cả. Tôi không phải là một coder có kinh nghiệm, vì vậy tôi có thể nhìn thấy một cái gì đó hiển nhiên.

+0

này sẽ không giải quyết được vấn đề của bạn, nhưng bạn nên luôn luôn trích dẫn biến khi họ đang tranh luận với một lệnh. Bạn không nên sử dụng '--' để ngừng xử lý tùy chọn khi một trong các đối số cũng là một biến. 'grep -" $ i "fw.config' –

Trả lời

19

Có vẻ như ip.file ở định dạng DOS và có \r\n kết thúc dòng. Chạy dos2unix trên đó để chuyển đổi sang định dạng UNIX. Điều này sẽ loại bỏ các khoản trả về vận chuyển sai lệch \r bị rối tung lên grep.

Nhân tiện, bạn có thể sử dụng grep -f FILE để chuyển grep danh sách mẫu để tìm kiếm. Sau đó, nó sẽ thực hiện một lượt truy cập duy nhất để tìm kiếm bất kỳ mẫu nào trong số đó.

# After doing `dos2unix ip.file'... 
grep -f ip.file fw.config 

# Or... 
grep -f <(dos2unix < ip.file) fw.config 
+0

Phương pháp' -f' cũng có lợi thế là nó diễn giải mẫu tìm kiếm dưới dạng chuỗi đơn giản - ví dụ: các dấu chấm trong "1.2.3.4" sẽ chỉ phù hợp với dấu chấm, không phải bất kỳ ký tự nào. –

+0

Đây là câu trả lời. Danh sách các địa chỉ IP được grepped từ một tập tin vùng dns mà tôi tải về từ nhà cung cấp dns của tôi thông qua một trình duyệt web. Tôi không biết rằng nó ở định dạng dos. Nắm bắt tốt. Sau khi chạy dos2unix, grep -f làm việc như mong đợi. Cảm ơn. – Eric

5

GNU grep,

grep -f ip.txt config 

của nó nên cũng không để sử dụng cho vòng lặp với mèo. (Nếu bạn làm thế, bạn nên đổi IFS thành $ '\ n'). Sử dụng trong khi đọc vòng lặp thay thế.

while read -r line 
do 
    .... 
done <"ip.txt" 
+0

Sử dụng vòng lặp while cũng hoạt động tốt sau khi chạy dos2unix. – Eric

1
for i in $(tr '\r' '\n' < ip.file); do grep $i fw.config; done 
Các vấn đề liên quan