2009-11-01 2 views
4

Я хочу использовать Grep с двумя переменными в сценарии оболочкиИспользование Grep с двумя переменными

var = match 

cat list.txt | while read word_from_list; do 
    grep "$word_from_list" "$var" >> words_found.txt 
done 

Но Grep ожидает получить файл в качестве второго входа:

Grep: матч: Нет такого файл или каталог

Как это можно решить?

+1

Что такое "var" Предпочитаемое представлять имя файла? –

+0

var должен представлять строку, которая найдена с помощью grep ранее в скрипте. –

+0

Вам нужно сказать больше о том, что вы пытаетесь сделать. var является частью вашего поиска, как и слова в list.txt, но какова взаимосвязь между ними в поиске и какой файл вы ищете? – PanCrit

ответ

1

Вы можете использовать задать расширенный (расширенный Grep), если вы хотите найти строки, содержащие оба слова на линии, вы можете использовать:

egrep "($word_from_list|$var)" 

Если вы имеете в виду строки, содержащие $ варов после $ word_from_list следующего может быть яснее:

cat list.txt | while read word_from_list; do 
    egrep "$word_from_list.*$var" >> words_found.txt 
done 

Подумайте об этом, на каком тексте вы действительно хотите grep? Stdin используется для списка слов, вы пропустили аргумент имени файла grep в своем примере?

3

Две вещи.

  1. Необходимо указать входной файл. Используйте - для стандартного ввода или подачи имени файла, в любом случае это второй параметр.
  2. После этого есть несколько способов получить логическое значение и через grepping. Самый простой способ это изменить:

    Grep "$ word_from_list" "$ вар" >> words_found.txt

к:

grep "$word_from_list" - | grep "$var" >> words_found.txt 

В качестве альтернативы, вы можете использовать, который принимает задать расширенные в регулярном выражения. Чтобы получить логическое значение и условие, вы должны указать оба варианта заказа. . * Позволяет пробелы между словами.

egrep "($word_from_list.*$var)|($var.*$word_from_list)" >> words_found.txt 
7

Быстрое сканирование grep man page предполагает, что вы можете использовать -e для нескольких моделей, например.

grep -e "$word_from_list" -e "$var" 

Если вы нашли себя с большим количеством шаблонов, вы можете использовать опцию -f читать их из файла вместо этого.

+1

Он не просит нескольких шаблонов. Он хотел использовать одну переменную для рисунка и другую для ввода! –

2

Если у вас есть строковая переменная, которую вы хотите искать внутри для другой строки с помощью grep, сначала выполните эхо-строку в stdout, а затем используйте grep, как и в командной строке с помощью труб.

var = match 

cat list.txt | while read word_from_list 
do 
    echo "$word_from_list" | grep "$var" >> words_found.txt 
done 

или принять меры на матч

if [ -n "$(echo "$word_from_list" | grep "$var")" ] 
then 
    echo "$var" >> vars_found.txt 
fi 

Не забудьте тщательно процитировать переменную, передаваемую на стандартный вывод. Забывание кавычек устранит любые разрывы строк в строке (ложные срабатывания).Использование одинарных кавычек предотвратит замену переменной на ее значение.

0

Здесь мы предполагаем number.txt как фактический файл и checknum.txt содержат то, что будет искать,

можно искать с помощью «для»

# cat numbers.txt 
one ghi kjdf 
two dlfd ldlf 
three bnbbnb dddd 
four dddd 
asdf five 
# cat checknum.txt 
two 
five 
# for i in `cat checknum.txt` ; do grep $i numbers.txt ; done 
two dlfd ldlf 
asdf five 

Спасибо.

0

Попробуйте это. Это, вероятно, работает.

var='Match' 
cat list.txt | while read word_from_list 
do 
    echo $word_from_list | grep -Eq $var && echo $word_from_list >> words_found.txt 
done