Linux Awk命令不能正常工作,输出错误,sed命令?

Linux Awk命令不能正常工作,输出错误,sed命令?,linux,bash,awk,sed,Linux,Bash,Awk,Sed,我在我的数据集上尝试了这个小脚本,但由于某种原因,我没有得到所需的输出?有人能看一下吗?也许你能弄明白?另外,如果您可以提供SED命令解决方案 剧本 awk -v RS= -F '<connection name="|<hostPort>' ' { sub(/".*/, "", $2) split($3, tokens, /[:<]/) printf "%-6s %s %s\n", $2, tokens[1], tokens[2] } ' 当注释引用时,正确的方法是使用

我在我的数据集上尝试了这个小脚本,但由于某种原因,我没有得到所需的输出?有人能看一下吗?也许你能弄明白?另外,如果您可以提供SED命令解决方案

剧本

awk -v RS= -F '<connection name="|<hostPort>' '
{
sub(/".*/, "", $2)
split($3, tokens, /[:<]/)
printf "%-6s %s %s\n", $2, tokens[1], tokens[2]
}
'

当注释引用时,正确的方法是使用适当的解析器

至于实验,这个GNU awk似乎可以处理您提供的输入数据,但不能保证一个健壮的解决方案,因为XML数据在您的文件中可能会有所不同

awk '/connection name=/{a=$0;getline; \
print gensub(/(.*connection name=["])(.[^"]*)(["].*)/,"\\2","g",a), \
gensub(/(<.*>)(.[^:]*)([:])(.[^<]*)(<[/].*>)/,"\\2 \\4","g",$0)}' file1

#Output:
boing_ny__Primary__ srv1 33333
boing_ny__Backup__ srv2 33333
boy_ny__Primary__ srv1 6666
boy_ny__Backup__ srv2 6666
song_ny__Primary__ srv1 55555
song_ny__Backup__ srv2 55555
bob_ny__Primary__ srv3 33333
bob_ny__Backup__ srv4 33333 

通用的awk gensub synthax是
gensub(regexp,replacement,how[,target])
,被替换的部分在gensub函数上返回/应用-

作为注释,正确的方法是使用适当的解析器

至于实验,这个GNU awk似乎可以处理您提供的输入数据,但不能保证一个健壮的解决方案,因为XML数据在您的文件中可能会有所不同

awk '/connection name=/{a=$0;getline; \
print gensub(/(.*connection name=["])(.[^"]*)(["].*)/,"\\2","g",a), \
gensub(/(<.*>)(.[^:]*)([:])(.[^<]*)(<[/].*>)/,"\\2 \\4","g",$0)}' file1

#Output:
boing_ny__Primary__ srv1 33333
boing_ny__Backup__ srv2 33333
boy_ny__Primary__ srv1 6666
boy_ny__Backup__ srv2 6666
song_ny__Primary__ srv1 55555
song_ny__Backup__ srv2 55555
bob_ny__Primary__ srv3 33333
bob_ny__Backup__ srv4 33333 
通用awk gensub synthax是
gensub(regexp,replacement,how[,target])
,被替换的部件返回/应用于gensub函数-

尝试:

awk '/connection/{match($0,/"[^"]*/);VAL=substr($0,RSTART+1,RLENGTH-1);next} /hostPort/ && VAL{match($0,/>.*</);print VAL FS substr($0,RSTART+1,RLENGTH-2)}'   Input_file
awk'/connection/{match($0,/“[^”]*/);VAL=substr($0,RSTART+1,RLENGTH-1);next}/hostPort/&&VAL{match($0,/>.*..*.<获取>到之间的所有内容,尝试:

awk'/connection/{match($0,/“[^”]*/);VAL=substr($0,RSTART+1,RLENGTH-1);next}/hostPort/&&VAL{match($0,/>.*..*.<获取>到之间的所有内容:
cat输入| awk-F'\“|>'{print$2}'| awk-F'稳健:
cat-input | awk-F'\“|>'{print$2}'| awk-F'
$awk-F'[”:]'/hosport/{if(n!=“”)print n,$3,$4;n=“”;next}{n=$3}文件
boing_ny_________________srv1 33333
boing_ny_________________srv2 33333
男孩纽约小学srv1 6666
男孩-纽约-后备-srv2 6666
宋尼小学srv1 55555
宋尼备份srv2 55555
bob_ny___________________________srv3 33333
bob_ny___________________________srv4 33333
$awk-F'[“:]”/hostPort/{if(n!=“”)打印n,$3,$4;n=“”;下一个}{n=$3}文件
boing_ny_________________srv1 33333
boing_ny_________________srv2 33333
男孩纽约小学srv1 6666
男孩-纽约-后备-srv2 6666
宋尼小学srv1 55555
宋尼备份srv2 55555
bob_ny___________________________srv3 33333
bob_ny___________________________srv4 33333


使用XML解析器而不是awk/sed。由您来测试/使用/抛出
awk-vrs='{$1=$1;match($0,/connection name=“([^”]+).*(.*)/,a);gsub(/:/,”,a[2]);}长度(a[1]){打印a[1],a[2]}
请用散文形式描述您的小脚本的用途。这将有助于读者理解代码(或其中的错误)使用所有角度来理解您自己的代码及其错误行为。这类似于使用非awk/sed的XML解析器。由您来测试/使用/抛出
awk-v RS=''{$1=$1;match($0,/connection name=“([^”]+)*(.*)/,a);gsub(/:/,”,a[2]);}长度(a[1]){打印a[1],a[2]}“
请用散文描述你的小脚本的目的。这将有助于读者理解代码(或其中的错误)并且可能有助于你自己发现问题。从各个角度理解你自己的代码及其错误行为。这类似于@universeisflat严重更新-之前错误的概念-现在应该可以了。+ve用于很好的解释:)@universeisflat严重更新-之前错误的概念-现在应该可以了。+ve用于很好的解释:)请使用换行符来提高可读性,而不需要太多的滚动。如果两个版本之间的唯一区别是注释,那么为什么不删除第一个(和第二个)呢版本?是的,撇号破坏了代码,因为awk被混淆了。干得好!@GeorgeVasiliou-awk绝对不会被任何地方的撇号混淆。将包含撇号的脚本放在名为script的文件中,并以
awk-f script
的形式执行,以确认这一点。问题是,在撇号de中不能使用撇号限制脚本,因为shell不允许使用它,因为shell将脚本中的撇号视为该脚本的退出点。这与awk或sed或从shell调用的任何其他脚本无关-这是一个shell功能。@RavinderSingh13当然,我完全支持使用空白,但您的大量缩进实际上会造成您的代码更难阅读。也许可以尝试在每个缩进级别中插入4个左右的空格,而不是30个空格或其他任何您正在使用的空格?如果违背传统观念,坚持使用所有大写变量名,总有一天当您的用户定义变量名与内置变量名发生冲突时,会对您造成伤害。@Ed:T谢谢你的建议,我会努力避免用大写字母表示变量(我记得你告诉过我两三次).另外,对于缩进部分,我已经写了很长的脚本,因此以这种方式缩进它们已成为习惯,我也将尝试使用它。请使用换行符来提高可读性,而不需要太多滚动。如果两个版本之间的唯一区别是注释,那么为什么不删除第一个(和第二个)呢版本?是的,撇号破坏了代码,因为awk被混淆了。干得好!@GeorgeVasiliou-awk绝对不会被任何地方的撇号混淆。将包含撇号的脚本放在名为script的文件中,并以
awk-f script
的形式执行,以确认这一点。问题是,在撇号de中不能使用撇号限制脚本,因为shell不允许使用它,因为shell将脚本中的撇号视为该脚本的退出点。这与awk或sed或从shell调用的任何其他脚本无关-这是一个shell功能。@RavinderSingh13当然,我完全支持使用空白,但您的大量缩进实际上会造成你的代码更难阅读。也许试着在每个缩进级别中插入4个左右的空格,而不是30个空格或你正在使用的任何东西?而且,违背传统智慧,坚持使用所有大写变量名,总有一天,当你的用户定义变量名与bu冲突时,会让你难受
awk '/connection name=/{a=$0;getline; \
print gensub(/(.*connection name=["])(.[^"]*)(["].*)/,"\\2","g",a), \
gensub(/(<.*>)(.[^:]*)([:])(.[^<]*)(<[/].*>)/,"\\2 \\4","g",$0)}' file1

