有人能翻译一下这个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.*

有人能把这个awk命令翻译成简单的语言吗?


编辑:以下是gawk -o-的格式:

/^(E|I|D)@.*/ {
p = 0
}
/^(E|I|D)@.*User Name: my_username.*_ACCESS_CHECK_.*/ {
p = 1
printf FILENAME ":" FNR ":"
}
p {
print
}

当一行以E,ID开头,紧接@,然后是包含User Name: my_username_ACCESS_CHECK_的文本时,按此顺序,一个称为p("print")的标志被设置为true。

当该标志为true时,将打印通过Awk的每一行输入。当标志为false时,禁止打印行。

当读取以E,IO开头的行,然后是@,并且不包含两个额外的文本匹配时,p标志恢复为false。这一行本身不打印。

@Yudha:

把它写成printf FILENAME …是不合适的,没有格式语句,没有括号

-将printf()视为函数sprintf(),而不是语句print

printf("%s", FILENAME ":" FNR ":")

  • ,或者最好是

printf("%s:%u:", FILENAME, FNR)


这里有一个原始方法如何崩溃的例子-一个文件名中带有百分比符号的文件:

-rw-r--r--    1 501 staff  1036334374 Jul 21  2021 file%dxyz.txt

:gawk: cmd. line:1: (FILENAME=file%dxyz.txt FNR=1039321) 

fatal: not enough arguments to satisfy format string
`file%dxyz.txt:1039321:'
^ ran out for this one

最新更新