Поиск (с помощью grep) в файле с переменной, содержащей точку - PullRequest
0 голосов
/ 14 мая 2018

A имеет файл myFile.txt с 3 столбцами:

amy. A B
amy5 B A
amy.smit F P
smit_rees C D

Необходимо написать скрипт bash, который получает значение из второго столбца, где первый столбец содержит значение переменной var .

Проблема в том, что когда я выполняю

var='amy.'
grep "$var" myFile.txt | awk '{ print $2 }'

результат будет:

A
B
F

Но реальный результат должен содержать только A . Первый столбец похож на имя пользователя и может содержать точки.Как я могу избежать специальных символов в моей переменной или как-то сказать по grep не относиться к ним как к специальным.

Я читаю о флаге -F, но затем grep match amy.smit и amy.smit lines.

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Вы, похоже, хотите сделать прямое сравнение строк, а не совпадение с регулярным выражением.

С awk:

awk -v string="$var" '$1 == string { print $2 }' myFile.txt

Для данных и с var='amy.', это вернуло бы только A.

0 голосов
/ 14 мая 2018

Попробуйте это:

grep -F "^$var " myFile.txt | awk '{ print $2 }'

Вы знаете, что после первого поля есть хотя бы пробел. Итак, я думаю, что это законный пропуск "^$var " (с пробелом) в grep.

У меня это сработало.

0 голосов
/ 14 мая 2018

Если ваш вариант использования касается только символа ., я бы просто преобразовал шаблон, чтобы удалить специальное значение .:

var='amy.'; var=`echo $var | sed 's/\./\\\./g'`; grep "$var " inputfile

Это приводит к тому, что $ var будет amy\.

grep для пробела после $ var, с "$var ", для ответа @ ninosanta также хорошая идея.

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

0 голосов
/ 14 мая 2018

со страницы руководства grep:

-w, --word-regexp

Выберите только те строки, которые содержат совпадения, которые образуют целые слова.

$ grep -Fw "$var" myFile.txt | awk '{ print $2 }'
A

Кроме того, даже если мы отключим глобализацию set -f перед запуском grep, нам все равно необходимо явно указать переключатель -F для grep, чтобы строка не воспринималась как регулярное выражение.

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