如何在 bash 循环期间针对 IP 数组回显或打印输入

how to echo out or print the input during a bash loop against an array of IPs

我是这样的运行循环:

for i in $(cat ips_uniq.txt)
do 
    whois $i | grep 'netname|country|org-name' | sed ':a;N;$!ba;s/\n//g'
done

输出:

netname:        NETPLUScountry:        INcountry:        INcountry:        IN

netname:        NETPLUScountry:        INcountry:        INcountry:        IN

这很好,但是我的 ips_uniq.txt 包含 300 多个唯一 IP 地址,因此理想情况下我希望 IP 地址位于每个输出的同一行。

我的版本:

#!/bin/bash

while IFS= read -r i
do
    if [[ "$i" != "" ]]
    then
        results=$(whois "$i" | grep -iE 'netname|country|org-name' | tr '\n' ' ')
        echo "$i $results"
    fi
done < ips_uniq.txt
  • 使用 while read 方法是逐行读取文件的安全方法,避免了 spaces 或奇怪的行格式的所有问题。阅读 https://mywiki.wooledge.org/BashFAQ/001 了解详情。在你的情况下不需要,但是一个很好的结构来学习。
  • if是为了避免空行。
  • 然后将 whois | grep 组合的结果存储在一个变量中。
  • 请注意,我用一个简单的 tr 替换了您的 sed,它删除了 \n,并添加了一个 space 来拆分字段。根据需要修改。
  • 然后最后的 echo 将 IP 地址前缀添加到结果行。

我用 ips_uniq.txt 测试等于

8.8.8.8

74.6.231.20

结果是

8.8.8.8 NetName:        LVLT-ORG-8-8 Country:        US NetName:        LVLT-GOGL-8-8-8 Country:        US 
74.6.231.20 NetName:        INKTOMI-BLK-6 Country:        US 

使用 printf 您可以更好地格式化输出(例如,固定长度的列)。