grep并在Unix Shell脚本中为每个文件返回一个结果

grep并在Unix Shell脚本中为每个文件返回一个结果,shell,sorting,unix,scripting,grep,Shell,Sorting,Unix,Scripting,Grep,我试图grep到一个有几个文件的目录中,我试图按IP地址grep,我的问题是,在一个文件中,IP地址至少重复了3到4次,我只想得到一个结果,然后在另一个文件中继续grep 这就是我想做的,我没有任何运气 grep 10.01.10.0 log/MY_DIRECTORY_FILES* | sort -t . -k 2 | head -1 这只是返回一个结果。head-1返回它看到的整个输入的第一行。它位于已排序管道的末尾 所以grep从每个文件中吐出每一行匹配的内容排序然后对所有行进行排序并输出

我试图grep到一个有几个文件的目录中,我试图按IP地址grep,我的问题是,在一个文件中,IP地址至少重复了3到4次,我只想得到一个结果,然后在另一个文件中继续grep

这就是我想做的,我没有任何运气

grep 10.01.10.0 log/MY_DIRECTORY_FILES* | sort -t . -k 2 | head -1

这只是返回一个结果。

head-1
返回它看到的整个输入的第一行。它位于已排序管道的末尾

所以
grep
从每个文件中吐出每一行匹配的内容<代码>排序然后对所有行进行排序并输出它们
head
然后返回它看到的第一行

那不是你想要的。您希望
grep
在每个文件的第一次匹配后停止。幸运的是,
grep
-m
选项就是这样做的

-m NUM,--max count=NUM

Stop reading a file after NUM matching lines.  If the  input  is
standard  input  from a regular file, and NUM matching lines are
output, grep ensures that the standard input  is  positioned  to
just  after the last matching line before exiting, regardless of
the presence of trailing context lines.  This enables a  calling
process  to resume a search.  When grep stops after NUM matching
lines, it outputs any trailing context lines.  When  the  -c  or
--count  option  is  also  used,  grep  does  not output a count
greater than NUM.  When the -v or --invert-match option is  also
used, grep stops after outputting NUM non-matching lines.
因此,您要使用:

grep -m 1 10.01.10.0 log/MY_DIRECTORY_FILES* | sort -t . -k 2
如果您的
grep
(OpenBSD?Solaris?)版本没有
-m
选项(并且没有任何其他等效选项),则必须多次运行
grep

for file in log/MY_DIRECTORY_FILES*; do
    grep 10.01.10.0 "$file" | head -n 1
done | sort -t . -k 2
为了避免运行
grep
N次,您还可以使用类似的方法(使用
gawk
):

对于非
gawk
,您需要类似的东西(未经测试):


head-1
返回它看到的整个输入的第一行。它位于已排序管道的末尾

所以
grep
从每个文件中吐出每一行匹配的内容<代码>排序然后对所有行进行排序并输出它们
head
然后返回它看到的第一行

那不是你想要的。您希望
grep
在每个文件的第一次匹配后停止。幸运的是,
grep
-m
选项就是这样做的

-m NUM,--max count=NUM

Stop reading a file after NUM matching lines.  If the  input  is
standard  input  from a regular file, and NUM matching lines are
output, grep ensures that the standard input  is  positioned  to
just  after the last matching line before exiting, regardless of
the presence of trailing context lines.  This enables a  calling
process  to resume a search.  When grep stops after NUM matching
lines, it outputs any trailing context lines.  When  the  -c  or
--count  option  is  also  used,  grep  does  not output a count
greater than NUM.  When the -v or --invert-match option is  also
used, grep stops after outputting NUM non-matching lines.
因此,您要使用:

grep -m 1 10.01.10.0 log/MY_DIRECTORY_FILES* | sort -t . -k 2
如果您的
grep
(OpenBSD?Solaris?)版本没有
-m
选项(并且没有任何其他等效选项),则必须多次运行
grep

for file in log/MY_DIRECTORY_FILES*; do
    grep 10.01.10.0 "$file" | head -n 1
done | sort -t . -k 2
为了避免运行
grep
N次,您还可以使用类似的方法(使用
gawk
):

对于非
gawk
,您需要类似的东西(未经测试):

多亏了伊坦·瑞森 这是他的解决方案,对我有效

grep-l 10.01.10.0日志/MY_目录_文件*| wc-l

我使用grep-l10.01.10.0 log/MY_DIRECTORY_FILES*进行了验证,只显示了1个结果

谢谢

谢谢伊坦·瑞森 这是他的解决方案,对我有效

grep-l 10.01.10.0日志/MY_目录_文件*| wc-l

我使用grep-l10.01.10.0 log/MY_DIRECTORY_FILES*进行了验证,只显示了1个结果


谢谢

您需要实际匹配吗?或者文件中的匹配计数也可以吗?我将获取匹配计数,但首先我要确保我没有从同一个文件中获取匹配。问题是匹配计数是否是您真正想要的,或者您是否确实想要内容。因为这可以改变一切。我想要计数,但我不想要一个文件的3或4个匹配的计数,我只想要1个匹配的1个文件,然后继续下一个文件,对于每个文件,计数将是1,以防它与我试图为每个文件找到的模式匹配。您只想要具有匹配的文件的计数吗?那为什么要分类呢?
grep-l 10.01.10.0 log/MY_DIRECTORY_FILES*| wc-l
能满足您的需求吗?您需要实际匹配吗?或者文件中的匹配计数也可以吗?我将获取匹配计数,但首先我要确保我没有从同一个文件中获取匹配。问题是匹配计数是否是您真正想要的,或者您是否确实想要内容。因为这可以改变一切。我想要计数,但我不想要一个文件的3或4个匹配的计数,我只想要1个匹配的1个文件,然后继续下一个文件,对于每个文件,计数将是1,以防它与我试图为每个文件找到的模式匹配。您只想要具有匹配的文件的计数吗?那为什么要分类呢?
grep-l 10.01.10.0 log/MY_DIRECTORY_FILES*| wc-l
能满足你的需要吗?不幸的是,我尝试了这个选项,但我得到了一个错误,我只有grep-b,-c,-h,-I,-l,-n,-s,-v,w这些选项与grep-b,-c,-h,-I,-l,-n,-s,-v,w一起使用