我需要一个用于解析主机的脚本。
现在我在本地机器上运行这个脚本
for i in `tail -F access.log | awk '{print $8}' | awk '{gsub("http://|/.*","")}2' | awk '{gsub("http://|:.*","")}1' | grep -E -v "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"`
do
nslookup $i [dns-server_ip];
done > ips.txt
但是我需要尾巴来自一些远程主机的文件并运行查找在我的本地机器上,我不知道如何做到这一点。
答案1
使用 ssh 吗?
大多数命令只需在命令前面添加即可远程执行ssh
,因此替换tail -F access.log
为ssh REMOTEHOST tail -F access.log
==>
ssh myUSER@myREMOTEHOST tail -F access.log |
awk '{print $8}' |
awk '{gsub("http://|/.*","")}2' | awk '{gsub("http://|:.*","")}1' |
grep -E -v "([0-9]{1,3}\.){3})[0-9]{1,3}" | while read i ;
do
nslookup $i $dnsServerIP;
done > ips.txt
正如 @kasperd 和 @archemar 也暗示的那样,您可以/应该清理那么长的管道。这是我的看法:
ssh myUSER@myREMOTEHOST tail -F access.log |
awk '{$0=$8; gsub("https?://|[/:].*","")} !/([0-9]{1,3}.){1,3}[0-9]{1,3}/' |
while read i ; do
nslookup $i $dnsServerIP;
done > ips.txt
解释:
$0=$8
。在您的示例输出中,包含所需 URL 的列是 #8。此命令$0
仅使用 element 覆盖(整行)$8
,有效地丢弃其余部分。这取代了'{print $8}'
gsub("https?://|[/:].*","")}
将您的两个 gsub 调用替换为一个涵盖所有可能性的一个调用。在您的代码中,您还搜索了“http://”两次,并且与 http 不匹配s。!/([0-9]{1,3}.){1,3}[0-9]{1,3}/'
使用完全相同的正则表达式替换单独的 grep 调用。当$0
不是数字 IP 时,它的计算结果为 true,并且会隐式地执行此操作{print $0}'
。稍微短一点h=$0;gsub(/[0-9.]/,"",h)} h
也有同样的效果。
注意: -调用后面的尾部2
和1
后面的值计算为,而该值又隐式扩展为。这就是我的解决方案中最后一个正则表达式隐式打印不匹配行的方式/原因。}
gsub
true
true {print $0}