Performance 如何在不使用echo的情况下awk或grep变量?
我正在处理大变量,为了加快脚本速度,我希望Performance 如何在不使用echo的情况下awk或grep变量?,performance,bash,awk,grep,Performance,Bash,Awk,Grep,我正在处理大变量,为了加快脚本速度,我希望awk或grep不使用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: `<
awk
或grep
不使用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
awk”/test/{for(i=1;i在bash中,可以使用一行代码将变量重定向到stdin:
awk "/test/ {for(i=1; i<=100; i++) {getline; print}}" <<< "$var"
awk”/test/{for(i=1;i如果我理解您的意思,您在shell变量var
中存储了一个多行字符串,您希望从该字符串中包含test
的行中打印100行。使用GNU awk:
$ awk -v var="$var" 'BEGIN{ printf "%s", gensub(/.*(test([^\n]*\n){100}).*/,"\\1","",var) }'
e、 g.打印“测试”及其后的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
对于其他AWK,您可以使用match()+substr()获得相同的结果。我认为您不应该删除引号。@Jotne AFAIK将herdeoc主体视为字符串:将执行插值,但shell注入(如var=“a;rm-rf
”)将不起作用。无论如何,一对“”
没有影响,所以我添加了它们。如果没有双引号,您将得到一行输入-输入中的换行符被展平为空格(多个空格被展平为单个空格,等等).从这个问题来看,$var
可能在包含test
的行之后有100多行-因此双引号是必要的。我明白了。谢谢@jonathanleffler可能的重复您应该仔细看看大变量是否真的是完成工作的最佳方式。我得到了/usr/bin/awk:Argument list太长
则您没有使用我发布为awk的脚本
在我的脚本中没有任何参数。请注意,在Solaris/usr/bin/awkis上,旧的、损坏的awk不应该使用。如果您在Solaris上,请使用/usr/xpg4/bin/awk或nawk。