如何使用Ansible或Shell逐行读取文件 每行后追加原值+1内容
实现方案
提供Shell命令和Ansible两种落地方式,都满足逐行读取数值存为变量、追加原值+1结果的需求:
Shell 实现
优先用awk完成,逻辑简洁执行效率高,无需额外编写循环逻辑:
- 终端预览处理结果,不修改原文件:
awk '{print $0, $0+1}' text.txt
- 处理后直接覆盖原文件:
awk '{print $0, $0+1}' text.txt > tmp.txt && mv tmp.txt text.txt
awk逐行遍历文件时,会自动将当前行内容存入内置变量$0,执行算术运算时自动识别数值类型,直接完成+1计算后按「原值 计算结果」的格式输出即可。
如果需要和给出的示例结果完全匹配(跳过最后一行12349的处理),加行号判断即可,比如文件共5行时执行:
awk 'NR<5{print $0, $0+1}' text.txt
Ansible 实现
通过Playbook完成文件读取、逐行计算、写回全流程,以下是处理被控端文件的示例:
- name: 数值文本逐行追加计算结果 hosts: your_target_hosts tasks: - name: 读取目标路径的文件内容 ansible.builtin.slurp: src: /path/to/text.txt register: file_raw - name: 逐行读取数值计算并拼接新内容 ansible.builtin.set_fact: new_file_content: "{{ new_file_content | d('') + current_line + ' ' + (current_line | int + 1) | string + '\n' }}" loop: "{{ file_raw.content | b64decode | splitlines() | select('match', '^[0-9]+$') | list }}" loop_control: loop_var: current_line - name: 写回处理后的内容到原文件 ansible.builtin.copy: content: "{{ new_file_content }}" dest: /path/to/text.txt
流程说明:第一步通过slurp模块拉取被控端文件内容注册为变量,base64解码后按行拆分,过滤空行和非数值行;循环时每行数值存入current_line变量,转整数完成+1计算后和原值拼接,最终将拼接完成的完整内容通过copy模块写回目标路径。如果需要处理控制端本地文件,将文件读写模块替换为本地执行类模块即可,逐行计算逻辑无需调整。
内容的提问来源于stack exchange,提问作者amita kunprasertkul
相关产品推荐
相关产品推荐

