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
,I
或D
开头,紧接@
,然后是包含User Name: my_username
和_ACCESS_CHECK_
的文本时,按此顺序,一个称为p
("print")的标志被设置为true。
当该标志为true时,将打印通过Awk的每一行输入。当标志为false时,禁止打印行。
当读取以E
,I
或O
开头的行,然后是@
,并且不包含两个额外的文本匹配时,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