Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在UNIX shell中,如何查找包含特定字符串的所有文件,然后打印每个文件的第4行?_Shell_Unix_Command Line_Sed_Grep - Fatal编程技术网

在UNIX shell中,如何查找包含特定字符串的所有文件,然后打印每个文件的第4行?

在UNIX shell中,如何查找包含特定字符串的所有文件,然后打印每个文件的第4行?,shell,unix,command-line,sed,grep,Shell,Unix,Command Line,Sed,Grep,我想找到当前目录中包含给定字符串的所有文件,然后只打印每个文件的第4行 grep --null -l "$yourstring" * | # List all the files containing your string xargs -0 sed -n '4p;q' # Print the fourth line of said files. 不同版本的grep有稍微不同的--null咒语,但它通常以某种形式存在。详细信息请阅读您的手册页 更新:我相信grep的一个空文件列表咒语是一个

我想找到当前目录中包含给定字符串的所有文件,然后只打印每个文件的第4行

grep --null -l "$yourstring" * | # List all the files containing your string
  xargs -0 sed -n '4p;q' # Print the fourth line of said files.
不同版本的grep有稍微不同的
--null
咒语,但它通常以某种形式存在。详细信息请阅读您的手册页

更新:我相信grep的一个空文件列表咒语是一个合理的解决方案,它将覆盖绝大多数真实世界的用例,但为了完全可移植,如果您的
grep
版本不支持任何空输出,那么将其与
xargs
一起使用并不完全安全,因此,您必须求助于
查找

find . -maxdepth 1 -type f -exec grep -q "$yourstring" {} \; -exec sed -n '4p;q' {} +

由于
find
参数几乎都可以用作谓词,因此
-exec grep-q..
部分将最终提供给
sed
的文件过滤为仅包含所需字符串的文件。

尝试下面的GNU find命令

find . -maxdepth 1 -type f -exec grep -l 'yourstring' {} \; | xargs -I {} awk 'NR==4{print; exit}' {}

它会查找当前目录中包含特定字符串的所有文件,并打印每个文件中的行号4。

此for循环应该可以工作:

while read -d '' -r file; do
    echo -n "$file: "
    sed '4q;d' "$file"
done < <(grep --null -l "some-text" *.txt)
读取-d'-r文件时;做
echo-n“$文件:”
sed'4q;d“$file”
从其他用户处完成:


grep-Frl字符串xargs-n1sed-n4p

您尝试了什么,它是如何失败的?但是基本上
grep-Frl字符串xargs-n1 sed-n4p
我试过:
grep'mystring'*-r | sed-n4p
谢谢你的工作完美且快速。这将递归到比当前目录更多的目录。这一次在我身上超时你可以写这个
查找…-exec grep-q'yourstring'{}-exec awk'NR==4'{}+
。另外,
awk'NR==4{print;exit;}'
将在打印第四行后让awk退出。@kojiro感谢您的注释。但是如果没有grep
l
,我如何获得文件名。@AvinashRaj
-exec
结果也可以用作
查找中的谓词。由于当一行匹配时,
grep-q
将基本上返回“true”或“false”,因此下一个
-exec
语句将根据
grep
的结果执行或不执行
find
将提供适用的文件名。+1但请注意,此空文件是GNU扩展,不完全可移植。@tripleee它不仅仅是GNU扩展。它也存在于BSD
grep
中。这并不是说它是完美的标准,但正如我在回答中所说,它通常以某种形式存在。我会用一个更可移植的解决方案更新我的答案。如果一些文件的名称中有换行符呢?