Как я могу grep для значения из переменной оболочки? - PullRequest
4 голосов
/ 16 февраля 2010

Я пытался получить точную 'переменную' оболочки, используя границы слов,

grep "\<$variable\>" file.txt

но не сумели; Я пробовал все остальное, но не удалось.

На самом деле я вызываю grep из сценария Perl:

$attrval=`/usr/bin/grep "\<$_[0]\>" $upgradetmpdir/fullConfiguration.txt`

$_[0] и $upgradetmpdir/fullConfiguration.txt содержат соответствующий текст "

.

Но $attrval пуст после операции.

Ответы [ 8 ]

4 голосов
/ 17 февраля 2010

@ OP, вы должны сделать это 'grepping' в Perl. не вызывайте системные команды без необходимости, если нет выбора.

$mysearch="pattern";
while (<>){
 chomp;
 @s = split /\s+/;
 foreach my $line (@s){
    if ($line eq $mysearch){
      print "found: $line\n";
    }
 }
}
1 голос
/ 16 февраля 2010

Не каждый grep поддерживает синтаксис границы слова ex (1) / vi (1).

Я думаю, я бы просто сделал:

grep -w "$variable" ...
1 голос
/ 16 февраля 2010

Я не вижу здесь проблемы:

file.txt:

hello
hi
anotherline

Теперь

mala@human ~ $ export GREPVAR="hi"
mala@human ~ $ echo $GREPVAR
hi
mala@human ~ $ grep "\<$GREPVAR\>" file.txt 
hi

Что именно у вас не работает?

0 голосов
/ 25 июня 2013

Использование одинарных кавычек не будет работать. Вы должны пойти на двойную кавычку

Например:

this wont work
--------------
for i in 1
do
grep '$i' file
done

this will work
    --------------
    for i in 1
    do
    grep "$i" file
    done
0 голосов
/ 16 февраля 2010

Скажем, у вас есть

$ cat file.txt
This line has $variable
DO NOT PRINT ME! $variableNope
$variable also

Затем с помощью следующей программы

#! /usr/bin/perl -l

use warnings;
use strict;

system("grep", "-P", '\$variable\b', "file.txt") == 0
  or warn "$0: grep exited " . ($? >> 8);

вы получите вывод

This line has $variable
$variable also

Он использует переключатель -P для GNU grep , который соответствует регулярным выражениям Perl. Эта функция все еще является экспериментальной, поэтому действуйте осторожно.

Также обратите внимание на использование system LIST, которое обходит кавычки оболочки, позволяя программе указывать аргументы с правилами цитирования Perl, а не с оболочкой.

Вы можете использовать переключатель -w (или --word-regexp), как в

system("grep", "-w", '\$variable', "file.txt") == 0
  or warn "$0: grep exited " . ($? >> 8);

чтобы получить тот же результат.

0 голосов
/ 16 февраля 2010

На последнем linux он работает как положено. Могу попробовать egrep вместо

0 голосов
/ 16 февраля 2010

Если variable=foo вы пытаетесь grep для "foo"? Если так, это работает для меня. Если вы пытаетесь grep для переменной с именем $ variable, измените кавычки на одинарные.

0 голосов
/ 16 февраля 2010

Использование одинарных кавычек работает для меня в tcsh:

grep '<$variable>' file.txt

Я предполагаю, что ваш входной файл содержит буквенную строку: <$variable>

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