删除两个字符串之间的行

删除两个字符串之间的行

我要使用 shell 中的 sed、Grep、awk 等工具删除从文件开头到某个点的所有字符串

输入

sCSISmart20 陷阱型                                  
    企业旋风                                                  
    描述                                          
    “Aspi:无法读取文件服务器硬盘可能有问题”                           
    --#TYPE "Aspi:无法读取数据库文件"                                 
    --#SUMMARY“ASPI:无法读取文件,服务器硬盘可能有问题”                                     
    --#参数{}                                 
    --#严重警告                                         
    --#TIMEINDEX 100                                                    
    --# 状态运行                                          
    --#帮助 “scsismrt.hlp”                                                      
    --#帮助标签 124                         
::= 124                                                                                            

sCSISmart21 陷阱类型                                     
    企业旋风                                                
    描述                                                      
    “Aspi:数据库已损坏”                                                  
    --#TYPE "Aspi:数据库已损坏"                                          
    --#SUMMARY“ASPI:数据库文件已损坏”                                              
    --#参数{}                                                             
    --#严重警告                   
    --#TIMEINDEX 100                           
    --# 状态运行                              
    --#帮助 “scsismrt.hlp”                        
    --#帮助标签 125
::= 125                

sCSISmart12 陷阱类型                                                
    企业旋风                                                        
    变量 {cycHostAdapterNumber、cycScsiTargetID、cycLun、cycVendor、cycProduct、cycSenseInfo}                                                       
    描述                           
    “HostAdapter# %d、TargetID %d、Lun# %d 对供应商 %s 产品 %s 具有预测故障条件,检测信息 MSB(检测代码)、接下来的 8 位(检测代码质量)、接下来的 8 位(添加检测代码质量)LSB (0000) %d”            
    --#TYPE “设备发生 SMART/预测故障事件”                   
    --#SUMMARY “HostAdapter# %d、TargetID %d、Lun# %d 在供应商 %s 产品 %s 上具有预测故障条件,其感知信息为 %d”                  
    --#参数{0,1,2,3,4,5}                      
    --#严重性信息                
    --#TIMEINDEX 100                        
    --# 状态运行                       
    --#帮助 “scsismrt.hlp”                     
    --#帮助标签 116                                 
::= 116                       

代码

sed/grep/awk (something that deletes from first line to ::= xxx(a random number))

输出

                                                  
sCSISmart21 陷阱类型                                     
    企业旋风                                                
    描述                                                      
    “Aspi:数据库已损坏”                                                  
    --#TYPE "Aspi:数据库已损坏"                                          
    --#SUMMARY“ASPI:数据库文件已损坏”                                              
    --#参数{}                                                             
    --#严重警告                   
    --#TIMEINDEX 100                           
    --# 状态运行                              
    --#帮助 “scsismrt.hlp”                        
    --#帮助标签 125
::= 125                

sCSISmart12 陷阱类型                                                
    企业旋风                                                        
    变量 {cycHostAdapterNumber、cycScsiTargetID、cycLun、cycVendor、cycProduct、cycSenseInfo}                                                       
    描述                           
    “HostAdapter# %d、TargetID %d、Lun# %d 对供应商 %s 产品 %s 具有预测故障条件,检测信息 MSB(检测代码)、接下来的 8 位(检测代码质量)、接下来的 8 位(添加检测代码质量)LSB (0000) %d”            
    --#TYPE “设备发生 SMART/预测故障事件”                   
    --#SUMMARY “HostAdapter# %d、TargetID %d、Lun# %d 在供应商 %s 产品 %s 上具有预测故障条件,其感知信息为 %d”                  
    --#参数{0,1,2,3,4,5}                      
    --#严重性信息                
    --#TIMEINDEX 100                        
    --# 状态运行                       
    --#帮助 “scsismrt.hlp”                     
    --#帮助标签 116                                 
::= 116   

因此,您会看到只有文件的第一部分被删除了。稍后我可以将其放入循环中,以便一次删除一个段落。
另外每个文件都由一个空白链接分隔,因此您还可以告诉我从第一行到遇到的第一个空白行删除的内容。

答案1

使用sed

< inputfile sed '1,/::=/d' > outputfile
  • < inputfileinputfile:将的内容重定向到sedstdin
  • > outputfilesed:将 的内容重定向stdoutoutputfile

sed命令分解:

  • 1,/::=/d:删除第一行与第一行匹配::=正则表达式之间的所有行(包括第一行)

使用awk

< inputfile awk 'NR==1,/::=/ {next}; {print}' > outputfile
  • < inputfileinputfile:将的内容重定向到sedstdin
  • > outputfilesed:将 的内容重定向stdoutoutputfile

awk命令分解:

  • NR==1,/::=/ {next}:如果在第一个和第一个匹配正::=则表达式的记录之间(包括),则跳过该记录
  • {print}:打印记录

