Использование grep с двумя переменными - PullRequest
5 голосов
/ 01 ноября 2009

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

var = match

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

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

grep: match: нет такого файла или каталога

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

Ответы [ 6 ]

6 голосов
/ 02 ноября 2009

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

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

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

3 голосов
/ 02 ноября 2009

Две вещи.

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

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

до:

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

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

egrep "($word_from_list.*$var)|($var.*$word_from_list)" >> words_found.txt
2 голосов
/ 16 июля 2012

Если у вас есть строковая переменная, в которой вы хотите найти другую строку, используя 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

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

1 голос
/ 01 ноября 2009

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

egrep "($word_from_list|$var)"

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

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

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

0 голосов
/ 17 декабря 2014

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

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
0 голосов
/ 18 октября 2013

Здесь мы принимаем 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

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...