如何在不使用echo的情况下awk或grep变量?

时间:2014-02-02 14:44:19

标签: performance bash awk grep

我正在使用大变量并加快我的脚本我想awkgrep变量而不使用echo/printf

我尝试了什么:

awk "/test/ {for(i=1; i<=100; i++) {getline; print}}" "$var"
awk: fatal: cannot open file `<<$var content>>' for reading (No such file or directory)

grep -A 100 test "$var"
grep: `<<$var content>>': No such file or directory

2 个答案:

答案 0 :(得分:7)

在bash中,您可以使用单行heredoc从变量重定向到stdin:

awk "/test/ {for(i=1; i<=100; i++) {getline; print}}" <<< "$var"

答案 1 :(得分:2)

如果我理解你,你会在shell变量var中存储一个多行字符串,并且你想从该字符串中包含test的行打印100行。使用GNU awk,它将是:

$ awk -v var="$var" 'BEGIN{ printf "%s", gensub(/.*(test([^\n]*\n){100}).*/,"\\1","",var) }'

e.g。打印“test”加上后面的2或3行,包括:

$ echo "$var"
abc
def
test
ghi
klm
nop

$ awk -v var="$var" 'BEGIN{ printf "%s", gensub(/.*(test([^\n]*\n){2}).*/,"\\1","",var) }'
test
ghi

$ awk -v var="$var" 'BEGIN{ printf "%s", gensub(/.*(test([^\n]*\n){3}).*/,"\\1","",var) }'
test
ghi
klm

使用其他awks,您可以使用match()+ substr()来获得相同的结果。