微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解awk中的IN语句

如何解决了解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 arrayawk语法的一部分,用于检查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 举报,一经查实,本站将立刻删除。