在UNIX shell中,如何查找包含特定字符串的所有文件,然后打印每个文件的第4行?
我想找到当前目录中包含给定字符串的所有文件,然后只打印每个文件的第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的一个空文件列表咒语是一个
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感谢您的注释。但是如果没有grepl
,我如何获得文件名。@AvinashRaj-exec
结果也可以用作查找中的谓词。由于当一行匹配时,grep-q
将基本上返回“true”或“false”,因此下一个-exec
语句将根据grep
的结果执行或不执行find
将提供适用的文件名。+1但请注意,此空文件是GNU扩展,不完全可移植。@tripleee它不仅仅是GNU扩展。它也存在于BSDgrep
中。这并不是说它是完美的标准,但正如我在回答中所说,它通常以某种形式存在。我会用一个更可移植的解决方案更新我的答案。如果一些文件的名称中有换行符呢?