Shell 在awk中,多个gsub()调用如何一个接一个地协同工作?

Shell 在awk中,多个gsub()调用如何一个接一个地协同工作?,shell,awk,gsub,Shell,Awk,Gsub,有人能帮我解释下面的awk命令吗?我不明白多个gsub函数在这里做什么 cat vslist.txt | awk '\''/:/{gsub(/ /, \"\", $0);gsub(/{/, \",\", $0);printf $s,$1}'\''");printf "\n"}' vslist.txt ltm pool PL_Axxxxx_POOL { members { ND_APIxxxxxx:7807 { address 12.7.21.6

有人能帮我解释下面的awk命令吗?我不明白多个gsub函数在这里做什么

cat vslist.txt | awk '\''/:/{gsub(/ /, \"\", $0);gsub(/{/, \",\", $0);printf $s,$1}'\''");printf "\n"}' 
vslist.txt

ltm pool PL_Axxxxx_POOL {
    members {
        ND_APIxxxxxx:7807 {
            address 12.7.21.6
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7809 {
            address 12.7.21.5
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7808 {
            address 12.7.21.9
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1
    ND_APIxxxxxx:7807
    ND_APIxxxxxx:7809
    ND_APIxxxxxx:7808
输出

ltm pool PL_Axxxxx_POOL {
    members {
        ND_APIxxxxxx:7807 {
            address 12.7.21.6
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7809 {
            address 12.7.21.5
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7808 {
            address 12.7.21.9
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1
    ND_APIxxxxxx:7807
    ND_APIxxxxxx:7809
    ND_APIxxxxxx:7808
gsub()
调用在适当的位置修改它们正在操作的变量(在本例中,
$0
)。因此,一个接一个地,第二个进一步改变第一个的输出

考虑以下脚本的简化和注释版本:

#!/bin/bash
awk '
  /:/ {                 # run the below code only for lines that contain :
    gsub(/ /, "", $0);  # remove all spaces
    gsub(/{/, "", $0);  # remove opening curly braces
    print $1            # print the first column in what's next
  }
' <vslist.awk           # with stdin from vslist.awk

使用该工具,示例输入的输出为:

输入:ND\u APIxxxxxx:7807{
在第一个gsub:ND_APIxxxxxx:7807之后{
第二次gsub后,全线为:ND_APIxxxxxx:7807
ND_APIxxxxxx:7807
输入:ND_APIxxxxxx:7809{
在第一个gsub:ND_APIxxxxxx:7809之后{
第二次gsub后,全线为:ND_APIxxxxxx:7809
ND_APIxxxxxx:7809
输入:ND_APIxxxxxx:7808{
在第一个gsub:ND_APIxxxxxx:7808之后{
第二次gsub后,全线为:ND_APIxxxxxx:7808
ND_APIxxxxxx:7808

…因此,您可以清楚地看到每个操作的发生(第一个操作剥离空格,第二个操作删除
{
)。

“请解释此代码”问题通常超出了我们的范围;请参见。也就是说,缩小问题的范围可能会改善它:您是否了解单个
gsub
调用的功能?您是否了解其中一个
gsub
调用,但不了解另一个?或者是对它们如何组合的真正误解?顺便问一句,奇怪的引用是什么?有相当多的误解在这里重新反斜杠,而不是在常规shell上下文中运行它。这是从其他引用上下文中的代码中获取的吗?…哦,等等,
$s
是外部变量吗?好的,以正确的方式传递该变量(使用
awk-v
)会使代码的其余部分更易于阅读。(此外,我们需要知道它包含什么才能正确理解此脚本;应测试代码段是否足够完整,以便有人重现问题中的行为,如帮助中心页面上的id所述)。