首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk或sed命令,用于根据分隔符从文本文件中提取行

awk或sed命令,用于根据分隔符从文本文件中提取行
EN

Stack Overflow用户
提问于 2017-11-07 16:54:18
回答 1查看 153关注 0票数 0

我的文件说'file.txt‘有下面的内容,

代码语言:javascript
复制
---
controller-name: RAID-1
host-power: on
has-error: No
info-valid: Yes
controller-health: Good
---
controller-name: RAID-2
host-power: on
has-error: No
info-valid: Yes
controller-health: Bad
...

我想使用---作为每个控制器的分隔符来提取行。类似控制器的东西会给我第一个控制器和第二个控制器的controller1的详细信息。

我试着搜索,但没有找到任何相关的答案。

EN

回答 1

Stack Overflow用户

发布于 2017-11-07 18:04:08

使用awk

基于一些假设,下面两个示例可以用来逐一搜索控制器配置,如果这不是您要编辑的配置,请您的问题并清楚地向我们介绍。

任一

代码语言:javascript
复制
# which will print and exit
# search for controller-name, increment variable
# print contents and exit

awk -v controller=1 '
         f && /^---/{exit}
         /^controller-name/{c++}
         f=c==controller
       ' infile

代码语言:javascript
复制
# which will save inside array
# used --- as row separator
# whenever controller-name awk finds, that line is saved in array
# in end block access it by a[0], a[1]....

awk -v RS='---' '
           /controller-name:/{
               gsub(/^\n|\n$/,"");
               a[c++]=$0
           }
           END{
              print a[0]
           }
          ' infile

测试结果:

输入:

代码语言:javascript
复制
$ cat infile 
---
controller-name: RAID-1
host-power: on
has-error: No
info-valid: Yes
controller-health: Good
---
controller-name: RAID-2
host-power: on
has-error: No
info-valid: Yes
controller-health: Bad
...

输出-1:

代码语言:javascript
复制
$ awk -v controller=1  'f && /^---/{exit}/^controller-name/{c++}f=c==controller' infile 
controller-name: RAID-1
host-power: on
has-error: No
info-valid: Yes
controller-health: Good

$ awk -v controller=2 'f && /^---/{exit}/^controller-name/{c++}f=c==controller' infile 
controller-name: RAID-2
host-power: on
has-error: No
info-valid: Yes
controller-health: Bad
...

输出-2:

代码语言:javascript
复制
$ awk -v RS='---' '/controller-name:/{gsub(/^\n|\n$/,"");a[c++]=$0}END{print a[0]}' infile 
controller-name: RAID-1
host-power: on
has-error: No
info-valid: Yes
controller-health: Good

$ awk -v RS='---' '/controller-name:/{gsub(/^\n|\n$/,"");a[c++]=$0}END{print a[1]}' infile 
controller-name: RAID-2
host-power: on
has-error: No
info-valid: Yes
controller-health: Bad
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47153590

复制
相关文章

相似问题

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