Ansible按行读取文件并按条件删除行的实现问题
Ansible实现按行过滤文件(保留年份≥2023的行)
需求说明
需要用Ansible完成以下操作:
- 按行读取目标文件
- 检查每行末尾的年份字段,删除年份<2023的行,保留年份≥2023的行
示例输入文件
abcd Sat Oct 25 04:30:35 EDT 2036 defg Tue Dec 01 18:59:59 EST 2037 ghij Fri Jun 17 06:15:06 EDT 2022
预期输出文件
abcd Sat Oct 25 04:30:35 EDT 2036 defg Tue Dec 01 18:59:59 EST 2037
原代码问题分析
- 语法错误:
lookup的文件路径未加引号,导致Ansible解析失败;debug模块的写法不符合语法规范 - 逻辑缺陷:仅取最后一行的年份,没有实现逐行遍历判断,无法完成批量过滤需求
正确实现方案
方案一:正则筛选(简洁高效)
通过正则匹配直接筛选符合条件的行,适合格式固定的场景:
- name: 过滤文件中年份小于2023的行 hosts: localhost vars: file_path: "/home/user/cert_cleanup/{{ output_file }}" tasks: - name: 读取文件并筛选符合条件的行 set_fact: filtered_lines: "{{ lookup('file', file_path).split('\n') | select('match', '.*\\s20(2[3-9]|[3-9]\\d)$') | list }}" when: lookup('file', file_path) != '' - name: 将过滤结果写入原文件 copy: content: "{{ filtered_lines | join('\n') }}\n" dest: "{{ file_path }}"
代码说明
lookup('file', file_path):读取目标文件的全部内容split('\n'):将文件内容拆分为每行的列表select('match', '.*\\s20(2[3-9]|[3-9]\\d)$'):用正则匹配行末为2023及以后年份的行join('\n'):将筛选后的行重新拼接为字符串,末尾加换行保证文件格式正常
方案二:逐行判断(逻辑清晰)
如果需要更直观的逐行判断逻辑,可采用遍历方式:
- name: 逐行过滤文件内容 hosts: localhost vars: file_path: "/home/user/cert_cleanup/{{ output_file }}" tasks: - name: 读取文件所有行 set_fact: all_lines: "{{ lookup('file', file_path).split('\n') }}" when: lookup('file', file_path) != '' - name: 筛选年份≥2023的行 set_fact: filtered_lines: "{{ filtered_lines | default([]) + [item] }}" loop: "{{ all_lines }}" when: - item | trim != '' # 跳过空行 - item.split()[-1] | int >= 2023 # 提取行末年份转为整数后判断 - name: 写入过滤后的内容 copy: content: "{{ filtered_lines | join('\n') }}\n" dest: "{{ file_path }}"
代码说明
loop: "{{ all_lines }}":遍历文件的每一行item.split()[-1]:按空格拆分每行内容,取最后一个字段(即年份)| int >= 2023:将年份转为整数后判断是否符合条件filtered_lines | default([]) + [item]:收集所有符合条件的行
内容的提问来源于stack exchange,提问作者Evangeline Amalina
相关产品推荐
相关产品推荐

