Get list of variables whose name matches a certain pattern

Viewed 28252

In bash

echo ${!X*}

will print all the names of the variables whose name starts with 'X'.
Is it possible to get the same with an arbitrary pattern, e.g. get all the names of the variables whose name contains an 'X' in any position?

7 Answers

Use the builtin command compgen:

compgen -A variable | grep X

This should do it:

env | grep ".*X.*"

Edit: sorry, that looks for X in the value too. This version only looks for X in the var name

env | awk -F "=" '{print $1}' | grep ".*X.*"

As Paul points out in the comments, if you're looking for local variables too, env needs to be replaced with set:

set | awk -F "=" '{print $1}' | grep ".*X.*"

Easiest might be to do a

printenv |grep D.*=

The only difference is it also prints out the variable's values.

Enhancing Johannes Schaub - litb answer removing fork/exec in modern bash we could do

compgen -A variable  -X '!*X*'

i.e an X in any position in the variable list.

env | awk -F= '{if($1 ~ /X/) print $1}'

To improve on Johannes Schaub - litb's answer:

There is a shortcut for -A variable and a flag to include a pattern:

compgen -v -X '!*SEARCHED*'
  • -v is a shortcut for -A variable
  • -X takes a pattern that must not be matched.

Hence -v -X '!*SEARCHED*' reads as:

  • variables that do not, not match "anything + SEARCHED + anything"

Which is equivalent to:

  • variables that do match "anything + SEARCHED + anything"

The question explicitly mentions "variables" but I think it's safe to say that many people will be looking for "custom declared things" instead.

But neither functions nor aliases are listed by -v.

If you are looking for variables, functions and aliases, you should use the following instead:

compgen -av -A function -X '!*SEARCHED*'
# equivalent to:
compgen -A alias -A variable -A function -X '!*SEARCHED*'

And if you only search for things that start with a PREFIX, compgen does that for you by default:

compgen -v PREFIX

You may of course adjust the options as needed, and the official doc will help you: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html

Related