我要使用 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
< inputfile
inputfile
:将的内容重定向到sed
的stdin
> outputfile
sed
:将 的内容重定向stdout
到outputfile
sed
命令分解:
1,/::=/d
:删除第一行与第一行匹配::=
正则表达式之间的所有行(包括第一行)
使用awk
:
< inputfile awk 'NR==1,/::=/ {next}; {print}' > outputfile
< inputfile
inputfile
:将的内容重定向到sed
的stdin
> outputfile
sed
:将 的内容重定向stdout
到outputfile
awk
命令分解:
NR==1,/::=/ {next}
:如果在第一个和第一个匹配正::=
则表达式的记录之间(包括),则跳过该记录{print}
:打印记录
使用 Perl:
< inputfile perl -0777 -pe 's/^(.*\n)*?::=.*\n//' > outputfile
-0777
:一次性读取整个文件,而不是一次读取一行-p
:while (<>) {[...]}
在脚本周围放置一个循环并打印处理后的文件-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-TYPE
和sCSISmart20 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