如何解决了解awk中的IN语句
我在理解bash中的in语句时遇到问题...首先,这里是代码:
std::remove("testing.txt");
因此#! /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
只是IP列表,而nslookup正在获取主机名的IP(用于黑名单目的)。因此,现在我想检查日志中连接的IP是否位于thttp2.log
数组中的代码中的黑名单中。
来自dns
的所有IP和查找都很好:Dns = 81.169.145.82 192.0.3.45和awk $ 1 = 81.169.145.82。那么如果$ 1在dns中,我该如何在下部检查awk语句?
我已经尝试了半天了……我很确定我还不明白“在”,所以有人可以给我至少一个小费吗?
PS:当前结果仅为:
nslookup
目标:
81.169.145.82
81.169.145.82
81.169.145.82
192.0.3.45
解决方法
最好将while
循环的输出用作awk
的输入,没有理由在中间使用bash
数组,awk
更喜欢使用比任何bash
变量都要流。
因此,您将产生一个ips流,以读取blacklist.txt
文件并解析nslookup
输出。我在回答中将该部分视为黑框,我假设您获得了良好的结果,并且希望与其他文件一起运行逻辑。同样,在输入量很大的情况下,每行运行一个nslookup
和一个awk
效率也不高,但是我不知道您在那部分做什么,我将其保留。 / p>
while read -r line; do
nslookup "$line" | awk -F ': ' 'NR==6 {print $2}'
done < blacklist.txt | awk 'FNR==NR {dns[$0]; next}
{print ($1 in dns)? $1 " Blacklisted": $1}' - thttpd2.log
您还可以将黑名单文件直接提供给awk
,并在awk
内调用您使用的外部bash
命令。但是我认为这样比较简单。
因此,如果$ 1在dns中,我该如何检入下部的awk语句?
awk
不是shell,而shell不是awk
。 Shell变量与任何awk
变量都不相关,而awk
变量与Shell无关。 awk
是一个单独的程序,具有与Shell不相关的单独语法,而Shell是一个单独的程序,其自身与awk
不相关的语法。
construct subscript in array
是awk
语法的一部分,用于检查awk
中的下标下标是否是awk
数组数组。它与shell变量和bash数组无关。请注意,下标不是元素的值,而是索引。 “ array [subscript] = value”
了解IN-Linux bash中的语句
bash shell中的in
仅用作case
语句中的关键字:
case something in
pattern) ;;
esac
它的用法与awk
的用法无关,因为外壳不是awk
。
请给我至少一个小费?
首先将输入作为数组awk
的下标读入dns
。之后,您可以使用awk构造something in dns
来检查某物是否为数组的下标。
您已经获得了解释in
含义的答案,而且还可以-因为nslookup
可以从stdin中读取域名列表:
$ cat dns.blacklist.txt.txt
google.com
yahoo.com
$ nslookup < dns.blacklist.txt.txt
Default Server: cdns01.foo.net
Address: 2222:555:beef::1
> Server: cdns01.foo.net
Address: 2222:555:beef::1
Non-authoritative answer:
Name: google.com
Addresses: 2607:f8b0:4009:804::200e
172.217.9.78
> Server: cdns01.foo.net
Address: 2222:555:beef::1
Non-authoritative answer:
Name: yahoo.com
Addresses: 2001:4998:44:3507::8000
2001:4998:124:1507::f001
2001:4998:124:1507::f000
2001:4998:44:3507::8001
2001:4998:24:120d::1:1
2001:4998:24:120d::1:0
98.137.11.163
74.6.143.25
74.6.231.21
98.137.11.164
74.6.143.26
74.6.231.20
您不需要在shell循环中包装任何东西,例如(未试用):
nslookup < dns.blacklist.txt.txt |
awk '
NR==FNR {
if ( sub(/^Addresses:/,"") ) { inAddrs=1 }
if ( inAddrs ) {
if ( NF ) { dns[$1] }
else { inAddrs=0 }
}
next
}
{ print $1,($1 in dns ? "Blacklisted" : "" }
' - thttpd2.log
请注意,nslookup
可以输出给定域的IP地址列表,而不仅仅是您现有脚本所期望的IP地址列表,上面的脚本可以容纳该地址。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。