我想在多个文件中找到与两种模式之一匹配的所有行。我试图通过键入来找到我正在寻找的模式
grep (foo|bar) *.txt
Run Code Online (Sandbox Code Playgroud)
但是外壳将它解释|
为管道并在bar
不是可执行文件时抱怨。
如何在同一组文件中搜索多个模式?
说我有一个文件:
# file: 'test.txt'
foobar bash 1
bash
foobar happy
foobar
Run Code Online (Sandbox Code Playgroud)
我只想知道“foobar”后面出现什么词,所以我可以使用这个正则表达式:
"foobar \(\w\+\)"
Run Code Online (Sandbox Code Playgroud)
括号表示我对 foobar 后面的单词特别感兴趣。但是当我执行 a 时grep "foobar \(\w\+\)" test.txt
,我得到了与整个正则表达式匹配的整行,而不仅仅是“foobar 之后的单词”:
foobar bash 1
foobar happy
Run Code Online (Sandbox Code Playgroud)
我更希望该命令的输出如下所示:
bash
happy
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 grep 只输出与正则表达式中的分组(或特定分组)匹配的项目?
当我搜索一些不存在的进程时,例如
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Run Code Online (Sandbox Code Playgroud)
显然我不关心 grep - 这和搜索ps
过程一样有意义!
如何防止 grep 出现在结果中?
grep -c
对于查找字符串在文件中出现的次数很有用,但它每行只计算每次出现一次。如何计算每行出现的多次?
我正在寻找比以下更优雅的东西:
perl -e '$_ = <>; print scalar ( () = m/needle/g ), "\n"'
Run Code Online (Sandbox Code Playgroud) 谁能告诉我grep
, egrep
, 和之间的技术差异fgrep
并提供合适的示例?
我什么时候需要使用grep
over egrep
,反之亦然?
我的机器上有一些来自 Windows 系统的数据库转储。它们是文本文件。我正在使用 cygwin 来查看它们。这些似乎是纯文本文件;我用记事本和写字板等文本编辑器打开它们,它们看起来很清晰。但是,当我对它们运行 grep 时,它会说binary file foo.txt matches
.
我注意到这些文件包含一些 asciiNUL
字符,我认为它们是数据库转储中的工件。
那么是什么让 grep 认为这些文件是二进制的呢?的NUL
性格吗?文件系统上有标志吗?我需要更改什么才能让 grep 显示匹配行?
有没有办法使用 grep 搜索 PDF 文件,而无需先在 Ubuntu 中转换为文本?
作为此脚本的一部分,我需要能够检查给定的第一个参数是否与文件的第一个单词匹配。如果是,则退出并显示错误消息;如果没有,请将参数附加到文件中。我了解如何编写if
语句,但不了解如何grep
在脚本中使用。我知道这grep
看起来像这样
grep ^$1 schemas.txt
Run Code Online (Sandbox Code Playgroud)
我觉得这应该比我做的要容易得多。
我在声明中收到错误“参数太多” if
。我摆脱了之间的空间grep -q
,然后得到了一个预期的错误二元运算符。
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
Run Code Online (Sandbox Code Playgroud) 我正在使用脚本定期下载将原始 .eml 压缩为 .gz 文件的 gmail 邮件。该脚本为每一天创建一个文件夹,然后将每条消息压缩到其自己的文件中。
我想要一种在这个档案中搜索“字符串”的方法。
单独的 Grep 似乎无法做到这一点。我也试过 SearchMonkey。
因此,当我使用我正在处理的特定日志集时,拉开一个文件cat
然后使用它grep
来获取匹配的行只会让我走到这一步。它需要一种将行与模式匹配的方法,但仅在匹配后返回行的部分。比赛前后的部分将始终不同。我玩过使用sed
or awk
,但无法弄清楚如何过滤该行以在比赛前删除部分,或者在比赛后返回部分,两者都可以。这是我需要过滤的行的示例:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
Run Code Online (Sandbox Code Playgroud)
我需要的部分是“停滞”后的一切。
这背后的背景是我可以找出某些东西停顿的频率:
cat messages | grep stalled | wc -l
Run Code Online (Sandbox Code Playgroud)
我需要做的是找出某个节点停顿了多少次(由“停顿”之后每个冒号之前的部分表示。如果我只是为此(即 20 :)grep,它可能会返回软失败的行,但是没有停顿,这对我没有帮助。我只需要过滤停顿的部分,这样我就可以从那些停顿的节点中搜索特定节点。
出于所有意图和目的,这是一个带有标准 GNU 核心实用程序的 freebsd 系统,但我无法安装任何额外的东西来提供帮助。