2010-10-15 104 views
12

以下腳本部分讀取$next中的每一行。但是,當我嘗試用grep即"MO"特定的模式在$next,顯示在標準輸出誤差爲:grep in 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文件看起來像:

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

在一個單獨的說明,您可以避免AWK的所有調用通過改變讀稍微命令:'而IFS =「|」閱讀i j k l m n o; do ...'(注意這只是爲讀命令設置IFS,所以你不必在之後設置它)。 – 2010-10-15 20:17:13

回答

22

你傳遞給grep的說法,$next ,正在被視爲要通過搜索的文件名列表。如果您想在該行內搜索字符串,例如MO,那麼您需要將其放入文件並將該文件作爲參數傳遞,或者通過標準輸入將其傳入。

下面是一個可以在命令行上試用的例子;當然,代替您使用的文字值的變量,包括我來說明:

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

我們不能這樣做:if echo「$ next」| grep -q「MO」?我的意思是我必須逐行搜索,$ E1.out中可能有很多行。 – ErAB 2010-10-15 16:28:59

+0

@Ashish是的,你可以做'如果回聲'$ next「'。正如我所說的,爲了說明的目的,我把字面值放在那裏,但是你可以把你用來保存當前行的變量放進去。 – 2010-10-15 16:30:27

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

通常最好是解釋一個解決方案,而不是隻發佈一些匿名代碼行。你可以閱讀[我如何寫一個好的答案](https://stackoverflow.com/help/how-to-answer),還有[完全解釋基於代碼的答案](https://meta.stackexchange.com /問題/ 114762 /解釋-entirely-%E2%80%8C%E2%80%8Bcode基於-答案)。 – 2017-08-22 11:14:55