2010-10-15 27 views
12

La siguiente porción de script lee cada línea en $next. Pero cuando trato de grep particular, el patrón es decir "MO" en $next, se muestra el error en la salida estándar como:grep en la instrucción 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 archivos se parece a:

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

En una nota aparte, puede evitar todas las invocaciones de awk cambiando la lectura comando ligeramente: 'mientras IFS =" | " leer i j k l m n o; do ... '(tenga en cuenta que esto solo establece IFS para el comando de lectura, por lo que no tiene que volver a configurarlo después). –

Respuesta

22

El argumento que se pasa en a grep, $next , se está tratando como una lista de nombres de archivos para buscar. Si desea buscar una cadena dentro de esa línea, por ejemplo, MO, debe colocarla en un archivo y pasar ese archivo como argumento o canalizarla a través de la entrada estándar.

Aquí hay un ejemplo que puedes probar en la línea de comandos; por supuesto, sustituir la variable que se está utilizando para el valor literal que he incluido para ilustrar:

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

¿No podemos hacer como: si echo "$ next" | grep -q "MO"? Quiero decir que tengo que buscar línea por línea y puede haber muchas líneas en $ E1.out. – ErAB

+0

@Ashish Sí, puedes hacer 'if echo" $ next "'. Como dije, puse el valor literal allí para fines de ilustración, pero en su lugar puede poner la variable que está usando para mantener la línea actual. –

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

Por lo general, es mejor explicar una solución en lugar de simplemente publicar algunas filas de código anónimo. Puede leer [Cómo escribo una buena respuesta] (https://stackoverflow.com/help/how-to-answer), y también [Explicar respuestas totalmente basadas en código] (https://meta.stackexchange.com/questions/114762/explaining-entirely-% E2% 80% 8C% E2% 80% 8B-based-answers-answers). –

Cuestiones relacionadas