打印包含一些特定字符串的第一个文件的内容

打印包含一些特定字符串的第一个文件的内容

我正在寻找一个命令,该命令打印在 /etc 中找到的第一个包含字符串的文件的内容,10.17.1或者130.236.189需要使用的命令是:find,,,,和。grepheadxargscat

在 Ravexina 回答之前并在一些帮助下我得到了如下的结果。

sudo egrep –rl '(10.17.1|130.236.189)' /etc | head -1 | cat

答案1

我会选择这个:

grep  -lRE  '10.17.1|130.236.189' /etc/ | head -1 | xargs cat
  • grep与 -R 一起使用以/etc进行递归搜索,而与 -E 一起使用则可以使用扩展的 grep 功能。
  • 带有 grep 的开关-l用于仅打印文件名而不是内容。
  • 然后将其通过管道传输到xargsxargs,并将文件名作为参数输入到 torcat
  • 毕竟 cat 会将其打印出来。

如果必须使用find

find /etc/ 2> /dev/null | xargs grep -lE '10.17.1|130.236.189' 2> /dev/null | head -1 | xargs cat

2> /dev/null当我是普通用户时,我习惯忽略权限错误,如果您正在使用sudo,则无需使用它们;)

答案2

我认为你可以head通过xargs使用退出状态作为命令grep中的逻辑谓词find,例如

find /etc -type f -exec grep -IFq -e '10.17.1' -e '130.236.189' {} \; -exec cat {} \; -quit

标志的解释grep

  • -I忽略二进制文件(通常不想 grep 这些文件)
  • -F将模式视为固定字符串而不是正则表达式(避免转义句点 - 但代价是不能使用正则表达式运算符|
  • -q如果发现任何匹配项,则立即以零状态退出

第一个grep找到匹配的文件将导致它以零状态退出,这反过来又会导致在该文件上find执行。假设成功,那么将只打印第一个匹配文件的内容。catcatfindquit

答案3

我会这么做:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

其工作方式基本如下:

  • 我们让它find处理定位文件(-type f)并为每个文件使用-exec ... {}\;标志执行一个命令
  • 该特定命令的形式为bash -c 'command1;command2' arg1 arg2
  • 找到的每个文件都作为参数传递给命令本身 bash -c,并在命令本身中被称为$1变量
  • grep -q将悄悄检查文件中的基本正则表达式10\.17\.1\|130\.236\.189,如果找到文本则以 0 退出,如果未找到则以 1 退出。
  • 成功找到文本后,我们使用printf命令打印文件名,然后打印cat文件。

测试运行:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

>>> ./somefile.txt
10.17.1
some other text
>>> ./somefile2.txt
another file, 130.236.189
some other text

相关内容