我想 grep 包含以下内容的行
- 0 amount
- 122,000,000 amount
- 50,000 amount
我尝试过使用
grep -rhI " - * amount ".
但它会输出包含的任何内容
-
无论是否包含
amount
问题是我只想要字符串
- * amount
其中*
表示介于 之间的任何内容- (here) amount
。如果只包含“-”的行被忽略,这是可以接受的。
但这不起作用。
答案1
将*
匹配零个或多个前面的字符或图案。
这意味着- * amount
将匹配
- amount
- amount
- amount
- (ETC。)
要匹配您编写的数字,请使用- [0-9,]+ amount
as 模式。将+
强制至少匹配前面的正则表达式,并将[0-9,]
匹配任何数字或逗号。
给定以下文件:
- 0 amount
- 122,000,000 amount
- 50,000 amount
- amount
- amount
- some amount
这将起作用:
$ grep -E -e '- [0-9,]+ amount' file
- 0 amount
- 122,000,000 amount
- 50,000 amount
需要-E
是因为+
它是扩展的正则表达式运算符,并且-e
需要 是因为否则-
模式中的 会被解释为grep
(-e
意味着下一个是grep
应用于其输入的正则表达式) 的选项。没有-E
,用\{1,\}
代替+
。
您还可以将模式锚定到行的开头和结尾:
$ grep -E '^ - [0-9,]+ amount$' file
这意味着-e
不再需要 ,并将确保该行以空格开头,后跟破折号和数字等,就像以前一样。该字符串amount
必须是该行的最后一个内容(我们使用 将该单词锚定到该行的末尾$
)。
答案2
类似的东西可以完成这项工作(使用 awk 脚本,搜索第一个标记是破折号,第三个标记是字符串“amount”):
awk '$1=="-" && $3=="amount" {print $2}'
如果您想打印整行,请使用以下命令:
awk '$1=="-" && $3=="amount" {print}'
答案3
你也可以使用
grep -rhI -- '- [^ ]* amount' /path/to/parent/dir/*
其中[^ ]*
表示匹配除空格之外的任意数量的任何字符。