gpt4 book ai didi

bash - 如何制作一个脚本来对一个文件进行多个 grep?

转载 作者:行者123 更新时间:2023-11-29 09:39:51 25 4
gpt4 key购买 nike

我想制作一个可以自动执行以下操作的脚本:

 grep 'string1' file.txt | grep 'string2' | grep 'string3' ... | grep 'stringN'

想法是脚本可以这样运行:

myScript.sh file.txt string1 string2 string3 ... stringN

并且脚本必须返回包含所有字符串的 file.txt 的所有行。

例如,如果 file.txt 如下所示:

hello world 
hello world run
hello planet world

我可以像这样创建一个 grep:

grep hello file.txt | grep world

我得到:

hello world 
hello world run
hello planet world

我想制作一个脚本,以未定义数量的字符串作为参数自动执行此操作。

我发现很难做到这一点,因为字符串的数量是可变的。首先,我尝试在 myScript.sh 中创建一个名为 args 的数组:

 #!/bin/bash
args=("$@")

用于存储参数。我知道 ${args[0]} 将成为我的 file.txt 其余的是我需要在不同的 greps 中使用的字符串,但是我不知道如何进行,也不知道这是否是解决问题的最佳方法。我将不胜感激有关如何对此进行编程的任何建议。

最佳答案

sed 能够通过单个进程完美地完成此操作,并避免了这些 eval 恶作剧。生成的脚本实际上非常简单。

#!/bin/sh
file=$1
shift
printf '\\?%s?!d\n' "$@" |
sed -f - "$file"

我们为每个表达式生成一行sed脚本;如果未找到 (!) 表达式,我们将删除 (d) 这一输入行,并从下一行重新开始。

这假设您的 sed 接受 - 作为 -f 的参数以从标准输入读取脚本。这不是完全便携的;如果这是一个问题,您可能需要将生成的脚本存储在一个临时文件中。

这使用 ? 作为内部正则表达式分隔符。如果您需要其中一个模式中的文字 ?,您将需要对其进行反斜杠转义。在一般情况下,创建一个脚本来找到一个不在任何搜索表达式中的替代分隔符可能是可能的,但在这一点上,我会转向适当的脚本语言(我更喜欢 Python)。

关于bash - 如何制作一个脚本来对一个文件进行多个 grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36275421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com