【问题标题】:How to grep a file using search parameters from another file如何使用来自另一个文件的搜索参数 grep 文件
【发布时间】:2011-04-07 02:05:48
【问题描述】:

我正在尝试使用包含 IP 地址的文件作为搜索 Cisco 防火墙配置文件的基础。通常,我会使用类似的东西:

for i in $(cat ip.file); do grep $i fw.config; done

但这样做绝对不会有任何回报。如果我将上面的脚本放入一个文件并使用 bash -xv 标志执行它,每一行都会返回如下内容:

+ for i in '`cat ip.file`'
+ grep $'1.2.3.4\r' fw.config  (each IP address is different)

grep 1.2.3.4 fw.config 正是我想要发生的事情,但我从这个命令中没有得到任何回报。

我知道 grep -f 选项,但这也没有返回任何内容。我不是一个经验丰富的编码员,所以我可能会忽略一些显而易见的事情。

【问题讨论】:

  • 这不能解决您的问题,但是当变量是命令的参数时,您应该始终引用它们。当参数之一也是变量时,使用-- 停止选项处理也不是一个坏主意。 grep -- "$i" fw.config

标签: bash grep for-loop


【解决方案1】:

看起来ip.file 是 DOS 格式并且有 \r\n 行结尾。在其上运行dos2unix 以转换为UNIX 格式。这将消除错误的 \r 回车符,这些回车符会弄乱 grep

顺便说一句,您可以使用grep -f FILEgrep 传递要搜索的模式列表。然后它将执行单遍搜索任何这些模式。

# After doing `dos2unix ip.file'...
grep -f ip.file fw.config

# Or...
grep -f <(dos2unix < ip.file) fw.config

【讨论】:

  • -f 方法还具有将搜索模式解释为简单字符串的优点——例如“1.2.3.4”中的点只会匹配点,而不是任何字符。
  • 这就是答案。 IP 地址列表是从我通过网络浏览器从我的 dns 提供商下载的 dns 区域文件中获取的。我不知道它是dos格式的。接得好。运行 dos2unix 后, grep -f 按预期工作。谢谢。
【解决方案2】:

GNU grep,

grep -f ip.txt config

建议不要将 for 循环与 cat 一起使用。 (如果这样做,则应将 IFS 更改为 $'\n')。请改用 while 读取循环。

while read -r line
do
  ....
done <"ip.txt"

【讨论】:

    【解决方案3】:
    for i in $(tr '\r' '\n' < ip.file); do grep $i fw.config; done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2017-08-09
      • 2018-04-08
      相关资源
      最近更新 更多