复制出现在特定模式之前的字符串。

复制出现在特定模式之前的字符串。

emuEventTrapInformative我要从下面复制这个。

-- 陷阱
   emuEventTrapInformative TRAP类型
        企业 康柏
        变量 { scellNameDateTime,
                     货架编号,
                     搁架元素类型,
                     货架元素编号,
                     搁置错误代码 }

我想要做的是寻找TRAP-TYPE文件中的第一个实例并复制该行之前的所有内容。

emuEventTrapInformative将根据文件的不同而变化
使用任何 sed/grep/awk。

答案1

使用awk

$ awk '/TRAP-TYPE/ {print $1; exit}' foo

笔记

TRAP-TYPE这仅在 OP 案例中只有一个字段时才有效


例子

$ cat foo
sCSISmart5  TRAP-TYPE
    ENTERPRISE  cyclone
    VARIABLES {cycHostAdapterNumber, cycHostAdapterID, cycManagerID}
    DESCRIPTION
    "The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
    --#TYPE "Host Adapter changed"
    --#SUMMARY "The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
    --#ARGUMENTS {0,1,2}
    --#SEVERITY CRITICAL
    --#TIMEINDEX 100
    --#STATE OPERATIONAL
    --#HELP "scsismrt.hlp"
    --#HELPTAG 109
::=  109

--This Trap is issued when a Host adapter fails.

sCSISmart6  TRAP-TYPE
    ENTERPRISE  cyclone
    VARIABLES {cycHostAdapterNumber}
    DESCRIPTION
    "The HostAdapter# %d has Failed"
    --#TYPE "Host adapter failed"
    --#SUMMARY "The HostAdapter# %d has Failed"
    --#ARGUMENTS {0}
    --#SEVERITY CRITICAL
    --#TIMEINDEX 100
    --#STATE OPERATIONAL
    --#HELP "scsismrt.hlp"
    --#HELPTAG 110
::=  110

$ awk '/TRAP-TYPE/ {print $1; exit}' foo
sCSISmart5

答案2

您可以使用grep

$ grep -m 1 TRAP-TYPE file
   emuEventTrapInformative TRAP-TYPE

指示在第一次匹配后退出。若要仅获取部分,只需删除-m 1其前面的任何空格即可:grepemuEventTrapInformativeTRAP-TYPE

$ grep -m 1 TRAP-TYPE file | sed 's/ *TRAP-TYPE//'
   emuEventTrapInformative

或者,您可以使用展望

$ grep -Pom 1 '.*(?=TRAP-TYPE)' file 
   emuEventTrapInformative 

告诉仅打印行的匹配部分,并-o启用支持前瞻的 Perl 兼容正则表达式。grep-P

答案3

这是一个sed版本:

sed -n 's/TRAP-TYPE//p' inp-file.txt

对于您提供的示例,输出是:

sed -n 's/TRAP-TYPE//p' inp-file.txt                                        
emuEventTrapInformative 

在您的原始问题中,您请求文件中 TRAP-TYPE 的第一个实例。如果您有多个实例,sed -n 's/TRAP-TYPE//p' | head -n1则可以解决问题

这是另一个提取版本多种的字符串(以防万一您需要一个),如果文件中有多个 TRAP-TYPE 实例。

$ awk 'BEGIN {RS="TRAP-TYPE"} NR>1{ print previous } {previous=$NF}' inp-file.txt                                                     
emuEventTrapInformative
someOtherString

解释

RS 是记录分隔符。我们将整个文本分成记录,使用 TRAP-TYPE 作为字符串,然后在分隔符前打印最后一项。问题是最后一条记录以花括号结尾。因此,为了避免这种情况,我们使用NR>1{print previous}{previous=$NF}构造以便可以忽略最后一行。

我的inp文件.txt

-- Traps
   emuEventTrapInformative TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

-- Traps
   someOtherString TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

答案4

以下是 Perl 版本:

< inputfile perl -ne 's/^ +(.*) +TRAP-TYPE/$1/&&print'
  • -nwhile (<>) {[...]}在脚本周围放置一个循环
  • -e:从参数中读取脚本

Perl 命令分解:

  • s:断言执行替换
  • /:开始模式
  • ^: 匹配行首
  • +: 匹配一个或多个字符
  • (.*): 匹配并将任意数量的任意字符组合在一个或多个字符之前
  • TRAP-TYPE:匹配一个TRAP-TYPE字符串
  • /:停止模式/开始替换字符串
  • $1: 用捕获的组替换
  • /:停止替换字符串/启动修饰符

相关内容