AWK在循环中搜索和解析数据

时间:2014-02-26 17:16:53

标签: awk

我有一个包含多行的命令并找到详细信息

runmqsc -cert -details -pw test1 -db 123.kdb -label "Mahendra1" 

输出:

label : mahendra1
issuer : cn=mahendra2, OS=abcd
subject :
----------
=mahendra3, os=hkjkj 
Not Before : 10 oct 2013
not after :  20 oct 2014

现在我必须从上面的命令(mahendra2)中提取issuer值,并且必须使用下一个迭代命令。

runmqsc -cert -details -pw test1 -db 123.kdb -label "Mahendra2" 

输出:

label : mahendra2
issuer : cn=mahendra3, OS=abcd
subject :CN=mahendra4, os=hkjkj 
Not Before : 10 oct 2014
not after :  20 oct 2015

在一个时间点发行人和主题值将是相同的。即可以5-6次迭代。

label : mahendra5
issuer : cn=mahendra6, OS=abcd
subject :CN=mahendra6, os=hkjkj 
Not Before : 10 oct 2014
not after :  20 oct 2015

有没有办法在awk中执行?

1 个答案:

答案 0 :(得分:1)

回答这个问题:

is there any way to execute in awk ?

你很可能用awk执行此操作。我实际上有一个较旧的gawk作为awk链接。我很好奇是否可以完全用“awk”完成,所以我们就是这样。

请注意,这是完全滥用awk ,因为awk旨在解决输入文件问题。但是,如果您将所有逻辑放入BEGIN块,那么您所要求的技术是可行的。我没有你的命令,因此我使用cat模拟了使用label和issuer字段命名的文件的行为。我将以下内容放入名为abuse的文件中:

#!/usr/bin/awk -f

BEGIN {
    label="mahendra1"
    # j is a safety so you do not infinitely loop
    while( abuseAwk( withCmdForLabel() ) && ++j < 10 ) {
        # do nothing here
    }
}

# There is no input file, so the body will never execute anything.
# This is *why* this script is an abuse of awk
# Putting commands here would cause awk to "hang", while waiting for input
# An END block would also "hang" for the same reason.

function abuseAwk( cmd ) {
    printf( "cmd = %s\n", cmd )
    while( cmd | getline ) {
        FS="="  # set this here after getline has assigned $0
        if( $0 ~ /^issuer/ ) { i = $2; sub( /,.*$/, "", i ); label = i }
        if( $0 ~ /^subject/ ) { s = $2; sub( /,.*$/, "", s ) }
    }
    close( cmd )

    return( i != s )
}

# you could rewrite the sprintf for your command
function withCmdForLabel() { return( sprintf( "cat %s", label ) ) }

chmod +x abuse使其可执行。第一个label被硬编码以保持纯粹在awk领域。它的唯一输出是命令的形式,因为它在abuseAwk()函数中运行。

很多更好的选择是使用bash或其他脚本语言来执行循环命令(然后可以提供一个非常简单的awk脚本),你应该永远将此代码投入生产。