从awk中设置当前shell中的变量

Rub*_*ens 18 variables bash awk

有没有办法从内部设置当前shell中的变量awk

我想对文件进行一些处理并打印出一些数据; 因为我会读完整个文件,所以我想保存行数 - 在这种情况下,FNR.

虽然我似乎无法找到一种方法来设置一个带有FNR值的shell变量; 如果不是这样,我必须FNR从我的输出文件中读取,设置,比如说num_lines,FNR有价值.

我尝试过使用某些组合awk 'END{system(...)}',但无法管理它.有什么方法吗?

Ed *_*ton 24

$ echo "$var"

$ declare $( awk 'BEGIN{print "var=17"}' )
$ echo "$var"
17
Run Code Online (Sandbox Code Playgroud)

这就是你应该使用declare而不是eval的原因:

$ eval $( awk 'BEGIN{print "echo \"removing all of your files, ha ha ha....\""}' )
removing all of your files, ha ha ha....

$ declare $( awk 'BEGIN{print "echo \"removing all of your files\""}' )
bash: declare: `"removing': not a valid identifier
bash: declare: `files"': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

请注意,在第一种情况下,eval会执行任何字符串awk打印,这可能会非常糟糕!

  • @Rubens,直到你不小心做坏事的那一天.如果你养成了现在编写安全代码的习惯,你将来不会被咬. (11认同)
  • 我从经验中说... :( (2认同)

Ner*_*rve 24

这是另一种方式.

当,当你已经得到了,这是特别有用的的变量在一个单一的变量,你想拆起来.例如,您有一个数据库中的值列表,您希望从中创建变量.

val="hello|beautiful|world" # assume this string comes from a database query
read a b c <<< $( echo ${val} | awk -F"|" '{print $1" "$2" "$3}' )

echo $a #hello
echo $b #beautiful
echo $c #world
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们需要'here string'即<<<,因为read命令不从管道读取而是从stdin读取

  • 这正是我所需要的!我已经有了一个用空格分隔的字符串的var,所以我只是在输入中给出了它(比如"read abc <<< $ var".谢谢 (2认同)

Tod*_*obs 5

您不能将变量从子 shell 导出到其父 shell。不过,您还有其他一些选择,包括:

  1. 使用 AWK 对文件进行另一次传递以计算记录,并使用命令替换来捕获结果。例如:

    FNR=$(awk 'END {print FNR}' filename)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在子 shell 中打印FNR,并在其他进程中解析输出。
  3. 如果FNR与行数相同,您可以致电wc -l < filename获取您的计数。

  • 不过,您不会真正使用 wc+awk 组合,而只需使用 `wc -l &lt;​​filename`。 (3认同)