开发者

How can I grep for a value from a shell variable?

I've been trying to grep an exact shell 'variable' using word boundaries,

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

but haven't managed to; I've tried everything else but haven't succeeded.

Actually I'm invoking grep from a Perl script:

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

$_[0] and $u开发者_如何学Pythonpgradetmpdir/fullConfiguration.txt contains some matching "text".

But $attrval is empty after the operation.


@OP, you should do that 'grepping' in Perl. don't call system commands unnecessarily unless there is no choice.

$mysearch="pattern";
while (<>){
 chomp;
 @s = split /\s+/;
 foreach my $line (@s){
    if ($line eq $mysearch){
      print "found: $line\n";
    }
 }
}


I'm not seeing the problem here:

file.txt:

hello
hi
anotherline

Now,

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

What exactly isn't working for you?


Not every grep supports the ex(1) / vi(1) word boundary syntax.

I think I would just do:

grep -w "$variable" ...


Using single quotes works for me in tcsh:

grep '<$variable>' file.txt

I am assuming your input file contains the literal string: <$variable>


If variable=foo are you trying to grep for "foo"? If so, it works for me. If you're trying to grep for the variable named "$variable", then change the quotes to single quotes.


On a recent linux it works as expected. Do could try egrep instead


Say you have

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

Then with the following program

#! /usr/bin/perl -l

use warnings;
use strict;

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

you'd get output of

This line has $variable
$variable also

It uses the -P switch to GNU grep that matches Perl regular expressions. The feature is still experimental, so proceed with care.

Also note the use of system LIST that bypasses shell quoting, allowing the program to specify arguments with Perl's quoting rules rather than the shell's.

You could use the -w (or --word-regexp) switch, as in

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

to get the same result.


Using single quote it wont work. You should go for double quote

For example:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