pyNag
pyNag

Reputation: 113

Save output of awk to two different variables

Okay. I am kind of lost and google search isn't helping me much. I have a command like:

filesize_filename=$(echo $line | awk ' ''{print $5":"$9}') 
echo $filesize_filename 
1024:/home/test

Now this one saves the two returns or awk'ed items into one variable. I'd like to achieve something like this:

filesize,filename=$(echo $line | awk ' ''{print $5":"$9}')

So I can access them individually like

echo $filesize
1024

echo $filename
/home/test

How to I achieve this?

Thanks.

Upvotes: 2

Views: 4000

Answers (3)

Ed Morton
Ed Morton

Reputation: 203189

Populate a shell array with the awk output and then do whatever you like with it:

$ fileInfo=( $(echo "foo 1024 bar /home/test" | awk '{print $2, $4}') )
$ echo "${fileInfo[0]}"
1024
$ echo "${fileInfo[1]}"
/home/test

If the file name can contain spaces then you'll have to adjust the FS and OFS in awk and the IFS in shell appropriately.

You may not need awk at all of course:

$ line="foo 1024 bar /home/test"
$ fileInfo=( $line )
$ echo "${fileInfo[1]}"
1024
$ echo "${fileInfo[3]}"
/home/test

but beware of globbing chars in $line matching on local file names in that last case. I expect there's a more robust way to populate a shell array from a shell variable but off the top of my head I can't think of it.

Upvotes: 5

anubhava
anubhava

Reputation: 784938

You can use process substitution on awk's output:

read filesize filename < <(echo "$line" | awk '{print $5,$9}')

You can totally avoid awk by doing:

read _ _ _ _ filesize _ _ _ filename _ <<< "$line"

Upvotes: 2

hek2mgl
hek2mgl

Reputation: 157947

Use bash's read for that:

read size name < "$(awk '{print $5, $9}' <<< "$line")"

# Now you can output them separately
echo "$size"
echo "$name"

Upvotes: 2

Related Questions