我正试图从白名单IP列表中查找IP,以便进行nginx配置。
/tmp/iplist
11.2.3.4
22.2.3.4
/tmp/whitelist
"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
#!/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
这是一个结果,是空白的。
> bash /tmp/findIPs.sh
>
我错过了什么?
发布于 2017-06-20 00:57:48
您使用的代码最简单的调整是:
for ip in $(cat /tmp/iplist)
do
grep "$ip" /tmp/whitelist
done
一旦得到了变量中的值,它的双引号就不会被进一步的双引用变量展开所破坏。如果/tmp/iplist
文件不包含双引号,但它们是关键的,那么您可以使用:
grep "\"$ip\"" /tmp/whitelist
或者你可以用这个:
grep \""$ip"\" /tmp/whitelist
(也有两个不对称排列可用)。这是一个好主意,以确保你确实知道为什么会起作用。如果您想使用单引号,有一些方法,但是"$ip"
部件必须在单引号之外。
所有示例都以单引号开始模式参数到grep
。单引号禁止所有扩展,直到下一个单引号。例如,grep '"$ip"' /tmp/whitelist
正在寻找文件中的5个字符-- "
、$
、i
、p
、"
。在任何情况下,它们都是扩展的变量ip
。
如果任何IP地址都有一个空间,就会出现问题。使用for ip in $(cat /tmp/iplist)
时要小心。通常情况下你会做得更好:
while read -r ip
do
grep "$ip" /tmp/whitelist
done < /tmp/iplist
另一种方法是使用grep -F
或fgrep
。
grep -F -f /tmp/iplist /tmp/whitelist
这并不坚持在IP地址周围使用双引号,而是对/tmp/whitelist
文件进行一次传递(同时也对/tmp/iplist
文件进行一次传递),这是非常有效的。这将产生与以前略有不同的行,这可能并不重要,但您应该知道这一点。
如果必须使用双引号(为了避免在搜索11.2.3.44
时选择11.2.3.4
),那么:
grep -F -f <(sed 's/^/"/; s/$/"/' /tmp/iplist) /tmp/whitelist
这使用过程替代将/tmp/iplist
文件的编辑版本传递给grep
命令。如果您的shell中没有进程替换,则可以使用:
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
指定完全匹配。
如果您还没有收集到,有很多不同的方法可以做到这一点。
https://stackoverflow.com/questions/44642111
复制相似问题