带有动态输出的egrep

egrep with dynamic output

我正在尝试 egrep 包含特定字符的行。 当我执行单个 egrep 时,它工作正常

egrep -w -h -R 'name' /path/file1.txt > /path/file2.txt

但是当我使用for循环执行多个egrep时,输出都是空的。

for i in {Adam Bob Chuck Dan Eli Frank}; do egrep -w -h -R 'i' /path/file1.txt > /path/name"$i".txt; done

我通过单个 egrep 仔细检查了输出文件,每个输出文件中应该有一些信息。我在这里做错了什么,但我无法弄清楚它是什么..

感谢您的帮助!

这是非常低效的,因为您正在调用 grep 并对每个名称解析整个输入文件一次(参见 https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。

只需读取一次输入文件:

awk -v names='Adam Bob Chuck Dan Eli Frank' '
    BEGIN { split(names,list) }
    {
        for (i in list) {
            if ( [=10=] ~ ("\<" list[i] "\>") ) {
                print > ("/path/name" i ".txt")
            }
        }
    }
' /path/file1.txt

以上使用 GNU awk 作为单词边界(\<\>),对于其他 awk,您只需将正则表达式比较更改为:[=13=] ~ ("(^|[^[:alnum:]_])" list[i] "([^[:alnum:]_]|$)").