![grep 查找在上一个语句中找到的字符串](https://linux22.com/image/45172/grep%20%E6%9F%A5%E6%89%BE%E5%9C%A8%E4%B8%8A%E4%B8%80%E4%B8%AA%E8%AF%AD%E5%8F%A5%E4%B8%AD%E6%89%BE%E5%88%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我试图找出 fortigate 配置文件内部是否使用了地址定义。
我从配置文件中提取了包含地址的部分。在该部分中,各行如下所示:
edit "address name"
set associated-interface "someinterface"
set subnet 1.1.1.1 0.0.0.0
所以现在我想使用地址名称并通过执行以下操作来检查是否有任何规则或地址组使用它:
IFS='
'
for address in $(grep edit addresses.txt | cut -c10- | sed 's/"//'g); do echo $address; grep -n $address fortigate.conf; done
我取自的IFS部分这里。
这会返回地址定义名称的列表,但 grep 命令没有找到任何内容,这很奇怪,因为它至少应该找到自己,不是吗?
答案1
没有 IFS 可能会更简单
grep edit addresses.txt | cut -d\" -f2 | while read addr
do
echo "addr=[$addr]"
grep -n "$addr" fortigate.conf
done
答案2
你的cut
命令太激进了。如果您单独运行它,您将看到以下效果:
$ grep edit yyyy
edit "address name"
$ grep edit yyyy |cut -c10-
ress name"
调整你的cut
:
$ grep edit yyyy |cut -c6-
"address name"
答案3
也许地址名称中的空格造成了问题。尝试:
IFS='
'
for address in $(grep edit addresses.txt | cut -c10- | sed 's/"//'g); do echo $address; grep -n "$address" fortigate.conf; done
注意:周围有引号$地址当 grep 时