我需要检索仅在总命令行中出现在括号中的数字。
例如:
$ cat exa.lg
02:57:25 BROKER : Unable to open errno =. (1295)
02:57:25 BROKER 1: Unable to open (45)
02:57:25 BROKER 1: Unable to open 999. (13)
02:57:25 BROKER : Unable to open 1295, (1098)
我需要获取括号中的错误号信息1295
,而不是命令行 ( BROKER : Unable to open 1295
)
我尝试过这个:
cat exa.lg | awk -F '[)(]' '{print $2}' | grep -E '1295|13' exa.lg
02:57:25 BROKER : Unable to open errno =. (1295)
02:57:25 BROKER 1: Unable to open 999. (13)
02:57:25 BROKER : Unable to open 1295, (1098)
但我得到了两个1295
数字(包括 中的数字02:57:25 BROKER : Unable to open 1295
)。
我只想取02:57:25 BROKER : Unable to open errno =. (1295)
。
我怎样才能做到这一点?
答案1
在正则表达式中包含括号。您需要转义它们,因为它们在正则表达式中具有特殊含义。
grep -E '\((1295|13)\)' exa.lg
答案2
简单的awk解决方案:
awk '/\((1295|13)\)/{ print }' exa.lg
输出:
02:57:25 BROKER : Unable to open errno =. (1295)
02:57:25 BROKER 1: Unable to open 999. (13)
/\((1295|13)\)/
- 匹配一条记录(1295)
或(13)
一条记录内的内容。 (也可以表示为/(1295)|(13)/
)
答案3
我假设您想要打印包含 a13
或1295
括号中的所有行。如果是这样,您可以执行以下操作:
$ grep -E '\(1295|13\)' exa.lg
02:57:25 BROKER : Unable to open errno =. (1295)
02:57:25 BROKER 1: Unable to open 999.
cat
不需要原始命令的 ,因为两者都awk
可以grep
将文件名作为输入。另外,您的操作awk
毫无意义,因为您的grep
操作是在文件 ( grep exa.lg
) 上运行,而不是在 awk 的输出上运行。
答案4
cat input | grep ".=" > output
或者
cat input | grep "errno" > output
你将拥有:
02:57:25 BROKER : Unable to open errno =. (1295)
但您必须确保所有这些类型的行都具有这些唯一标识符(即其他行都没有这些单词/符号):
“errno”或“=”。