我有一个如下图所示的模式。我正在尝试提取多行记录(从Dr Group Name到第一个空白行)。我试过了:
awk 'BEGIN{RS="\n" } /DR Group Name: \\Data Replication\\mc_wtec_1/,/\n/'
但它给了我所有四个记录。
Storage WWN: 50001FE15007DBA0
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD0002400001800000
DR Group Name: \Data Replication\vanilla_dr
WWID list:
600508B4001078F10002400002D20000
Storage WWN: 50001FE15007DBD0
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD0002400001800000
DR Group Name: \Data Replication\vanilla_dr
WWID list:
600508B4001078F10002400002D20000
答案 0 :(得分:2)
RS="\n"
部分是奇怪的;是不是默认记录分隔符?删除它对匹配的输出没有影响,我不指望它。
结束模式也是假的。您正在搜索包含换行符的行,但awk
会从输入行中删除换行符,因此它与任何内容都不匹配,因此模式范围从第一行DR Group Name
行延伸到结束行文件。
你想寻找一条空行;那是/^$/
。因此:
$ awk '/DR Group Name: \\Data Replication\\mc_wtec_1/,/^$/' data
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD0002400001800000
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD0002400001800000
$
答案 1 :(得分:0)
awk '/wtec_1/ {ok=1} /^$/ {ok=0} {if(ok){print $0}}' filename
你似乎问过什么。基于样本。
答案 2 :(得分:0)
看起来您只需要删除“存储WWN”行,然后您将获得每条记录:
< input sed '/^Storage WWN/d' | awk '{ print "Record: ", $0 }' RS=
例如,要获得第三条记录:
< input sed '/^Storage WWN/d' | awk NR==3 RS=
要获取mc_wtec_1,请尝试:
< input sed '/^Storage WWN/d' | awk '/mc_wtec_1/' RS=
(在上述所有情况中,假设您的输入数据位于名为“input”的文件中。该文件可以指定为sed
的参数,而不是由shell重定向,并进行重定向在'sed'之前没有必要。)
答案 3 :(得分:0)
搜索花样并在其后打印两行:
awk '/ DR Group Name: \Data Replication\mc_wtec_1/{print;for(i=1;i<=3;i++){getline;print}}' filename
或更好的方式,
在脚本中添加正则表达式搜索模式
awk '/ DR Group Name: \\Data Replication\\mc_wtec_1/,/([A-Z]+[0-9]+)/' filename
([A-Z]+[0-9]+)
会查找600508B4001078FD0002400001800000
模式
<强>输出:强>
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD0002400001800000
DR Group Name: \Data Replication\mc_wtec_1
WWID list:
600508B4001078FD000240000180000000