awk命令功能解析及指定行匹配规则修改咨询
AWK命令解析与修改方案
一、原AWK命令工作原理
原命令(修正HTML转义后的完整代码):
awk '/Conditional jump or move depends on uninitialised value/ {block=1} block {str=str sep $0; sep=RS} /^==.*== $/ {block=0; if (str!~/oracle/ && str!~/OCI/ && str!~/tuxedo1222/ && str!~/vprintf/ && str!~/vfprintf/ && str!~/vtrace/) { if (str!~/^$/){print str}} str=sep=""}' file_name.txt >> CondJump_val.txt
核心执行逻辑拆分
- 触发块收集:当匹配到行内容包含
Conditional jump or move depends on uninitialised value时,设置标记block=1,启动后续行的收集模式。 - 收集块内容:只要
block标记为1,就把当前行拼接到变量str中——第一次拼接时sep为空,之后每次用系统默认的换行符(RS,记录分隔符)作为行分隔符。 - 结束块并过滤输出:当匹配到以
==开头、以==结尾的行时,关闭收集模式(block=0):- 检查
str是否不包含oracle、OCI、tuxedo1222、vprintf、vfprintf、vtrace这些指定字符串; - 同时确认
str不为空字符串; - 满足条件则打印
str,最后重置str和sep为空,准备处理下一个块。
- 检查
- 输出定向:最终结果追加写入
CondJump_val.txt文件。
二、修改为仅从第二行开始检查指定内容
要实现只对块内第二行及以后的内容做Oracle/OCI等过滤检查,需要拆分块内的第一行和后续行,单独对后续行做校验:
修改后的AWK命令
awk '/Conditional jump or move depends on uninitialised value/ {block=1; line_num=0; str=""; sep=""; check_str=""} block { line_num++ if (line_num == 1) { str = $0 # 保留第一行到输出变量 } else { str = str sep $0 # 后续行拼接到输出变量 sep = RS check_str = check_str sep $0 # 后续行存入单独校验变量 } } /^==.*== $/ { block=0 # 仅对第二行及以后的内容(check_str)做过滤检查 if ((check_str !~ /oracle/ && check_str !~ /OCI/ && check_str !~ /tuxedo1222/ && check_str !~ /vprintf/ && check_str !~ /vfprintf/ && check_str !~ /vtrace/) && str !~ /^$/) { print str } # 重置所有变量 str = sep = check_str = "" }' file_name.txt >> CondJump_val.txt
修改点说明
- 新增
line_num变量,用于追踪块内的行号;新增check_str变量,专门存储块内第二行及以后的内容。 - 块内第一行直接存入
str(用于最终输出),不进入check_str;后续行同时存入str和check_str。 - 结束块时,仅对
check_str执行Oracle/OCI等内容的过滤校验,str保留整个块的完整内容用于输出。 - 每次块结束后,重置所有相关变量,避免干扰下一个块的处理。
内容的提问来源于stack exchange,提问作者USER
相关产品推荐
相关产品推荐

