我想在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:没有这样的文件或目录
如何解决这个问题?
答案 0 :(得分:6)
快速扫描grep man page表示您可以将-e
用于多种模式,例如
grep -e "$word_from_list" -e "$var"
如果您发现自己拥有大量模式,则可能需要使用-f
选项从文件中读取这些模式。
答案 1 :(得分:3)
两件事。
之后有几种方法可以获得布尔值和通过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 :(得分: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