2014-11-26 2 views
2

Я пытаюсь найти несколько шаблонов (у меня есть файл из них) в нескольких файлах differents с большим количеством поддиров. Я пытаюсь использовать коды выхода для вывода всех найденных шаблонов (потому что мне нужны только те, которые НЕ найдены), но коды выхода не работают, как я их понимаю.найти несколько шаблонов в нескольких файлах bash

while read pattern; do 
    grep -q -n -r $pattern ./dir/ 
    if [ $? -eq 0 ]; then 
    : #echo $pattern ' exists' 
    else 
    echo $pattern " doesn't exist" 
    fi 
done <strings.tmp 
+0

Было бы полезно показать образец вашего файла 'strings.tmp'. Вы пытаетесь сопоставить шаблоны регулярных выражений или фиксированные строки? Как именно код не работает? Измените свой вопрос, чтобы предоставить эти данные. –

ответ

2

Вы можете использовать это в Баш:

while read -r pattern; do 
    grep -F -q -r "$pattern" ./dir/ || echo $pattern " doesn't exist" 
done < strings.tmp 
  • Использование read -r для безопасного чтения регулярных выражений шаблонов
  • Используйте процитировать "$pattern", чтобы избежать оболочки избежать
  • Нет необходимости использовать -n так вы используете -q (тихий) флаг
+0

Да, тх, команда работает сама по себе, но не работает в цикле. Я имею в виду, что это нормально, когда я беру несуществующий шаблон и проверяю его, но проверка его в цикле не работает. – stanjer

+0

Нет причин для того, чтобы он не работал в цикле. Показывать содержимое 'strings.tmp' в вопросе. – anubhava

+0

test.hello test2.world и подобные строки на каждой строке – stanjer

1

@ Решение anubhava должно работать. Если это не так, попробуйте следующее:

while read -r pattern; do 
lines=`grep -q -r "$pattern" ./dir/ | wc -l` 
if [ $lines -eq 0 ]; then 
    echo $pattern " doesn't exist" 
else 
    echo $pattern "exists" 
fi 
done < strings.tmp 
Смежные вопросы