![复制出现在特定模式之前的字符串。](https://linux22.com/image/873330/%E5%A4%8D%E5%88%B6%E5%87%BA%E7%8E%B0%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%89%8D%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E3%80%82.png)
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
其前面的任何空格即可:grep
emuEventTrapInformative
TRAP-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'
-n
:while (<>) {[...]}
在脚本周围放置一个循环-e
:从参数中读取脚本
Perl 命令分解:
s
:断言执行替换/
:开始模式^
: 匹配行首+
: 匹配一个或多个字符
(.*)
: 匹配并将任意数量的任意字符组合在一个或多个字符之前
TRAP-TYPE
:匹配一个TRAP-TYPE
字符串/
:停止模式/开始替换字符串$1
: 用捕获的组替换/
:停止替换字符串/启动修饰符