Apache Airflow DAG中BashOperator调用awk命令异常如何解决
问题原因
Airflow的BashOperator执行命令存在两层解析逻辑,会导致写的awk命令变形失效:
- 第一层是Jinja模板渲染:BashOperator默认会对
bash_command字段做模板渲染,若格式冲突会导致命令片段被提前替换 - 第二层是bash本身的引号解析:原代码里用双引号包裹awk的执行代码块,bash会提前解析双引号内的
$0为当前shell进程的参数,不会把它传给awk程序
终端直接执行能跑通,本质是终端执行时通常用单引号包裹awk代码块,不存在上面两层解析冲突。
修复方案
直接调整命令的引号和转义即可,修正后的任务代码如下:
extract_data_from_fixed_width = BashOperator( task_id='extract_data_from_fixed_width', bash_command='awk -v OFS="," \'{print substr($0,1,57), substr($0,57,6)}\' /home/project/airflow/dags/finalassignment/staging/payment-data.txt > /home/project/airflow/dags/finalassignment/staging/fixed_width_data.csv', dag=dag, )
调整点说明:
- 把awk的执行代码块换成单引号包裹,避免bash提前解析
$0 - 因为外层
bash_command整体用单引号包裹,内部的单引号加反斜杠转义即可 - 重定向符号
>前后加了空格,避免极端场景下路径拼接错误
如果不想处理复杂的引号转义,也可以用更稳妥的方案:
- 把终端能跑通的完整awk命令写到单独的shell脚本文件里,给脚本加可执行权限
- BashOperator里直接调用该shell脚本即可,完全避开引号转义、模板渲染的冲突问题
内容的提问来源于stack exchange,提问作者Umang
相关产品推荐
相关产品推荐

