【问题标题】:How to print a line along with its matching pattern using grep如何使用 grep 打印一行及其匹配模式
【发布时间】:2017-08-24 12:39:08
【问题描述】:

我想使用 grep 或 awk 或 sed 打印匹配的字符串以及匹配的行,最好使用 grep,因为我想在一个大文件上执行此操作,而 grep 给了我最好的时间。

例如: 如果我想匹配“你好” 然后使用命令:grep 'hello' filename,我得到结果:echo hello World

使用命令:grep -o 'hello' filename,我可以得到结果:

hello

无论如何我都能得到结果:

echo hello World , hello

或类似的。 帮助将不胜感激

编辑

你好只是一个例子,它也可以是一个从文件中获取的变量,因此它不是静态的,如果我们有多个匹配,那么它们都应该被附加。

编辑 2

作为前面编辑的一个例子,考虑一个文件keywords,它有内容

hello
why

我们还有另一个文件,我们将在其中检查这些关键字 testfile,其中包含内容

this line contains hello world
this line contains why hello world

所以当我们运行 grep 时,我们可以得到如下答案:

描述|正则表达式(标记为 grep 结果),

this line contains hello world|hello
this line contains why hello world|hello,why 

【问题讨论】:

  • 您能否说明预期的输出?
  • grep 进行基于行的匹配,一行可以匹配模式多次,在这种情况下你会打印什么?您想将 regex 模式hello 也是 regex)或 行中的匹配部分附加到输出?
  • hello 只是一个例子,它也可以是从文件中获取的变量,因此它不是静态的,如果我们有多个匹配,那么所有这些都可以附加、匹配部分或只是正则表达式 I think 可以用 -F 简单解决
  • @AklankJain 你能告诉我们一些预期的输出吗?
  • @xtonousou 我在描述中添加了一个示例

标签: linux bash awk sed grep


【解决方案1】:

我会使用awk:

awk -v OFS=' , ' 'match($0,/PATTERN/){print substr($0,RSTART,RLENGTH),$0}' file

见awk手册match()

【讨论】:

  • 对。 awk -v OFS=' , ' 'match($0,/PATTERN/){print $0, substr($0,RSTART,RLENGTH)}' file 产生预期的输出。
  • 我明白了。请问您为什么从不使用awk '...' OFS='something' file?我的意思是它是 POSIX 并且需要更少的击键。
  • 因为在脚本之后定义的变量在 BEGIN 部​​分中不可用(尝试 awk 'BEGIN{print OFS}' OFS=,awk -v OFS=, 'BEGIN{print OFS}'),我宁愿不必考虑我的变量在哪些上下文中可用.我通常也反对按顺序定义变量在使用它们之后 - 我想在变量出现在我的脚本中之前查看我的变量初始值,而不是之后!最后 - 它弄乱了 ARGV,所以我不能再循环通过 ARGV 来查看我的输入文件名。
  • 好的。谢谢你的解释。
  • 对,在文件之间将变量设置为不同的值正是该功能有用的地方。
【解决方案2】:

sed方法:

假设我们有文件testfile 的内容:

dfdsgg
echo hello World
dfget2rfd hel
sdfs hello .. hello again
ssdf h3tgdfg

sed -n 's/.*\(hello\).*/&, \1/p' testfile

输出:

echo hello World, hello
sdfs hello .. hello again, hello

【讨论】:

    最近更新 更多