unix 需要awk命令解释

yacmzcpb  于 2023-02-04  发布在  Unix
关注(0)|答案(3)|浏览(155)

我想知道下面的命令是如何工作的。

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等。

9udxz4iz

9udxz4iz1#

第一步是写得更容易阅读

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

它将以"Conditional jump ..."开头、以"==...=="结尾的行累加到一个变量字符串中。如果累加的字符串与多个模式不匹配,则打印该字符串。
我还想知道如何仅从第二行开始检查文本Oracle、OCI等。
这是什么意思?我假设你不想在输出中看到"条件跳转..."行。如果是这样的话,那么使用next命令跳转到下一行输入。

/Conditional jump or move depends on uninitialised value/ {
        block=1
        next
    }
ztyzrc3y

ztyzrc3y2#

或许可以将这些regex合并为一个链?

if (str !~ "oracle|OCI|tuxedo1222|v[f]?printf|vtrace") {

    print str
}
kpbwa7wx

kpbwa7wx3#

有两个习惯用语需要理解。
第一种可以简化为:

$ seq 100 | awk '/^22$/{flag=1} 
/^31$/{flag=0} 
flag' 
22
23
...
30

为什么这样做?在awk中,flag可以被测试,即使还没有定义,这是独立的flag正在做的-输入只在flag为真时才被打印,flag=1只在正则表达式/^22$/之后才被执行。在这个简单的例子中,flag为真的条件以正则表达式/^31$/结束。
这是awk中的一个习惯用法,用于在不同行上的两个正则表达式匹配之间执行代码。
在您的示例中,这两个正则表达式是:

/Conditional jump or move depends on uninitialised value/  # start
# in-between, block is true and collect the input into str separated by RS
/^==.*== $/   # end

另一个“尴尬”是这样的:

block {str=str sep $0; sep=RS}

block为true时,将$0收集到str中,但第一次收集时,RS不应添加到最后一次收集之间。结果为:

str="first lineRSsecond lineRSthird lineRS..."

两者都依赖于awk能够无错误地使用未定义的变量

相关问题