【问题标题】:Checking for 2 exact string in a text file using grep使用 grep 检查文本文件中的 2 个确切字符串
【发布时间】:2017-01-15 17:47:48
【问题描述】:

我对 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,它显示来自文本文件的信息这不是必需的。

【问题讨论】:

  • 添加 -q 选项以保持安静,如果您不想打印任何信息。

标签: linux shell grep


【解决方案1】:

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

您可以在其中控制是否要匹配作者和标题(如给定)或作者或标题(将&& 更改为||)。您可以提供任何一个值或同时提供这两个值,脚本会处理它。

【讨论】:

  • 为了更清楚起见,我更改了问题,我实际上是在尝试查看是否可以在文本文件中找到确切的字符串。
  • 添加 -q 选项以保持安静,如果您不想打印任何信息,只需检查匹配状态。
【解决方案2】:

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

试试这个:

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

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

如果您想让匹配对大小写不敏感,请将 -i 选项添加到 grep。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2015-04-13
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多