2010-10-15 4 views
12

Следующая часть скрипта считывает каждую строку в $next. Но когда я пытаюсь Grep определенный шаблон, т.е. "MO" в $next, ошибка выводится на стандартный вывод, как:grep в заявлении 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 для команды чтения, поэтому вам не нужно ее снова возвращать). –

ответ

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

+0

@Ashish Да, вы можете сделать 'if echo '$ next" '. Как я уже сказал, я помещаю буквальное значение для иллюстрации, но вместо этого вы можете поместить переменную, которую вы используете, чтобы удерживать текущую строку. –

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 на основе-ответы). –

Смежные вопросы