使用 Perl:

 < inputfile perl -0777 -pe 's/^(.*\n)*?::=.*\n//' > outputfile
  • -0777:一次性读取整个文件,而不是一次读取一行
  • -pwhile (<>) {[...]}在脚本周围放置一个循环并打印处理后的文件
  • -e:从参数中读取脚本

Perl 命令分解:

  • s:断言执行替换
  • /:开始模式
  • ^(.*\n)*?::=.*\n: 在文件开头的当前行中贪婪地匹配任何字符零次或多次(即, ( .) 模式将在当前行中尽可能多地匹配)和一个换行符,在当前文件中懒惰地匹配零次或多次(即,模式(.*\n)将在当前文件中尽可能少地匹配)在字符串之前::=,然后在当前行和换行符中贪婪地匹配任何字符零次或多次
  • /:停止模式/开始替换字符串
  • /:停止替换字符串/启动修饰符

答案2

另一个awk版本:

awk '/sCSISmart(12|20)\s+TRAP-TYPE/,/::=/ {print}' foo
  • /sCSISmart(12|20)\s+TRAP-TYPE/

    比赛sCSISmart12 TRAP-TYPEsCSISmart20 TRAP-TYPE

    明确你需要什么


输出

sCSISmart20 TRAP-TYPE                                  
    ENTERPRISE  cyclone                                                  
    DESCRIPTION                                          
    "Aspi: unable to read the file server hard disk might have problems"                           
    --#TYPE "Aspi: unable to read the database file"                                 
    --#SUMMARY "ASPI: unable to read the file, server hard disk may have problems"                                     
    --#ARGUMENTS {}                                 
    --#SEVERITY WARNING                                         
    --#TIMEINDEX 100                                                    
    --#STATE OPERATIONAL                                          
    --#HELP "scsismrt.hlp"                                                      
    --#HELPTAG 124                         
::=  124                                                                                            
sCSISmart12 TRAP-TYPE                                                
    ENTERPRISE  cyclone                                                        
    VARIABLES {cycHostAdapterNumber, cycScsiTargetID, cycLun, cycVendor, cycProduct, cycSenseInfo}                                                       
    DESCRIPTION                           
    "The HostAdapter# %d, TargetID %d, Lun# %d has Predictive Failure Condition on vendor %s product %s with sense info MSB(sense code), next  8 bits (sense code Qual) next 8 bits (Add sense code Qual) LSB (0000) %d"            
    --#TYPE "Device has SMART/Predicictive failure event"                   
    --#SUMMARY "The HostAdapter# %d , TargetID %d, Lun# %d has Predictive Failure Condition on vendor %s product %s with senseinfo %d"                  
    --#ARGUMENTS {0,1,2,3,4,5}                      
    --#SEVERITY INFORMATIONAL                
    --#TIMEINDEX 100                        
    --#STATE OPERATIONAL                       
    --#HELP "scsismrt.hlp"                     
    --#HELPTAG 116                                 
::=  116 

答案3

纯 BASH 方法

下面的脚本将文件作为命令行参数,并且仅在::=遇到第一个字符串后打印所有行。

#!/bin/bash
main(){
    local flag=false
    while IFS= read -r line;
    do 
        case "$line" in
            *"::="*) flag=true && continue ;;
        esac
        $flag && echo "$line"
    done  < "$1"
}
main "$@"

测试运行(同意OP期望的输出):

$ ./remove_paragraph.sh  input.txt                                                                    

sCSISmart21 TRAP-TYPE                                     
    ENTERPRISE  cyclone                                                
    DESCRIPTION                                                      
    "Aspi: database is corrupted"                                                  
    --#TYPE "Aspi: database is corrupted"                                          
    --#SUMMARY "ASPI: database file is corrupted"                                              
    --#ARGUMENTS {}                                                             
    --#SEVERITY WARNING                   
    --#TIMEINDEX 100                           
    --#STATE OPERATIONAL                              
    --#HELP "scsismrt.hlp"                        
    --#HELPTAG 125

sCSISmart12 TRAP-TYPE                                                
    ENTERPRISE  cyclone                                                        
    VARIABLES {cycHostAdapterNumber, cycScsiTargetID, cycLun, cycVendor, cycProduct, cycSenseInfo}                                                       
    DESCRIPTION                           
    "The HostAdapter# %d, TargetID %d, Lun# %d has Predictive Failure Condition on vendor %s product %s with sense info MSB(sense code), next  8 bits (sense code Qual) next 8 bits (Add sense code Qual) LSB (0000) %d"            
    --#TYPE "Device has SMART/Predicictive failure event"                   
    --#SUMMARY "The HostAdapter# %d , TargetID %d, Lun# %d has Predictive Failure Condition on vendor %s product %s with senseinfo %d"                  
    --#ARGUMENTS {0,1,2,3,4,5}                      
    --#SEVERITY INFORMATIONAL                
    --#TIMEINDEX 100                        
    --#STATE OPERATIONAL                       
    --#HELP "scsismrt.hlp"                     
    --#HELPTAG 116

相关内容