我正在尝试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双重检查输出文件,每个输出文件中应该有一些信息。我在这里做错了但我无法弄清楚它是什么......
感谢您的帮助!
答案 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:]_]|$)")
。