regex - Bash:在引用表达式中对 grep 使用引用变量

标签 regex linux bash shell grep

我正在尝试在查询日志文件的 bash 脚本中创建一个函数。在查询函数中,我有类似于以下内容的内容:

if [ -n "$(cat some-log-file.log | grep \"$1\")" ]; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

如果我发送一些我知道会在日志文件中作为 $1 的内容,比如“我不这样做”,我会得到输出:

$ ./y.sh 查询“我不”
grep: 不要": 没有那个文件或目录
没有与搜索词匹配的行。

如果我尝试对 $() 表达式进行单引号,它会发送文字字符串并始终计算为真。我猜这与 grep 解释反斜杠的方式有关,但我无法弄清楚。也许我正在监督一些简单的事情,但我已经花了好几个小时在论坛上寻找并插入引号和转义字符的各种奇怪组合。感谢您提供任何帮助或建议。

最佳答案

如果您意识到 $() 允许使用未转义的引号,这实际上非常简单:

if [ -n "$(cat some-log-file.log | grep "$1")" ]; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

不过,实际上您甚至可以跳过该步骤,因为 grep 提供了适当的退出代码:

if grep -q "$1" some-log-file.log; then
  echo "There is a match."
else
  echo "No lines matched the search term."
fi

简而言之,发生这种情况的原因与 "$1" 起作用的原因相同:Shell 参数扩展和命令替换发生在 单词拆分和引号删除之前。在 Shell Expansions section of the bash manual 中查看有关 bash 如何解析命令的更多信息.

关于regex - Bash:在引用表达式中对 grep 使用引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760690/

相关文章:

regex - 使用 grep 时的正则表达式文档

python - STDIN 文件读取查询

linux - 使用命令输入的 Bash 别名

linux - CRON bash 执行结果不同于手动启动

python - 将输入通过管道传输到 Python 快速但肮脏的单行代码中

regex - 使用正则表达式在文本中搜索 UUID

regex - 使用正则表达式查找双字

java - 正则表达式从 html 标签(嵌套)获取文本 - Java

javascript - 在 php 和 javascript 中使用相同的正则表达式

c - 如何以root身份执行命令