首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed或awk解析多路径输出

使用sed或awk解析多路径输出
EN

Stack Overflow用户
提问于 2012-08-23 03:40:09
回答 7查看 3.5K关注 0票数 6

我正在尝试为我正在编写的脚本解析linux上的多路径输出,但是我找不到正确的SED或AWK语法来获得我想要的结果。我一直在浏览各种网站和stackoverflow示例,但没有太多运气。

我想找到一种方法来制作:

代码语言:javascript
复制
temp (360a98000572d4d2d5834566c64536b46) dm-4 NETAPP,LUN
[size=20G]
2:0:0:4  sde        8:64  [active][ready]
1:0:0:4  sdm        8:192 [active][ready]
redo (360a98000572d4d2d5834566c646c366c) dm-3 NETAPP,LUN
[size=5.0G]
2:0:0:3  sdd        8:48  [active][ready]
1:0:0:3  sdl        8:176 [active][ready]

看起来像这样:

代码语言:javascript
复制
temp (360a98000572d4d2d5834566c64536b46) dm-4 NETAPP,LUN [size=20G] 2:0:0:4  sde        8:64  active][ready]
temp (360a98000572d4d2d5834566c64536b46) dm-4 NETAPP,LUN [size=20G] 1:0:0:4  sdm        8:192 [active][ready]
redo (360a98000572d4d2d5834566c646c366c) dm-3 NETAPP,LUN [size=5.0G] 2:0:0:3  sdd        8:48  [active][ready]
redo (360a98000572d4d2d5834566c646c366c) dm-3 NETAPP,LUN [size=5.0G] 1:0:0:3  sdl        8:176 [active][ready]

**编辑Ok,所以更困难的是,我发现没有Netapp默认设置的多路径配置。这使得NETAPP、LUN不能保证处于在线状态。我已经开始做的事情:

代码语言:javascript
复制
/sbin/multipath -ll | grep -v "round-robin"| sed 's/\[feat.*//g' | sed ':a; $!N;s/\n\([^\n]*\[size\)/ \1/;ta;P;D'

它将大小放在主行上,以便给我提供其他匹配的东西:

代码语言:javascript
复制
360a98000572d4d2d5834664e68323436 dm-6 NETAPP,LUN [size=50G]
\_ 1:0:0:0  sda 8:0   [active][ready]
360a98000572d4d2d5834664e68395951 dm-7 NETAPP,LUN [size=275G]
\_ 1:0:0:7  sdb 8:16  [active][ready]

然而,我无法获得下面的任何示例来匹配"G[$“(我知道,如果有任何to卷,我将需要为T另一行),并给出正确的输出。

感谢所有人在下面提出建议**结束编辑

我知道如何清理空格,所以我会在得到正确的输出后再这样做。将开始多路径信息的行都以"LUN“结尾。服务器的每条LUN线路( sdx设备)下可以有1到8条路径。"()“前的部分可以是文本(别名),也可以是数字。

EN

回答 7

Stack Overflow用户

发布于 2012-08-23 04:04:16

一种方法:

script.awk的内容

代码语言:javascript
复制
$1 ~ /^([[:digit:]]:){3}[[:digit:]]$/ {
    printf "%s %s\n", line, $0; 
    next;
}

##$1 ~ /temp|redo/ {
$0 ~ /LUN$/ {
    getline l;
    line = $0 " " l;
}

假设infile包含问题的内容,请运行脚本,如下所示:

代码语言:javascript
复制
awk -f script.awk infile

输出如下:

代码语言:javascript
复制
temp (360a98000572d4d2d5834566c64536b46) dm-4 NETAPP,LUN [size=20G] 2:0:0:4  sde        8:64  [active][ready]                                                                                                                                
temp (360a98000572d4d2d5834566c64536b46) dm-4 NETAPP,LUN [size=20G] 1:0:0:4  sdm        8:192 [active][ready]                                                                                                                                
redo (360a98000572d4d2d5834566c646c366c) dm-3 NETAPP,LUN [size=5.0G] 2:0:0:3  sdd        8:48  [active][ready]                                                                                                                               
redo (360a98000572d4d2d5834566c646c366c) dm-3 NETAPP,LUN [size=5.0G] 1:0:0:3  sdl        8:176 [active][ready]
票数 2
EN

Stack Overflow用户

发布于 2012-08-23 04:00:31

我不知道input的确切规范,但下面这行代码可能会对您有所帮助:

awk '{if (/LUN$/){ prefix = $0; getline; prefix = prefix " " $0 } else {print prefix, $0} }'

  1. 它检查当前行是否以LUN结尾(通过将其与/LUN$/正则表达式进行匹配)
  2. 如果匹配,它将当前行与下一行连接起来(使用getline和隐式连接运算符)
  3. 如果不匹配,则输出当前记录以及LUN

PS:您可能需要额外的行过滤,这应该不难,只需在else分支中添加另一个if即可。

票数 1
EN

Stack Overflow用户

发布于 2012-08-23 13:47:06

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed '/LUN$/{N;y/\n/ /;h;d};G;s/^\([^\n]*\)\n\(.*\)/\2 \1/' file

解释:

  • /LUN$/{N;y/\n/ /;h;d}对于以保留空间( HS )结尾的行,将换行符添加到模式空间( PS )中,然后将新行替换为空格,将PS存储在保留空间(HS)中,然后删除PS并从所有其他行(路径行)的下一个cycle.
  • G开始,在PS.
  • s/^\([^\n]*\)\n\(.*\)/\2 \1/中附加新行,然后将HS的内容替换为第一个新行之前的任何内容,并将新行替换为空格,即将标题信息附加到路径行。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12080265

复制
相关文章

相似问题

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