Oliver Williams
Oliver Williams

Reputation: 6364

getting first column of a matching line in bash

I am getting an output from a shell command, and want to incorporate the first column of a matching line into a second command. Here is what I have, and it works:

kubectl get pods -n system | while read string; do


if [[ "$string" == my-pod-* && "$string" == *Running* ]]; then
  #  echo $string
  read -ra ADDR <<< "$string"

  echo
  echo "--- Reading logs for ${ADDR[0]} ---"

  # desired output: kubectl -n system logs my-pod-123 --tail=5 -f
  kubectl -n system logs ${ADDR[0]} --tail=5 -f

fi


done

the output from first command would look something like this:

name           status      namespace       running
my-pod-123     Running     system          4h31m      #<<I want this one
another-pod-5  Running     system          5h15m
my-pod-023     Terminating system          8h05m

given that the output will contain only one match, is there a shorter way to do this without looping like this? Thanks in advance for helping me improve my Bash skills as this seems very clumsy.

Upvotes: 1

Views: 1387

Answers (2)

anubhava
anubhava

Reputation: 786091

You may use awk like this:

name=$(kubectl get pods -n system | awk '/^my-pod.*Running/{print $1}')
[[ -n $name ]] && kubectl -n system logs "$name" --tail=5 -f

awk command will match pattern my-pod.*Running at the start of a line and if it is found then it will print first column. We store that in variable name.

If $name is not empty then we call kubectl -n system logs using that value.

Upvotes: 2

glenn jackman
glenn jackman

Reputation: 247200

How about grep?

wanted=$(kubectl get pods -n system | grep 'my-pod-.*Running')

Can do error checking at the same time:

if ! wanted=$(kubectl get pods -n system | grep 'my-pod-.*Running'); then
    echo "Error: no running my-pods" >&2
fi

Upvotes: 1

Related Questions