linux遍历一个文本文件
本文介绍了如何使用Bash脚本遍历IP地址文件,并展示了两种方法:一种是逐行操作,另一种是封装成函数。同时讨论了可能遇到的网络延迟问题和脚本整合过程。
这里遍历一个IP文件
得到一个查询脚本 ,执行查询脚本得到IP归属
这个是360智脑 AI小助手给出的代码
#!/bin/bash
ip_file_path="path/to/your/ip_addresses.txt"
# 创建一个空的查询脚本文件
query_script_path="path/to/your/query_script.sh"
touch "$query_script_path"
# 使用while循环和read命令逐行读取IP地址文件
while read ip_address; do
# 使用dig命令查询IP地址的详细信息
dig "@resolver1.opendns.com" -t any "$ip_address"
# 将查询命令添加到查询脚本文件中
echo "dig \"@resolver1.opendns.com\" -t any \"$ip_address\"" \
>> "$query_script_path"
done < "$ip_file_pat
这个是文心一言给出的代码
#!/bin/bash
filename="yourfile.txt" # 替换为你的文件名
while IFS= read -r line
do
echo "$line"
done < "$filename"
#在这个脚本中:
#IFS= 用于在读取行时保留前导和尾部的空白字符。
#read -r 用于读取一行,-r 选项阻止反斜杠转义。
#echo "$line" 用于打印当前行。
#done < "$filename" 表示从文件 $filename 中读取输入。
下面是我结合以上代码写的 核心逻辑代码
第一种写法
#!/bin/bash
#------------------------
# 输出脚本在执行
#------------------------
filename="yourfile.txt"
MY_LOGS_DIR_C='$HOME/桌面/ip_xx.sh'
cat ${filename} | while read MYip; do
echo -e "curl -s cip.cc/${MYip} | grep -n '地址'| awk '{print \$5}'\necho '${MYip}'\necho '-----'\nsleep 1s" \
>>${MY_LOGS_DIR_C}
done
chmod -R 700 ${MY_LOGS_DIR_C}
bahs ${MY_LOGS_DIR_C}
第二种写法
#!/bin/bash
#------------------------
# 写一个函数 MY_IP_LIST 自动打印
#------------------------
filename="yourfile.txt"
cat ${filename} | while read MYip; do
MY_IP_LIST(){
curl -s cip.cc/${MYip} | grep -n '地址'| awk '{print $5}'
echo "${MYip}"
echo '-----'
# 隔1秒查询一次,直到最后一个IP
sleep 1s
}
MY_IP_LIST
done
下面是核心代码
使用IP查询 归属地 这条查询命令可能会应为网络延迟问题查询失败
下面切入正题,演示整个整合代码
第一种写法
#!/bin/bash
#------------------------
# 遍历一个IP地址文件 查询归属地
#------------------------
MY_LOGS_DIR_A="$HOME/桌面/MY_IP_LOGS_I8520.LOG"
MY_LOGS_DIR_B_1="$HOME/桌面/MY_IP_LOGS_I8520.LOG.1"
MY_LOGS_DIR_B_2="$HOME/桌面/MY_IP_LOGS_I8520.LOG.2"
#这个是保持遍历后的脚本代码保存在这里 IP_XX.sh
MY_LOGS_DIR_C="$HOME/桌面/IP_XX.sh"
# IP_XX.sh清空该脚本的全部内容
> ${MY_LOGS_DIR_C}
#------------------------
# 处理原始数据,吧IP筛选出来,在去除重复行
#------------------------
cat ${MY_LOGS_DIR_A} | \
grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
sed 's/0.0.0.0//g' > ${MY_LOGS_DIR_B_1}
#去除重复行,把新数据写入 $HOME/桌面/MY_IP_LOGS_I8520.LOG.2
sort -k2n ${MY_LOGS_DIR_B_1}| \
awk '{if ($0!=line) print;line=$0}' > ${MY_LOGS_DIR_B_2}
sleep 0.5s
#-------------------------------
# 遍历一个ip地址的文件查询归属地
# === 核心代码 curl -s cip.cc/IP | grep -n '地址'| awk '{print $5} ===
# MYip表示每一行的变量 Ip 地址,我是这么理解的
#------------------------------
cat ${MY_LOGS_DIR_B_2} | while read MYip; do
echo -e "curl -s cip.cc/${MYip} | \
grep -n '地址'| awk '{print \$5}'\necho '${MYip}'\necho '-----'\nsleep 1s" >>${MY_LOGS_DIR_C}
done
sleep 0.5s
#------------------------------
# 附加全新执行查询脚本
#------------------------------
chmod -R 700 ${MY_LOGS_DIR_C}
bash ${MY_LOGS_DIR_C}
sleep 0.5s && rm -rf ${MY_LOGS_DIR_B_1} ${MY_LOGS_DIR_B_2} ${MY_LOGS_DIR_C}
exit 0
第二种写法
#!/bin/bash
#------------------------
# 遍历一个IP地址文件 查询归属地
#------------------------
MY_LOGS_DIR_A="$HOME/桌面/MY_IP_LOGS_I8520.LOG"
MY_LOGS_DIR_B_1="$HOME/桌面/MY_IP_LOGS_I8520.LOG.1"
MY_LOGS_DIR_B_2="$HOME/桌面/MY_IP_LOGS_I8520.LOG.2"
#------------------------
# 处理原始数据,吧IP筛选出来,在去除重复行
#------------------------
cat ${MY_LOGS_DIR_A} | \
grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
sed 's/0.0.0.0//g' > ${MY_LOGS_DIR_B_1}
#去除重复行,把新数据写入 $HOME/桌面/MY_IP_LOGS_I8520.LOG.2
sort -k2n ${MY_LOGS_DIR_B_1}| awk '{if ($0!=line) print;line=$0}' > ${MY_LOGS_DIR_B_2}
sleep 0.5s
#-------------------------------
# 写一个 MY_IP_LIST 函数 while 循环里面执行
#------------------------------
cat ${MY_LOGS_DIR_B_2} | while read MYip; do
MY_IP_LIST(){
curl -s cip.cc/${MYip} | grep -n '地址'| awk '{print $5}'
echo "${MYip}"
echo '-----'
# 隔1秒查询一次,直到最后一个IP
sleep 1s
}
MY_IP_LIST
done
sleep 0.5s && rm -rf ${MY_LOGS_DIR_B_1} ${MY_LOGS_DIR_B_2}
exit 0
评论区