是否常见兼具库函数与可直接执行代码的awk脚本文件?
这种Awk脚本写法是完全可行的,属于常规操作
当然存在这种常规做法——很多Awk开发者会把可复用的函数库逻辑和直接可执行的业务代码写在同一个脚本里,实现"一脚本两用":
两种使用场景说明
1. 直接执行脚本
直接用awk -f your_script.awk input_file运行,或者给脚本添加执行权限后直接启动,此时脚本里的BEGIN块、模式匹配语句(比如你示例里的$0 ~ end_ere { ... }、display { ... })会正常处理输入,前面定义的mylib_func()、mylib_another_func()也可以被这些执行代码调用。
2. 作为函数库被其他脚本引用
如果要让这个脚本当库用,其他Awk脚本可以通过两种方式引入:
- GNU Awk支持
@include "your_script.awk"语法,直接在脚本里引入; - 用命令行串联多个脚本:
awk -f your_script.awk -f main_script.awk input_file
不过要注意:如果直接引入,原脚本里的执行代码(比如BEGIN块、模式匹配语句)可能会干扰主脚本的逻辑。解决办法是加个开关变量控制执行代码是否生效,比如修改你的示例:
function mylib_func() { ... } function mylib_another_func() { ... } #------------------------------------- BEGIN { # 只有当不是作为库引用时,才执行初始化逻辑 if (!is_library) { ... # 原来的BEGIN代码 } } # 执行代码同样加判断 $0 ~ end_ere { if (!is_library) { if ( display == 1 ) { if ( udscr ) { sub(pn_ere, "") ; print } print "" } display = 0 next } } display { if (!is_library) { sub(pn_ere, "") ; print } }
当其他脚本引用这个库时,只需要提前定义is_library=1:
BEGIN { is_library=1 } @include "your_script.awk" # 现在可以直接调用库函数 mylib_func()
或者通过命令行传参:awk -v is_library=1 -f your_script.awk -f main_script.awk input_file
这种写法兼顾了函数复用和脚本独立执行的需求,是Awk开发里的常规操作。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

