2012-01-16 12 views
6

Tôi không chắc chắn tại sao chuyển hướng được cung cấp trong mã đó không hoạt động. Mỗi khi tôi chạy tập lệnh, tệp đầu ra luôn trống. Có ai có ý tưởng về điều đó không?Chuyển hướng đầu ra grep sang tệp

Cảm ơn.

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
FILES=`ls plugins/*source*.jar` 

for i in $FILES 
    do 
    # echo "Looking in $i ..." 
    unzip -p $i | grep -i $LOOK_FOR > output #> /dev/null 
    if [ $? == 0 ] 
    then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 
    fi 
    done 
+2

Để tham khảo trong tương lai, "không hoạt động" không phải là mô tả hay. Hãy cho chúng tôi biết cách * nó không hoạt động. –

+1

Có khả năng là * rất * liên quan đến bất kỳ câu hỏi nào trong tương lai mà bạn có thể có - giả sử bạn đưa lời khuyên của tôi đến với trái tim. Tôi đã không nói điều gì đó liên quan đến vấn đề bởi vì nó đã được trả lời. Đây là ý kiến ​​cho những gì. Tôi thực sự đang cố gắng giúp bạn ở đây. Hãy xem xét khả năng tôi có thể có một điểm hợp lệ. –

+1

@fabricemarcelin: đăng nhận xét * là * tham gia vào cuộc thảo luận –

Trả lời

9

Bạn có thể muốn sử dụng >> (append) thay vì > (ghi đè) để chuyển hướng như:

unzip -p $i | grep -i $LOOK_FOR >> output #> /dev/null 

Vì bạn đang thực hiện lệnh này trong một vòng lặp và ghi đè lên tập tin output mọi thời gian, nó có thể để trống vào cuối nếu lệnh cuối cùng với grep không tìm thấy bất kỳ dòng khớp nào trong đầu ra giải nén.

+0

Tuyệt vời, nó hoạt động như một sự quyến rũ. Tôi hoàn toàn không nghĩ về điều đó. Cảm ơn – fabricemarcelin

+0

Bạn đang chào đón, vui mừng vì nó đã làm việc cho bạn. – anubhava

3

Bạn có ba vấn đề

  1. Đừng cố gắng để phân tích đầu ra của ls. Thay vào đó, chỉ sử dụng for i in plugins/*source*.jar Lý do chính là tập lệnh của bạn sẽ hoàn toàn phá vỡ hoàn toàn bất kỳ tệp nào có dấu cách trong tên của chúng. Xem this link cho một kinh cầu nguyện của lý do tại sao không để phân tích ls
  2. Bạn cần phải sử dụng >> thay vì > vì sau đó sẽ ghi đè lên các tập tin đầu ra trên mỗi lần lặp của vòng lặp. Trước đây sẽ nối thêm vào số
  3. Sử dụng thêm dấu ngoặc kép! Bạn sẽ muốn báo các biến của mình để đảm bảo chúng không bị tách từ

Ngoài ra, bạn có thể thử nghiệm if. Vì vậy, đặt nó tất cả cùng nhau chúng ta có:

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
for i in plugins/*source*.jar 
do 
    # echo "Looking in $i ..." 
    if unzip -p "$i" | grep -i "$LOOK_FOR" >> output #> /dev/null 
    then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 
    fi 
done 
+0

Cảm ơn lời khuyên, tôi sẽ xem xét điều đó. – fabricemarcelin

+2

Vì đây là việc tìm kiếm nhiều tệp nhưng làm như vậy mỗi lần, đầu ra 'grep' như được hiển thị sẽ không chứa tên tệp xác định tệp nào mà mỗi dòng đến. Đôi khi bạn có thể sửa lỗi đó bằng cách thêm '/ dev/null' vào dòng lệnh' grep'; Thật không may, đây không phải là một trong những dịp đó. Bạn cần phải thêm: '| sed "s% ^% $ i:%" 'trước khi chuyển hướng' >> '. –

+0

@JonathanLeffler Ý tưởng hay nhưng trong trường hợp này tôi sẽ đề nghị chỉ sử dụng cờ '-l' cho' grep' – SiegeX

0

Thay vì một for loop và một if conditional bạn có thể làm tất cả mọi thứ trong một find lệnh

find /path/to/plugins -name "*source*.jar" -exec sh -c 'unzip -l "{}" | grep -q DefaultProblem' \; -print 
+0

Ngay cả khi sử dụng đầu ra 'tìm' cũng sẽ phá vỡ với các tệp có dấu cách trong tên của chúng. Cách khắc phục điều này là thông qua cờ '-print0' tới' find' và vòng lặp 'while IFS = -r -d '' line' với bash bằng cách sử dụng thay thế tiến trình. Hoặc tốt hơn là sử dụng globstar của Bash 4 – SiegeX

+0

True… Câu trả lời của bạn thực sự bao gồm tất cả các vấn đề tiềm ẩn. Ill đi trước và xóa của tôi. :) –

+0

@SiegeX Đã sửa đổi câu trả lời để cung cấp một cái gì đó mới. –

2

Bạn có thể chuyển hướng đầu ra của toàn bộ vòng lặp:

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
FILES=`ls plugins/*source*.jar` 

for i in $FILES ; do 
    # echo "Looking in $i ..." 1>&2 
    unzip -p $i | grep -i $LOOK_FOR 
    if [ $? == 0 ] ; then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 1>&2 
    fi 
done > output 

Lưu ý rằng tôi đã chuyển hướng thư chẩn đoán đến stderr.