使用grep检查文本文件中的2个确切字符串

时间:2017-01-15 17:47:49

标签: linux shell grep

我是shell脚本的新手,我一直在阅读有关如何使用不同grep函数的教程。不幸的是,本教程的大部分内容通常都是谈论从文本文件中获取字符串的某种模式。

但是,我正在尝试在文本文件中搜索两个完全字符串。

例如,以下是我的BookDB.txt

的内容
Three Little Pigs : Mary Jane
Cinderella : Paul Johnson

我尝试使用read函数

来获取用户输入
echo Title :
read Title 

echo Author : 
read Author

接下来,我使用了grep命令,我从此link获得了帮助以获取字符串并检查它是否存在于BookDB.txt文件中并分配echo $?命令输出到变量中以显示一些消息。

grep -w "$Title" BookDB.txt
check1=`echo $?`    

grep -w "$Author" BookDB.txt    
check2=`echo $?`

if [ "$check1" -eq 0 ] && [ "$check2" -eq 0 ]; then
    echo Found
else
    echo Not Found
fi

即使用户输入Three作为TitleMary输入Authorecho$?命令仍会返回0.每当,它返回0 ,它显示文本文件中不需要的信息。

2 个答案:

答案 0 :(得分:0)

grep搜索字词,如果您输入的是全名,它就不在乎了,所以" Pigs"将匹配和" Little Pigs"也会匹配。无论作者或标题匹配(无上下文),它也会返回相同的内容。您可以在输入的字符串的左侧或右侧包含分隔符:来处理它。

但是,awk

有更好的方法
$ awk -F' *: *' -v author="Mary Jane" -v title="Three Little Pigs"      \
           '{a=author?author==$2:1; t=title?title==$1:1} t && a' file

您可以控制是否要匹配作者和标题(如给定的)或作者或标题(将&&更改为||)。您可以提供值或两者,脚本将处理它。

答案 1 :(得分:0)

您走在正确的轨道上,但您需要检查同一行是否与作者和标题相匹配。您必须使用单个grep测试整行,并且可以在grep语句中直接使用if的返回码。

试试这个:

DB="BookDB.txt"
if
  grep "^[[:space:]]*$Title[[:space:]]*:[[:space:]]*$Author[[:space:]]*$" "$DB"
then
    echo Found
else
    echo Not Found
fi

许多[[:space:]]*模式使grep忽略了额外的空格。

如果要使匹配对大写/小写不敏感,请将-i选项添加到grep。