首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bash脚本中带有双引号的grep

bash脚本中带有双引号的grep
EN

Stack Overflow用户
提问于 2017-06-20 00:55:22
回答 1查看 2.4K关注 0票数 2

我正试图从白名单IP列表中查找IP,以便进行nginx配置。

/tmp/iplist

代码语言:javascript
运行
复制
11.2.3.4
22.2.3.4

/tmp/whitelist

代码语言:javascript
运行
复制
"1.2.3.4"
"11.2.3.4"
"1.2.3.44"
"11.2.3.44"

当我像grep '"11.2.3.4"' /tmp/whitelist一样运行grep时,我可以得到一个正确的答案,比如"11.2.3.4"

然而,在bash脚本中,我无法得到任何答案。

以下是我尝试过的一些模式:

/tmp/findIPs.sh

代码语言:javascript
运行
复制
#!/bin/bash

for ip in $(cat /tmp/iplist)
do
  grep '"$ip"' /tmp/whitelist
  grep '\"$ip\"' /tmp/whitelist
  grep '\\\"$ip\\\"' /tmp/whitelist
  x="\"$ip\""
  fgrep '$x' /tmp/whitelist
  grep '$x' /tmp/whitelist
  y="$ip"
  fgrep '$y' /tmp/whitelist
  grep '$y' /tmp/whitelist

这是一个结果,是空白的。

代码语言:javascript
运行
复制
> bash /tmp/findIPs.sh
>

我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-20 00:57:48

您使用的代码最简单的调整是:

代码语言:javascript
运行
复制
for ip in $(cat /tmp/iplist)
do
    grep "$ip" /tmp/whitelist
done

一旦得到了变量中的值,它的双引号就不会被进一步的双引用变量展开所破坏。如果/tmp/iplist文件不包含双引号,但它们是关键的,那么您可以使用:

代码语言:javascript
运行
复制
grep "\"$ip\"" /tmp/whitelist

或者你可以用这个:

代码语言:javascript
运行
复制
grep \""$ip"\" /tmp/whitelist

(也有两个不对称排列可用)。这是一个好主意,以确保你确实知道为什么会起作用。如果您想使用单引号,有一些方法,但是"$ip"部件必须在单引号之外。

所有示例都以单引号开始模式参数到grep。单引号禁止所有扩展,直到下一个单引号。例如,grep '"$ip"' /tmp/whitelist正在寻找文件中的5个字符-- "$ip"。在任何情况下,它们都是扩展的变量ip

如果任何IP地址都有一个空间,就会出现问题。使用for ip in $(cat /tmp/iplist)时要小心。通常情况下你会做得更好:

代码语言:javascript
运行
复制
while read -r ip
do
    grep "$ip" /tmp/whitelist
done < /tmp/iplist

另一种方法是使用grep -Ffgrep

代码语言:javascript
运行
复制
grep -F -f /tmp/iplist /tmp/whitelist

这并不坚持在IP地址周围使用双引号,而是对/tmp/whitelist文件进行一次传递(同时也对/tmp/iplist文件进行一次传递),这是非常有效的。这将产生与以前略有不同的行,这可能并不重要,但您应该知道这一点。

如果必须使用双引号(为了避免在搜索11.2.3.44时选择11.2.3.4 ),那么:

代码语言:javascript
运行
复制
grep -F -f <(sed 's/^/"/; s/$/"/' /tmp/iplist) /tmp/whitelist

这使用过程替代/tmp/iplist文件的编辑版本传递给grep命令。如果您的shell中没有进程替换,则可以使用:

代码语言:javascript
运行
复制
sed 's/^/"/; s/$/"/' /tmp/iplist | grep -F -f - /tmp/whitelist

这使得grep从标准输入中读取要匹配的模式列表,而不是指定的文件。如果-f -可能无法工作(例如,因为您正在使用macOS或BSD机器在Mac上工作),那么-f /dev/stdin可能会工作,或者是-f /dev/fd/0

您还可以生成带有双引号的/tmp/iplist文件。您可以在没有双引号的情况下生成/tmp/whitelist文件,然后使用grep -x指定完全匹配。

如果您还没有收集到,有很多不同的方法可以做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44642111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档