remote awk syntax problem

Hi there

If i run this command on my Linux box directly, i get the desired result

[server1] # ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product Serial/&&f{print $NF}'
00:AA:4F:A6:A6:C4

however, if i try to run it from a remote server (using SSH) and populating a variable with the result, then i get an error f{print command not found ..note, i had to escape the bang otherwise bash would not even accept the command ..not sure if this is part of my problem, see below, as you can see, it matches multiple instances of "Product Serial". I guess this is down to the the print part of the command not working?

[server6] # REMOTE_MAC=`ssh server1 'ipmitool fru | gawk '\!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print $NF}''`
bash: f{print: command not found
#

# echo $REMOTE_MAC
Product Serial : 00:AA:4F:AF:2C:45 Product Serial : 0806AL91AE Product Serial : 1506341E Product Serial : 1506251C Product Serial : 15064C21 Product Serial : 15062F16 Product Serial : 15063610 Product Serial : 1506251F Product Serial : 1506561B Product Serial : 15065618 Product Serial : 00:AA:4F:A6:A6:C4 Product Serial : 00:AA:4F:A6:A6:C6
# 

now, i thought id try just running it remotely rather than trying to populate a variable, so i tried just ssh'ing the command... still problems

[server6] # ssh server1 'ipmitool fru | gawk '\!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print $NF}''
 Product Serial        : 00:AA:4F:AF:2C:45
 Product Serial        : 0806AL91AE
 Product Serial        : 1506341E
 Product Serial        : 1506251C
 Product Serial        : 15064C21
 Product Serial        : 15062F16
 Product Serial        : 15063610
 Product Serial        : 1506251F
 Product Serial        : 1506561B
 Product Serial        : 15065618
 Product Serial        : 00:AA:4F:A6:A6:C4
 Product Serial        : 00:AA:4F:A6:A6:C6
bash: f{print: command not found
# 

From what i can see, the f{print error, seems to be causing my problems

Does anybody have any idea what i could be doing wrong here, it seems i have tried a huge amount of different variations without any success

any guidance would be fantastic

Try double quotes around your ssh command and escape the $ in $NF:

ssh server1 "ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print \$NF}' "

(the f{print isn't the problem it's the awk single quotes confusing the ssh single quotes. Alternatively, escape the awk single quotes)

thats brilliant thanks Scott. just one thing, which i guess will be down to escaping or quoting once again, but if i populate a variable with the results, it still grabs the "Product Serial : "part ?, for example

# ssh server1 "ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print \$NF}' "
00:AA:4F:A6:A6:C4

Perfect:)

but if i poulate a variable

# MAC=`ssh server1 "ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print \$NF}' "`
# echo $MAC
Product Serial : 00:AA:4F:A6:A6:C4

am i doing something glaringly wrong

Hi.

I don't have ipmitool, so I had to improvise!

And just noticed a very interesting this:

$ MAC=$(ssh myself@myserver "/home/myself/ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print \$NF}' ")
myself@myservers's password:
$ echo $MAC
00:11:a3:d7:65

$ MAC=`ssh myself@myserver "/home/mxself/ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product.Serial/&&f{print \$NF}' "`
myself@myserver's password:
$ echo $MAC
Product.Serial : 00:11:a3:d7:65

Using backticks has a different effect to using $( ... )

thanks Scott, yes that works perfectly on my side

Just for the purposes of helping me to understand the multiple implied if-then constructs within this one liner, I have included a semi colon to separate each if-then

# MAC=$(ssh server1 "ipmitool fru | gawk '!NF{f=0} ; /mb.net0.fru/{f=1} ; /Product.Serial/&&f{print \$NF}' ")
# echo $MAC
00:AA:4F:A6:A6:C4

thank you again :):b:

I alwasy find it easier to run the awk commands locally...

ssh blah1 "somecommand" | gawk '/whatever... '

That way you dont have to worry about the crazy formatting you have to do to make the awk statement work through ssh...