2010-10-15 43 views
12

Phần tập lệnh sau đọc từng dòng trong $next. Nhưng khi tôi cố gắng để grep pattern đặc biệt tức là "MO" trong $next, sai số được hiển thị trên đầu ra tiêu chuẩn như:grep trong câu lệnh IF

grep: 40922|OPR: No such file or directory 
grep: MO: No such file or directory 
grep: 12345|OPR: No such file or directory 
grep: MO: No such file or directory 
grep: 12345|12345|202|local|LMNO: No such file or directory 

cat /home/scripts/$E1.out | while read next 
do 
i=`echo $next | awk -F"|" '{print($1)}'` 
j=`echo $next | awk -F"|" '{print($2)}'` 
k=`echo $next | awk -F"|" '{print($3)}'` 
l=`echo $next | awk -F"|" '{print($4)}'` 
m=`echo $next | awk -F"|" '{print($5)}'` 
n=`echo $next | awk -F"|" '{print($6)}'` 
o=`echo $next | awk -F"|" '{print($6)}'` 
if grep -q "MO" $next 
then echo "FOUND;" >> /home/scripts/sql.$E1.out 
else echo "NOT FOUND;" >> /home/scripts/sql.$E1.out 
fi 
done 

$E1.out file hình như:

40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO 
+0

Trên một lưu ý riêng biệt, bạn có thể tránh tất cả các lời gọi của awk bằng cách thay đổi đọc lệnh hơi: 'while IFS =" | " đọc i j k l m n o; do ... '(lưu ý rằng điều này chỉ đặt IFS cho lệnh đọc, vì vậy bạn không phải đặt lại sau). –

Trả lời

22

Đối số bạn vượt qua để grep, $next , đang được coi là danh sách tên tệp để tìm kiếm. Nếu bạn muốn tìm kiếm trong chuỗi đó, ví dụ: MO, thì bạn cần phải đặt nó vào một tệp và chuyển tệp đó dưới dạng đối số hoặc nhập nó vào thông qua đầu vào tiêu chuẩn.

Đây là một ví dụ mà bạn có thể thử trên dòng lệnh; tất nhiên, thay thế biến mà bạn đang sử dụng cho các giá trị văn chương mà tôi bao gồm để minh họa:

if echo "40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO" | grep -q "MO" 
    then echo "FOUND" 
    else echo "NOT FOUND" 
fi 
+0

Chúng ta không thể làm như: nếu echo "$ next" | grep -q "MO"? Tôi có nghĩa là tôi phải tìm kiếm từng dòng và có thể có nhiều dòng trong $ E1.out. – ErAB

+0

@Ashish Vâng, bạn có thể làm 'nếu echo" $ next "'. Như tôi đã nói, tôi đặt giá trị bằng chữ ở đó cho mục đích minh họa, nhưng thay vào đó bạn có thể đặt biến mà bạn đang sử dụng để giữ dòng hiện tại. –

3
if grep -q "MO" ${E1}.out then 
    echo "found" 
else 
    echo "not found" 
fi 
0
if tmux ls | grep -q "ABC"; then echo "1"; else echo "2"; fi 
+0

Thông thường tốt hơn là giải thích một giải pháp thay vì chỉ đăng một số hàng mã ẩn danh. Bạn có thể đọc [Làm cách nào để viết câu trả lời hay] (https://stackoverflow.com/help/how-to-answer) và [Giải thích toàn bộ câu trả lời dựa trên mã] (https://meta.stackexchange.com)/câu hỏi/114762/giải thích-hoàn toàn-% E2% 80% 8C% E2% 80% 8Bcode dựa trên câu trả lời). –

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