使用grep和两个变量

时间:2009-11-01 16:21:45

标签: grep

我想在shell脚本中使用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 个答案:

答案 0 :(得分:6)

快速扫描grep man page表示您可以将-e用于多种模式,例如

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

如果您发现自己拥有大量模式,则可能需要使用-f选项从文件中读取这些模式。

答案 1 :(得分:3)

两件事。

  1. 您需要指定输入文件。使用 - 用于标准输入或提供文件名,无论哪种方式,它都是第二个参数。
  2. 之后有几种方法可以获得布尔值和通过grepping。最简单的方法是改变:

    grep“$ word_from_list”“$ var”>> words_found.txt

  3. 为:

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

    或者,您可以使用带有正则表达式的egrep。要获得布尔值和条件,您必须指定两个排序情况。 。*允许单词之间的间隙。

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

答案 2 :(得分: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

不要忘记仔细引用您发送给stdout的变量。忘记引号将消除字符串中的任何换行符(误报)。使用单引号将阻止变量被其值替换。

答案 3 :(得分:1)

你可以使用egrep(扩展grep),如果你想在你可以使用的一行上搜索包含两个单词的行:

egrep "($word_from_list|$var)"

如果你的意思是在$ word_from_list之后包含$ var的行,则以下内容可能更清楚:

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

来考虑一下,你究竟想要什么文字? stdin用于wordlist,在你的例子中你错过了grep的filename参数吗?

答案 4 :(得分:0)

这里我们假设number.txt为实际文件,checknum.txt包含要搜索的内容,

我们可以在“for”

的帮助下进行搜索
 # 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

感谢。

答案 5 :(得分: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