【问题标题】:How to awk or grep a variable, without using echo?如何在不使用 echo 的情况下 awk 或 grep 变量?
【发布时间】:2014-02-26 00:35:14
【问题描述】:

我正在处理大型变量并加速我的脚本我想在不使用 echo/printf 的情况下使用 awkgrep 一个变量

我尝试过的:

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

【问题讨论】:

  • Send string to stdin的可能重复
  • 您应该认真研究大型变量是否真的是完成工作的最佳方式。

标签: performance bash awk grep


【解决方案1】:

如果我理解您的意思,您在 shell 变量 var 中存储了一个多行字符串,并且您希望从包含 test 的行中打印 100 行(包括该字符串)。使用 GNU awk 会是:

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

例如打印 "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

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

【讨论】:

  • 我收到/usr/bin/awk: Argument list too long
  • 那么你没有使用我发布的脚本 awk 在我的脚本中的参数为零。请注意,在 Solaris /usr/bin/awki 上,旧的、损坏的 awk 永远不应使用。如果您使用的是 Solaris,请使用 /usr/xpg4/bin/awk 或 nawk。
【解决方案2】:

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

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

【讨论】:

  • 我认为您不应该删除引号。 &lt;&lt;&lt; "$var"
  • @Jotne AFAIK heredoc 主体被视为字符串:将执行插值,但外壳注入(如var="a; rm -rf ")将不起作用。无论如何,一对"" 不起作用受伤了,所以我添加了它们。
  • 没有双引号,你会得到单行输入——输入中的换行符被展平为空格(多个空格被展平为单个空格等)。从问题来看,$var 似乎在包含 test 的行之后可能有 100 多行 - 所以双引号是必要的。
  • 我明白了。谢谢@JonathanLeffler
猜你喜欢
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多