问题解决向日葵后台进程的异常日志,找到一个awk命令。awk-F'=''/\[common\]/{a=1}a==1&&$1~/autorun/{print$2;exit}'/etc/orayconfig.conf介绍使用awk--help来查看awk的使用方法usage:awk[POSIXorGNUstyleoption]-fscriptfile[--]file...usage:awk[POSIXorGNUstyleoption][--]'program'file...POSIX选项:GNU长选项:(标准)-fscriptfile--file=scriptfile-Ffs--field-separator=fs-vvar=val--assign=var=val短选项:GNU长选项:(扩展)-b--characters-as-bytes-c--traditional-C--copyright-d[file]--dump-variables[=file]-D[file]--debug[=file]-e'程序文本'--source='程序文本'-Efile--exec=file-g--gen-pot-h--help-iincludefile--include=includefile-llibrary--load=library-L[fatal|无效|no-ext]--lint[=fatal|invalid|no-ext]-M--bignum-N--use-lc-numeric-n--non-decimal-data-o[file]--pretty-print[=file]-O--optimize-p[file]--profile[=file]-P--posix-r--re-interval-s--no-optimize-S--sandbox-t--lint-old-V--version要报告错误,请参阅`gawk中的节点`Bugs'。info'这是印刷版中的“报告问题和错误”部分。可以在https://www.gnu.org/software/gawk/manual/html_node/Bugs.html找到相同的信息。请不要尝试通过在comp.lang.awk中发帖或使用网络来报告错误StackOverflow.gawk等论坛是一种模式扫描和处理语言,默认情况下从标准输入读取并写入标准输出。示例:awk'{sum+=$1};END{printsum}'fileawk-F:'{print$1}'/etc/passwd现在我们可以把原来的命令拆分成4个序号语句块来解析1个awkawk程序本身2-F'='指定分别处理以=为分隔符的文件行3'/\[common\]/{a=1}a==1&&$1~/autorun/{print$2;exit}'awk程序参数4.输入文件1,2/etc/orayconfig.confawk中的4个比较简单。难点在于3、awk的程序参数解析程序使用mangawk查看awk帮助文档。AWK程序执行AWK程序由一系列可选指令、模式动作语句和可选函数定义组成。@include"filename"@load"filename"@namespace"name"pattern{actionstatements}functionname(parameterlist){statements}程序部分支持以上五种格式。很明显,我们的程序属于第四种,pattern+action,即原命令有如下两个程序:序号originalstatementpatternaction1/\[common\]/{a=1}/\[common\]/a=12a==1&&$1~/autorun/{print$2;exit}a==1&&$1~/autorun/print$2;exit它们的顺序是什么?别着急,我们继续看man文档。对于输入中的每条记录,gawk会测试它是否与AWK程序中的任何模式相匹配。对于记录匹配的每个模式,gawk执行关联的操作。这些模式按照它们在程序中出现的顺序进行测试。sequence依次匹配pattern,匹配成功后执行action。这个描述中p2和a1的顺序不清楚。写了一个测试用例,发现执行顺序是:p1->a1->p2->a2Conclusion#!/bin/envbashhawk\-F'='\'/\[common\]/\{a=1}\a==1&&$1~/autorun/\{打印$2;exit}'\/etc/orayconfig.conf该命令读取/etc/orayconfig.conf文件,对于文件的每一行先匹配/[common],定义变量a,匹配成功后赋值1;然后判断a的值是否为1(即匹配到[common]),并以=作为第一个分隔符第一个参数是否匹配autorun,匹配成功则打印第二个参数,然后结束整个程序。整个命令解析orayconfig.conf配置文件,解析获取common域的autorun值并返回。探索这条命令分析到此为止,那么是否可以完美解决需求,有没有什么隐患呢?只要匹配到[common],a的值就一直为1,程序可能会在common之后解析一个域中的autorun值。程序中的正则匹配没有开始符号和结束符号,可能会被解析为包含autorun的配置项,例如:daemonautorun。优化优化后的命令如下,只检查公共域,公共域结束后停止程序。#!/bin/envbashawk\-F'='\'/^\[common\]$/\{common=1}\common==1&&$1~/^autorun$/\{print$2;exit}\common==1&&/^\[/\{exit}'\/etc/orayconfig.conf
