首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本/筛选多行和多字段记录,有可变行数

脚本/筛选多行和多字段记录,有可变行数
EN

Stack Overflow用户
提问于 2014-08-07 08:05:32
回答 1查看 388关注 0票数 0

SAN命令发布可怕的格式,使自动化变得困难。此格式是固定的。

我的问题是:我正在编写脱线的SAN快照的onlining和offlining脚本,但是SAN将文本包装在不方便的地方。

解决方案所需的输出(每条记录)是单行上的两个字段,即快照和状态:

代码语言:javascript
复制
VolumeName-YYYY-MM-DD-HH:MM:SS.NNNN.N online/offline
VolumeName-YYYY-MM-DD-HH:MM:SS.NNNN.N online/offline

注意: VolumeName可以有从1到64个字符,这会导致记录中有2-4行,调度也可以被命名,并且有多达64个字符,这些字符将导致记录为8行。

示例。

代码语言:javascript
复制
1. Real world
SAN-01> volume select hv01-200G show snapshots
Name                        Permission Status      Schedule Connections
--------------------------- ---------- ----------- -------- -----------
hv01-200G-2013-11-29-12:33: read-write offline              0
  54.1798.1
hv01-200G-2014-08-05-11:00: read-write offline     Site01 H 0
  00.9698.1                                          V Hour
                                                     ly

2. Longest possible volume name
SAN-01> volume select 123456789012345678901234567890123456789012345678901234
567890123 show snapshots
Name                        Permission Status      Schedule Connections
--------------------------- ---------- ----------- -------- -----------
123456789012345678901234567 read-write offline              0
  8901234567890123456789012
  34567890123-2014-08-07-13
  :05:09.9761.1
123456789012345678901234567 read-write online               0
  8901234567890123456789012
  34567890123-2014-08-07-13
  :05:23.9762.1


3. Shortest volume name
SAN-01> volume select X show snapshots
Name                        Permission Status      Schedule Connections
--------------------------- ---------- ----------- -------- -----------
X-2014-08-07-13:10:35.9764. read-write offline              0
  1
X-2014-08-07-13:10:46.9765. read-write online               0

1

有人能帮助我找到一个合理的解决方案吗? grep、sed、awk、perl或其他我可以在linux机器上运行的东西?

干杯,杰森

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-07 08:17:03

这只老头子的把戏是:

代码语言:javascript
复制
awk '/(on|off)line/ { o[++c]=$3 } substr($0,0,27)~$1 { v[c]=v[c] $1 } END{ for(i=1;i<=c;++i) print v[i],o[i] }' file

解释

当单词on/脱机匹配时,增加计数器c,然后创建状态并将其保存到数组o。只要第一列中有某些内容(即行上的第一个字段与行上的前27个字符相匹配),就添加到卷数据信息中。文件处理完毕后,打印出两个数组的对应项。

测试出来的

真实:

代码语言:javascript
复制
$ awk '/(on|off)line/ { o[++c]=$3 } substr($0,0,27)~$1 { v[c]=v[c] $1 } END{ for(i=1;i<=c;++i) print v[i],o[i] }' real    
hv01-200G-2013-11-29-12:33:54.1798.1 offline
hv01-200G-2014-08-05-11:00:00.9698.1 offline

最长:

代码语言:javascript
复制
$ awk '/(on|off)line/ { o[++c]=$3 } substr($0,0,27)~$1 { v[c]=v[c] $1 } END{ for(i=1;i<=c;++i) print v[i],o[i] }' longest 
123456789012345678901234567890123456789012345678901234567890123-2014-08-07-13:05:09.9761.1 offline
123456789012345678901234567890123456789012345678901234567890123-2014-08-07-13:05:23.9762.1 online

最短:

代码语言:javascript
复制
$ awk '/(on|off)line/ { o[++c]=$3 } substr($0,0,27)~$1 { v[c]=v[c] $1 } END{ for(i=1;i<=c;++i) print v[i],o[i] }' shortest 
X-2014-08-07-13:10:35.9764.1 offline
X-2014-08-07-13:10:46.9765.1 online

顺便提一下,您提到了在mawk中使用这个脚本时遇到了一些问题。我认为,原因是正则表达式在开头。mawk不假设扩展正则表达式,因此您必须进行一些调整:

代码语言:javascript
复制
$ mawk '/\(on\|off\)line/ { o[++c]=$3 } substr($0,0,27)~$1 { v[c]=v[c] $1 } END{ for(i=1;i<=c;++i) print v[i],o[i] }' real

应该行得通。请注意,我可能错了,因为我还没有对mawk进行测试,但我确实使用grep观察到了这种行为:

代码语言:javascript
复制
$ grep '(on|off)line' real                             # doesn't work
$ grep -E '(on|off)line' real                          # works (extended regexp)
hv01-200G-2013-11-29-12:33: read-write offline              0
hv01-200G-2014-08-05-11:00: read-write offline     Site01 H 0
$ grep '\(on\|off\)line' real                          # also works
hv01-200G-2013-11-29-12:33: read-write offline              0
hv01-200G-2014-08-05-11:00: read-write offline     Site01 H 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25177254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档