tldr;SAN CLI命令发出可怕的格式设置,使自动化变得困难。此格式已修复。
我的问题:我正在尝试编写计划的SAN快照的联机和脱机脚本,但是SAN CLI将文本包装在不方便的地方。
所需的解决方案输出(每个记录(是两个字段,快照和状态,在一行上:
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行。
示例。
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
有人能为我们提供一个合理的解决方案吗还有什么我可以在linux盒子上运行的吗?
干杯,Jason
这个awk做到了:
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/online匹配时,递增计数器c
,然后创建状态并将其保存到数组o
。只要第一列中有内容(即,行上的第一个字段与行上的前27个字符匹配(,就添加到卷数据信息中。处理完文件后,打印出两个数组的相应项。
测试
真实:
$ 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
最长:
$ 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
最短:
$ 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不假设有扩展的正则表达式,所以你必须做一些调整:
$ 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:观察到了这种行为
$ 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