如何跳过文件前2行,仅对IP段内容生成带编号列表?
问题解决:仅对IP段内容生成指定起始编号的列表
问题描述
我尝试给文件的特定部分生成带编号列表,但未能成功。我希望仅对IP段内容进行编号,且编号从3开始,但目前的脚本要么错误地给表头编号,要么只能处理固定的3个条目,逻辑不灵活。
当前代码问题
你提供的脚本存在两个核心问题:
- 使用
nl server.list.txt会给文件内所有行从1开始编号,无法实现仅对IP段从3开始编号的需求; - 用硬编码的
if-elif判断仅支持删除第3、4、5行,无法适配服务器条目数量变化的场景,且编号与实际要删除的行号对应关系混乱。
修正后的脚本
echo "Number Server" echo "-------- --------" # 对server.list.txt的内容从3开始编号,仅给IP段编号 awk '{print NR+2 "\t" $0}' server.list.txt echo -n "Enter the server number to delete: " read select # 获取server.list.txt的总行数 total_lines=$(wc -l < server.list.txt) # 计算编号的范围:起始3,结束3+总行数-1 min_num=3 max_num=$((min_num + total_lines - 1)) if [[ $select -ge $min_num && $select -le $max_num ]]; then # 转换为server.list.txt内的实际行号:输入编号-2 line_num=$((select - 2)) sed -i "${line_num}d" server.list.txt echo "Successfully deleted server entry #$select" else echo "ERROR: The number entered is invalid!!!" fi
修正说明
- 编号控制:用
awk '{print NR+2 "\t" $0}'实现从3开始编号,NR是awk内置的行号,加2后就从3开始,仅对server.list.txt里的IP行编号,表头不会被编号; - 灵活判断:通过
wc -l获取文件总行数,动态计算编号的合法范围,不管文件里有多少个IP条目都能适配; - 行号转换:将用户输入的编号(从3开始)转换为
server.list.txt内的实际行号(编号-2),确保删除正确的条目; - 错误提示简化:去掉冗余的标签,直接输出清晰的错误信息。
内容的提问来源于stack exchange,提问作者Luke Galea
相关产品推荐
相关产品推荐

