在Bash脚本中仅Grep变量名称

时间:2013-12-13 04:35:40

标签: linux bash shell sed grep

我有一个bash脚本A,我正在编写另一个脚本B,它打印出在脚本A中导出的变量名。

示例:

export A=TRUE  
  export ABC="GFT"  
export XYZ="FFF"  
\# export P="SSD"

如果我执行脚本A,它必须提供如下输出:

A  
ABC  
XYZ  

我试过这个oneline:

grep export file.env | grep -v "#" | cut -d' ' -f2 | cut -d'=' -f1

但问题是,如果导出不是从行的开头开始,即如果开头有一些空格/ Tab,则上述在线不起作用。

对此有任何替代解决方案吗?

4 个答案:

答案 0 :(得分:2)

awk '$1 == "export" { split($2, a, "="); print a[1]; }'

答案 1 :(得分:2)

使用grep的解决方案:

grep --perl-regexp --only-matching '\s*export\s+([A-Za-z0-9_]+)='

答案 2 :(得分:1)

b.sh

printenv > TMP 
. ./a.sh
printenv | diff TMP - | grep -v printenv | sed -n 's/> *\([^ =]*\)=.*/\1/p'

或者获得更改:

set > TMP
. ./a.sh
set | grep -vf - TMP | cut -d= -f1 

这可能会为您提供一些额外的变量,例如BASH_LINENO

答案 3 :(得分:1)

sed -n '/^[[:blank:]]*export[[:blank:]]*\([^=]\{1,\}\)=.*/ s//\1/p' ScriptA
在大多数情况下,

[[:blank:]]可以用简单的空格替换