我是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
作为Title
而Mary
输入Author
,echo$?
命令仍会返回0.每当,它返回0 ,它显示文本文件中不需要的信息。
答案 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。