#Output:
boing_ny__Primary__ srv1 33333
boing_ny__Backup__ srv2 33333
boy_ny__Primary__ srv1 6666
boy_ny__Backup__ srv2 6666
song_ny__Primary__ srv1 55555
song_ny__Backup__ srv2 55555
bob_ny__Primary__ srv3 33333
bob_ny__Backup__ srv4 33333 
gensub(/(.*connection name=["])(.[^"]*)(["].*)/,"\\2","g",a)
#all chars up to first " --|       |      |       |    |  |
#after " and up to the next "------|      |       |    |  |
#after last " up to the end of $0 --------|       |    |  |
#replace with group 2 ----------------------------|    |  |
#global replacement------------------------------------|  |
#target = a = previous record-----------------------------|

#With a = <connection name="boing_ny__Primary__" transport="tcp">
#Above gensub will return group2 = boing_ny__Primary__


gensub              (/(<.*>)(.[^:]*)([:])(.[^<]*)(<[/].*>)/,"\\2 \\4","g",$0)
#all chars between < >--|       |     |     |        |          |      |  |
#all chars up to : -------------|     |     |        |          |      |  |
#literal : ---------------------------|     |        |          |      |  |
#the part after : and before < -------------|        |          |      |  |
#the last < > part ----------------------------------|          |      |  |
#use group 2 and 4 ---------------------------------------------|      |  |
#global replacement ---------------------------------------------------|  |
#target = $0 current record ----------------------------------------------|

#With $0 = <hostPort>srv2:33333</hostPort>
#Above gensub will return group 2 = srv2 and group 4 = 33333 --> srv2 33333
awk '/connection/{match($0,/"[^"]*/);VAL=substr($0,RSTART+1,RLENGTH-1);next} /hostPort/ && VAL{match($0,/>.*</);print VAL FS substr($0,RSTART+1,RLENGTH-2)}'   Input_file
awk '/connection/{                                                    #### Looking for a line which has string connection in it.
                        match($0,/"[^"]*/);                           #### Using match function here to match a regex where it starts from " and looks for first occurrence of ".
                        VAL=substr($0,RSTART+1,RLENGTH-1);            #### Now creating a variable named VAL whose value is substring of RSTART and LENGTH, where RLENGTH and RSTART are the default keywords of awk and they will be SET when a REGEX match is found. RSTART will give the index of starting point of match and RLENGTH will give the length of that regex match.
                        next                                          #### Using next keyword to skip all further statements.                               
                 }
    /hostPort/ && VAL{                                                #### Checking here 2 conditions, it checks for a line which has hostport string and value of variable VAL is NOT NULL, if these conditions are TRUE then perform following actions.
                        match($0,/>.*</);                             #### using match function of awk to get the srv values so putting here regex so match from >.*< get everything between > to <.
                        print VAL FS substr($0,RSTART+1,RLENGTH-2)    #### printing value of VAL(which got created in previous condition) then printing the substring of RSTART and RLENGTH values here.
                     }
    '  Input_file                                                     #### Mentioning the Input_file here.
$ awk -F'[":<>]' '/hostPort/{if (n!="") print n, $3, $4; n=""; next} {n=$3}' file
boing_ny__Primary__ srv1 33333
boing_ny__Backup__ srv2 33333
boy_ny__Primary__ srv1 6666
boy_ny__Backup__ srv2 6666
song_ny__Primary__ srv1 55555
song_ny__Backup__ srv2 55555
bob_ny__Primary__ srv3 33333
bob_ny__Backup__ srv4 33333