如何在 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
您可以更好地格式化输出(例如,固定长度的列)。
我是这样的运行循环:
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
您可以更好地格式化输出(例如,固定长度的列)。