Regex awk输入文件在引号中有空格

Regex awk输入文件在引号中有空格,regex,awk,Regex,Awk,你好 尝试学习一些AWK,将一些Juniper防火墙配置转换为Cisco或Palo配置。其中一部分是解析配置。我这里有一个样本: set service "RDP" protocol tcp src-port 0-65535 dst-port 3389-3389 set service "LDAPS" protocol tcp src-port 0-65535 dst-port 636-636 set service "SOAPS" protocol tcp src-port 0-65535

你好

尝试学习一些AWK,将一些Juniper防火墙配置转换为Cisco或Palo配置。其中一部分是解析配置。我这里有一个样本:

set service "RDP" protocol tcp src-port 0-65535 dst-port 3389-3389 
set service "LDAPS" protocol tcp src-port 0-65535 dst-port 636-636 
set service "SOAPS" protocol tcp src-port 0-65535 dst-port 444-444 
set service "KEYS-ADMIN" protocol tcp src-port 0-65535 dst-port 9000-9000 
set service "WSUS-MDM" protocol tcp src-port 0-65535 dst-port 8530-8530 
set service "WSUS-MDM" + tcp src-port 0-65535 dst-port 8531-8531 
set service "WSUS-MDM" + tcp src-port 0-65535 dst-port 8531-8531 
set service "HTTPS-MDM" protocol tcp src-port 0-65535 dst-port 8443-8443 
set service "IPSEC - 4500" protocol udp src-port 0-65535 dst-port 4500-4500 
set service "IPSEC - 4500" + tcp src-port 0-65535 dst-port 1433-1433 
set service "IPSEC - 4500" + tcp src-port 0-65535 dst-port 1433-1433 
set service "OKFTP" protocol tcp src-port 0-65535 dst-port 2169-2169 
set service "Bomgar 8200" protocol tcp src-port 0-65535 dst-port 8200-8200 
set service "Cisco VPN" protocol tcp src-port 0-65535 dst-port 10000-10000 
set service "Cisco VPN 2" protocol tcp src-port 0-65535 dst-port 10000-10000 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 10000-10000 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 500-500 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 4500-4500 
set service "Cisco VPN 2" + 50 src-port 0-65535 dst-port 0-65535 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 10000-10000 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 500-500 
set service "Cisco VPN 2" + udp src-port 0-65535 dst-port 4500-4500 
set service "TrendMicro8080" protocol tcp src-port 0-65535 dst-port 8080-8080 
set service "TrendMicro26980" protocol tcp src-port 0-65535 dst-port 26980-26980 
set service "TrendMicro26980" + udp src-port 0-65535 dst-port 26980-26980 
set service "PenPal Test" protocol tcp src-port 0-65535 dst-port 522-522 
set service "HTTP8080" protocol tcp src-port 0-65535 dst-port 8080-8080 
set service "HTTPS445" protocol tcp src-port 0-65535 dst-port 445-445 
set service "MOBILEIRON-TLS" protocol tcp src-port 0-65535 dst-port 9997-9997 
set service "MOBILEIRON-TLS" + tcp src-port 0-65535 dst-port 9998-9998 
我将这段代码保存到一个名为test1的文件中,并从命令行运行以下命令:

awk -F " " 'BEGIN {OFS=","} {print $3,$5,$7,$9}' test1
虽然它基本上是有效的,但是包含在“”中的空格被awk视为有效空格。输出:

"RDP",tcp,0-65535,3389-3389
"LDAPS",tcp,0-65535,636-636
"SOAPS",tcp,0-65535,444-444
"KEYS-ADMIN",tcp,0-65535,9000-9000
"WSUS-MDM",tcp,0-65535,8530-8530
"WSUS-MDM",tcp,0-65535,8531-8531
"WSUS-MDM",tcp,0-65535,8531-8531
"HTTPS-MDM",tcp,0-65535,8443-8443
"IPSEC,4500",udp,0-65535
"IPSEC,4500",tcp,0-65535
"IPSEC,4500",tcp,0-65535
"OKFTP",tcp,0-65535,2169-2169
"Bomgar,protocol,src-port,dst-port
"Cisco,protocol,src-port,dst-port
"Cisco,2",tcp,0-65535
"Cisco,2",udp,0-65535
"Cisco,2",udp,0-65535
"Cisco,2",udp,0-65535
"Cisco,2",50,0-65535
"Cisco,2",udp,0-65535
"Cisco,2",udp,0-65535
"Cisco,2",udp,0-65535
理想情况下,我希望awk忽略“”中的空格。我想我可以把它添加为正则表达式?我用“!”吗以某种方式不确定。任何帮助都将不胜感激。

实现最终结果的方法可能有很多种(甚至可能是
awk
包含在内的方法):

另一种可能的方法是使用
sed

sed 's/\("[^"]*"\)* \("[^"]*"\)*/\1,\2/g' test1
…或通过管道连接到
awk

sed 's/\("[^"]*"\)* \("[^"]*"\)*/\1,\2/g' test1 | awk -F ',' 'BEGIN {OFS=","} {print $3,$5,$7,$9}'
输出:

"RDP",tcp,0-65535,3389-3389
"LDAPS",tcp,0-65535,636-636
"SOAPS",tcp,0-65535,444-444
"KEYS-ADMIN",tcp,0-65535,9000-9000
"WSUS-MDM",tcp,0-65535,8530-8530
"WSUS-MDM",tcp,0-65535,8531-8531
"WSUS-MDM",tcp,0-65535,8531-8531
"HTTPS-MDM",tcp,0-65535,8443-8443
"IPSEC - 4500",udp,0-65535,4500-4500
"IPSEC - 4500",tcp,0-65535,1433-1433
"IPSEC - 4500",tcp,0-65535,1433-1433
"OKFTP",tcp,0-65535,2169-2169
"Bomgar 8200",tcp,0-65535,8200-8200
"Cisco VPN",tcp,0-65535,10000-10000
"Cisco VPN 2",tcp,0-65535,10000-10000
"Cisco VPN 2",udp,0-65535,10000-10000
"Cisco VPN 2",udp,0-65535,500-500
...

awk解决方案是在了解后发现的。

看,我需要一段时间,但我最终明白了诀窍!左侧和右侧的组隐藏了带引号的空格,ok,并且由于您附加到每个组的
*
量词,当前字段之间的空格也会更改。。。聪明。@GBOFI,事实证明我的方法比它需要的要复杂一点(我假设),但很高兴你学到了一些东西。我发布了一个更新的解决方案,专门针对awk:)
"RDP",tcp,0-65535,3389-3389
"LDAPS",tcp,0-65535,636-636
"SOAPS",tcp,0-65535,444-444
"KEYS-ADMIN",tcp,0-65535,9000-9000
"WSUS-MDM",tcp,0-65535,8530-8530
"WSUS-MDM",tcp,0-65535,8531-8531
"WSUS-MDM",tcp,0-65535,8531-8531
"HTTPS-MDM",tcp,0-65535,8443-8443
"IPSEC - 4500",udp,0-65535,4500-4500
"IPSEC - 4500",tcp,0-65535,1433-1433
"IPSEC - 4500",tcp,0-65535,1433-1433
"OKFTP",tcp,0-65535,2169-2169
"Bomgar 8200",tcp,0-65535,8200-8200
"Cisco VPN",tcp,0-65535,10000-10000
"Cisco VPN 2",tcp,0-65535,10000-10000
"Cisco VPN 2",udp,0-65535,10000-10000
"Cisco VPN 2",udp,0-65535,500-500
...