【发布时间】:2020-12-31 07:19:29
【问题描述】:
我在理解 bash 中的 in 语句时遇到了问题...首先是代码:
#! /bin/bash
dns=()
while read line; do
up=$(nslookup $line | awk -F ': ' 'NR==6 {print $2} ')
dns+=($up)
done < dns.blacklist.txt.txt
awk '{if( $1 in dns ) print $1 " Blacklisted"; else print $1}' thttpd2.log
所以thttp2.log 只是一个 IP 列表,而 nslookup 正在获取主机名的 IP(用于黑名单目的)。所以现在我想检查日志中连接的IP是否在黑名单上,在dns数组的代码中。
来自nslookup 的所有 IP 和查找都很好: Dns=81.169.145.82 192.0.3.45 和 awk $1=81.169.145.82 。那么,如果$1在dns中,如何查看下部的awk语句?
我已经尝试了半天了......我很确定我没有理解“in”所以有人可以请至少给我一个提示吗?
PS:目前的结果只是:
81.169.145.82
81.169.145.82
81.169.145.82
192.0.3.45
目标:
81.169.145.82 Blacklisted
81.169.145.82 Blacklisted
81.169.145.82 Blacklisted
192.0.3.45
【问题讨论】:
-
在您的示例中,
dns是一个 bash 数组。awk是从 (bash)shell运行的程序。您不能从awk内部直接访问bash数组的内容,就像在 python 程序中无法访问和使用 bash 变量一样。 -
另外,您编写了一个
bash循环来将文本文件的内容读入一个数组,并且您的意图是将此内容用作awk的输入。虽然awk的理想输入是一个文件,而您已经拥有该文件,所以您必须向awk提供两个文件参数并在其中执行任何操作。 -
...话虽如此,
in语句(是awk而不是bash)类似于python。你可以说for (i in a)或if (i in a)但a应该是awk数组,而不是bash一个, -
@thanasisp 所以现在我将我的数组转移到 awk 到一个名为 a 的数组,但仍然没有成功?
awk -v A="${dns[0]}" 'BEGIN {c=split(A,a)}' | awk '{if( $1 in a ) print $1 " blacklisted"; else print $1}' thttpd2.log -
${dns[0]}只是数组的第一个元素。
标签: arrays linux bash if-statement awk