AWK脚本输出不正确-列中重复

AWK脚本输出不正确-列中重复,awk,Awk,我试图提取多个脚本文件的描述,并在描述中包含脚本的文件名。我的问题是,该命令在第一列中生成多个重复的文件名。你能告诉我如何删除这些复制品吗 我也会从stackoverflow复制这段代码并修改它,但我不是100%理解它。如果您能解释一下gsub的功能以及$0、e=1和e==1的功能,我将不胜感激 我的代码 输入 local stdnse=需要“stdnse” 本地短端口=需要“短端口” 本地tn3270=需要“tn3270” 本地暴力=需要“暴力” 本地信誉=需要“信誉” 本地unpwdb=需要

我试图提取多个脚本文件的描述,并在描述中包含脚本的文件名。我的问题是,该命令在第一列中生成多个重复的文件名。你能告诉我如何删除这些复制品吗

我也会从stackoverflow复制这段代码并修改它,但我不是100%理解它。如果您能解释一下
gsub
的功能以及
$0
e=1
e==1
的功能,我将不胜感激

我的代码 输入
local stdnse=需要“stdnse”
本地短端口=需要“短端口”
本地tn3270=需要“tn3270”
本地暴力=需要“暴力”
本地信誉=需要“信誉”
本地unpwdb=需要“unpwdb”
本地nmap=需要“nmap”
本地字符串=需要“字符串”
说明=[[
IBM大型机(z/OS)的TSO用户ID枚举器。TSO登录面板
告诉您用户ID何时有效或何时无效,并显示以下消息:
IKJ56420I用户ID未被授权使用TSO
。 TSO登录过程可以通过两种方式工作: 1) 系统会提示您输入用户ID-
IKJ56700A 您使用要使用的用户对其进行回复。 如果用户ID有效,它将为您提供一个正常的 TSO登录屏幕。否则它将为您提供 上面的屏幕登录错误。 2) 您将获得TSO登录面板并输入您的用户ID 在
Userid==>
提示符处。如果 如果您收到上述错误消息,则表明用户ID无效。 此脚本依赖于NSE TN3270库,该库模拟 用于NMAP的TN3270屏幕。 TSO用户ID具有以下规则: -它不能以数字开头 -仅包含字母数字字符和@、#、$。 -它不能超过7个字符 ]] --- --@args tso-enum.commands需要分号分隔列表中的命令 --访问TSO。默认设置为
tso
。 -- --@用法 --nmap--script=tso枚举-p 23 -- --@用法 --nmap-sV-p 9923 10.32.70.10--script tso enum--script args userdb=tso_users.txt,tso enum.commands=“logon applid(tso)” 实际产量
tso-enum.nse=[[
tso-enum.nse IBM大型机(z/OS)的tso用户ID枚举器。tso登录面板
tso-enum.nse会在用户ID有效或无效时通知您,并显示以下消息:
tso-enum.nse
IKJ56420I用户ID未被授权使用tso
。 tso-enum.nse tso-enum.nse tso登录过程可以通过两种方式工作: tso-enum.nse 1)系统会提示您输入用户ID-
IKJ56700A tso-enum.nse,您可以使用要使用的用户对其进行回复。 tso-enum.nse如果用户ID有效,它将为您提供正常的 tso-enum.nse tso登录屏幕。否则它将为您提供 上述tso-enum.nse屏幕登录错误。 tso-enum.nse 2)您将获得tso登录面板并输入您的用户ID 在
Userid==>
提示符处显示tso-enum.nse tso-enum.nse如果您收到上面的错误消息,则该用户ID无效。 tso-enum.nse tso-enum.nse此脚本依赖于nse TN3270库,该库模拟 NMAP的tso-enum.nse TN3270屏幕。 tso-enum.nse tso-enum.nse tso用户ID具有以下规则: tso-enum.nse-它不能以数字开头 tso-enum.nse-仅包含字母数字字符和@、#、$。 tso-enum.nse-长度不能超过7个字符 期望输出
tso-enum.nse
说明=[[
IBM大型机(z/OS)的TSO用户ID枚举器。TSO登录面板
告诉您用户ID何时有效或何时无效,并显示以下消息:
IKJ56420I用户ID未被授权使用TSO
。 TSO登录过程可以通过两种方式工作: 1) 系统会提示您输入用户ID-
IKJ56700A 您使用要使用的用户对其进行回复。 如果用户ID有效,它将为您提供一个正常的 TSO登录屏幕。否则它将为您提供 上面的屏幕登录错误。 2) 您将获得TSO登录面板并输入您的用户ID 在
Userid==>
提示符处。如果 如果您收到上述错误消息,则表明用户ID无效。 此脚本依赖于NSE TN3270库,该库模拟 用于NMAP的TN3270屏幕。 TSO用户ID具有以下规则: -它不能以数字开头 -仅包含字母数字字符和@、#、$。 -它不能超过7个字符 ]] 理解 在这些块中,作者通过切换标志(
e
)来定义范围 / 超出上述范围:

# end of range
/\]\]/ {
    e = 0
}

# start of range
/description = \[\[/ {
    gsub("^.*description ", "", $0)
    e = 1
} 
字符串函数
gsub
用在第三个参数中找到的第二个参数替换第一个参数的任何出现。在这种情况下,regex
“^.*description”
匹配当前记录
$0
的开头(在这种情况下,记录是一行),直到字符串
说明
,并将其替换为空字符串,从而将其删除,保留实际说明的行

下面的最后一个块仅打印该行和
FILENAME
(如果它在描述范围内):

{
    if (e == 1) {
        print FILENAME, $0
    }
}

修改 所需的修改是在范围开始处打印
文件名
,在范围内缩进行,并对块重新排序:

# end range
/\]\]/ {
    e = 0
}

# in range
e == 1 {
    printf "\t%s\n", $0
}

# start range
/description = \[\[/ {
    print FILENAME
    e = 1
}
我删除了无用的(至少对于示例数据)
gsub()
调用

调用:

$ awk -f script.awk data.txt
输出:

$ awk -f script.awk data.txt

data.txt
IBM大型机(z/OS)的TSO用户ID枚举器。TSO登录面板
告诉您用户ID何时有效或何时无效,并显示以下消息:
IKJ56420I用户ID未被授权使用TSO
。 TSO登录过程可以通过两种方式工作: 1) 系统会提示您输入用户ID-
IKJ56700A 您使用要使用的用户对其进行回复。 如果用户ID有效,它将为您提供一个正常的 TSO登录屏幕。否则它将为您提供 屏幕标志