我想知道下面的命令是如何工作的。
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
我还想知道如何仅从第二行开始检查文本Oracle、OCI等。
3条答案
按热度按时间9udxz4iz1#
第一步是写得更容易阅读
它将以"Conditional jump ..."开头、以"==...=="结尾的行累加到一个变量字符串中。如果累加的字符串与多个模式不匹配,则打印该字符串。
我还想知道如何仅从第二行开始检查文本Oracle、OCI等。
这是什么意思?我假设你不想在输出中看到"条件跳转..."行。如果是这样的话,那么使用
next
命令跳转到下一行输入。ztyzrc3y2#
或许可以将这些
regex
合并为一个链?kpbwa7wx3#
有两个习惯用语需要理解。
第一种可以简化为:
为什么这样做?在awk中,
flag
可以被测试,即使还没有定义,这是独立的flag
正在做的-输入只在flag
为真时才被打印,flag=1
只在正则表达式/^22$/
之后才被执行。在这个简单的例子中,flag
为真的条件以正则表达式/^31$/
结束。这是
awk
中的一个习惯用法,用于在不同行上的两个正则表达式匹配之间执行代码。在您的示例中,这两个正则表达式是:
另一个“尴尬”是这样的:
当
block
为true时,将$0
收集到str
中,但第一次收集时,RS
不应添加到最后一次收集之间。结果为:两者都依赖于awk能够无错误地使用未定义的变量