1

我在一个目录中有许多日志文件。我正在尝试编写一个脚本来搜索所有日志文件中的字符串并回显文件的名称和找到该字符串的行号。

我想我可能不得不使用 2 个 grep - 将一个的输出通过管道传输到另一个,因为 -l 选项只返回文件名,而没有关于行号的信息。任何有关我如何成功实现这一目标的见解都将不胜感激。

非常感谢,

亚历克斯

4

3 回答 3

5
$ grep -Hn root /etc/passwd
/etc/passwd:1:root:x:0:0:root:/root:/bin/bash

结合-H-n做你所期望的。

如果您想在不使用字符串的情况下回显所需的信息:

$ grep -Hn root /etc/passwd | cut -d: -f1,2
/etc/passwd:1

或使用

$ awk -F: '/root/{print "file=" ARGV[1] "\nline=" NR}' /etc/passwd
file=/etc/passwd
line=1

如果你想创建shell变量:

$ awk -F: '/root/{print "file=" ARGV[1] "\nline=" NR}' /etc/passwd | bash
$ echo $line
1
$ echo $file
/etc/passwd
于 2012-11-19T21:59:59.233 回答
2

使用-H. 如果您使用的 grep 没有-H,请指定两个文件名。例如:

grep -n pattern file /dev/null
于 2012-11-19T21:58:51.627 回答
0

我的 grep 版本不断从匹配的行返回文本,我不确定你是否在后面......你也可以将输出通过管道传递给一个awk命令,让它只打印文件名和行号

grep -Hn "text" . | awk -F: '{print $1 ":" $2}'

于 2012-11-19T22:12:08.233 回答