请求解析以下awk命令的功能(含格式化代码示例)
这个awk命令的功能解释
原始命令
awk '/^(E|I|D)@.*/ {p=0}; /^(E|I|D)@.*User Name: my_username.*_ACCESS_CHECK_.*/ {p=1; printf FILENAME ":" FNR ":"}; p { print }' ~/app_name/log/service/INFO.*
格式化后的清晰代码
/^(E|I|D)@.*/ { p = 0 } /^(E|I|D)@.*User Name: my_username.*_ACCESS_CHECK_.*/ { p = 1 printf FILENAME ":" FNR ":" } p { print }
逐规则拆解说明
规则1:关闭输出开关
只要读到以E@、I@或D@开头的行,就把标记变量p设为0,相当于关闭后续内容的输出权限。规则2:触发目标日志段并打开输出开关
当读到同时满足以下三个条件的行时:- 行首是
E@/I@/D@; - 包含字符串
User Name: my_username; - 包含字符串
_ACCESS_CHECK_;
就把p设为1(打开输出开关),并且先打印当前日志文件的名称、行号,格式为文件名:行号:。
- 行首是
规则3:输出符合条件的内容
只要标记变量p为1(输出开关处于打开状态),就打印当前行的内容。
整体功能总结
这个命令会批量处理~/app_name/log/service/目录下所有以INFO.开头的日志文件,提取和用户my_username相关的ACCESS_CHECK类型日志段:找到符合条件的起始行后,持续输出后续内容,直到遇到下一个以E@/I@/D@开头的行(此时关闭输出)。输出的每一行都会带上对应的日志文件名和行号,方便快速定位日志位置。
内容的提问来源于stack exchange,提问作者Yudha Restu
相关产品推荐
相关产品推荐

