具有动态输出的egrep

时间:2016-04-25 16:20:40

标签: dynamic grep 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双重检查输出文件,每个输出文件中应该有一些信息。我在这里做错了但我无法弄清楚它是什么......

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

当您调用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 ( $0 ~ ("\\<" list[i] "\\>") ) {
                print > ("/path/name" i ".txt")
            }
        }
    }
' /path/file1.txt

以上使用GNU awk作为单词边界(\<\>),您需要将其他awks更改为正则表达式:$0 ~ ("(^|[^[:alnum:]_])" list[i] "([^[:alnum:]_]|$)")