如何在先前运行的命令的输出中搜索字符串

如何在先前运行的命令的输出中搜索字符串

例如,运行多个命令后:

$ cd /opt/something
$ find . -name *aa | grep 11 
$ clear  
$ <more commands go here>

有一部分输出需要但未保存;产生它的命令以及参数可能不会被完全回忆起来。

有没有办法进行搜索stdout(即使clear可能已被调用多次)。

答案1

标准输出是暂时的或短暂的。除非您采取一些措施来保存它,否则它一输出就会消失并且无法访问。

如果您想多次重复使用命令的输出,那么您需要将其保存在某处 - 标量变量(例如命令替换)、数组变量(例如使用readarray/ mapfile)或文件(例如使用重定向或tee)。

使用文件名时,应始终使用 NUL 作为分隔符,如下所示全部其他字符是路径名中的有效字符(当今最常见的工具有-0-z-Z或类似选项用于处理 NUL 分隔的输入和输出)。这意味着使用命令替换是不安全的find(尽管对于生成非文件名文本的其他程序来说没问题)。

例如

find . name '*aa' -print0 > files.list0
grep -z 11 files.list0

或者

readarray -d '' -t files < <(find . -name '*aa' -print0)
printf '%s\0' "${files[@]}" | grep -z 11

顺便说一句,应该*aa在该命令中引用find,否则 shell 会将其扩展到所有匹配的文件(并且只有第一个属于谓词-name,其余的将是错误)。

相关内容