简体   繁体   English

awk或sed命令基于定界符从文本文件中提取行

[英]awk or sed command to extract lines based on a delimiter from a text file

My file say 'file.txt' has below content, 我的文件说“ file.txt”具有以下内容,

---
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
...

I would like to extract lines using --- as the delimiter for each controller. 我想使用---作为每个控制器的分隔符来提取行。 Something like controller[0] will give me details of 1st controller and controller[1] of 2nd controller. 像controller [0]这样的东西会给我第一控制器和第二控制器的详细信息。

I tried to search but could not find any relevant answer. 我尝试搜索,但找不到任何相关答案。

Using awk 使用awk

Based on some assumption, below 2 examples can be used to search controller config one by one, if this isn't a one which you are looking for edit, your question and brief us clearly. 基于某种假设,下面的两个示例可用于一个一个地搜索控制器配置,如果这不是您要编辑的一个,请提出问题并清楚地向我们介绍。

Either 要么

# 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

Or 要么

# 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

Test Results: 检测结果:

Input: 输入:

$ 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
...

Output-1: 输出1:

$ 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
...

Output-2: 输出2:

$ 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
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM