这是data.txt
:
+----------------------------+---------+-------------------+
| Hostname | Plan | Server |
+----------------------------+---------+-------------------+
| hostname1 | B20C120 | R1SG7.myfqdn.com |
| another-host-name | B40G66 | R1DC8.myfqdn.com |
| the-other-hostname-is-here | B180G22 | R1SG8.myfqdn.com |
| last.mydomain.com | B400C88 | R1DG10.myfqdn.com |
+----------------------------+---------+-------------------+
字符串
下面是awk
命令:
awk -F '|' 'NF>3 {
match($3, "B[0-9]{1,3}([CG])[0-9]{1,9}", plan);
match($4, "R[0-9]{1,2}[DS]([CG])[0-9]{1,3}\\.myfqdn\\.com", server);
match($2, "[a-zA-Z0-9 -.]{1,99}", server_name);
if (plan[1] != server[1])
print "wrong server ==> plan:", plan[0] ",", "server:", server[0] ", server_name:" server_name[0]
}' data.txt
型
这是我运行时的当前输出(这是预期的,很好):
wrong server ==> plan: B20C120, server: R1SG7.myfqdn.com, server_name: hostname1
wrong server ==> plan: B40G66, server: R1DC8.myfqdn.com, server_name: another-host-name
wrong server ==> plan: B400C88, server: R1DG10.myfqdn.com, server_name: last.mydomain.com
型
上述txt
和awk
的逻辑为:
计划名称中包含C或G(在B之后,B始终是第一个字母),服务器名称在R1 S或R1 D之后包含C或G。
例如,如果计划是B20C120,服务器是R1SG7,那么由于C和G不匹配,因此它是错误的计划服务器。
但是B180G22在R1SG8中,这是正确的。
我当前的awk
命令在我的脑海中有这个问题:
server
是打印出来的,但我必须写一个正则表达式。
我在awk
中尝试了这个:
match($2, server_name);
型
但得到了这个错误:
awk: cmd. line:6: (FILENAME=data.txt FNR=4) fatal: attempt to use scalar `server_name' as an array
型
也试过这个:
match($2, "(.*)", server_name);
型
但是对于这个,我用上面的行得到了当前输出。
预期
就是让server_name
更好
2条答案
按热度按时间omjgkv6w1#
使用您所展示的示例和尝试,请尝试遵循GNU
awk
代码。这种方法只使用一个单个数组,只捕获那些需要匹配的值。match
函数中使用正则表达式^\|[[:space:]]+([^[:space:]]+)[[:space:]]+\|[[:space:]](B[0-9]{1,3}([CG])[0-9]{1,9})[[:space:]]+\|[[:space:]]+(R[0-9]{1,2}[DS]([CG])[0-9]{1,3}\.myfqdn\.com)
。values
的数组中。values[1]
用于第一个捕获组。字符串
awk
中,[^[:space:]]
可以简单地写为\S
,[[:space:]]
可以简单地写为\s
。型
示例输出如下:
型
dffbzjpn2#
您可以使用此
gnu awk
解决方案:字符串
然后将其用作:
型
详情:
FS = "[[:blank:]]*\\|[[:blank:]]*"
将FS
设置为|
,两侧由可选空格包围/.../
而不是字符串作为正则表达式。^
和$
。FS
,我们不需要使用任何正则表达式来设置server_name
,只需要$2
赋值就足够了要直接从
bash
命令行使用此命令,请使用:用途:型