Shell Scripting Exercise: count physical RAM in MB
Guys, I'm writing a series of scripts for deploying in our support center. One that I'm working on involves /proc/kcore, the physical RAM of a linux system. I'm trying to display the amount of physical RAM in a system by returning the size of this file divided by 1024.
Guys,
I'm writing a series of scripts for deploying in our support center. One that I'm working on involves /proc/kcore, the physical RAM of a linux system. I'm trying to display the amount of physical RAM in a system by returning the size of this file divided by 1024.
I'd like it to eventually say: PHYSICAL RAM: 512MB.
Here's what I've tried, and the results:
Code:
As you can see, I'm stuck on awk. Can anyone shed some light on this?
I basically want to take the 5th field of an ls and display the result of that field divided by 1024.
Anyone?
TIA!
chewy
I'm writing a series of scripts for deploying in our support center. One that I'm working on involves /proc/kcore, the physical RAM of a linux system. I'm trying to display the amount of physical RAM in a system by returning the size of this file divided by 1024.
I'd like it to eventually say: PHYSICAL RAM: 512MB.
Here's what I've tried, and the results:
Code:
$ echo "System RAM";ls -l /proc/kcoreSystem RAM-r-------- 1 root root 958595072 Feb 14 13:13 /proc/kcore$ $ ls -l /proc/kcore | 'expr $5/1024'/bin/ksh: expr $5/1024: not found$ ls -l /proc/kcore | echo $5$ ls -l /proc/kcore | echo $1$ ls -l /proc/kcore > echo $5/bin/ksh: cannot create echo: No such file or directory$ ls -l /proc/kcore | awk "print int($5/1024)"awk: cmd. line:1: print int(/1024)awk: cmd. line:1: ^ parse errorawk: cmd. line:1: print int(/1024)awk: cmd. line:1: ^ unterminated regexpawk: cmd. line:2: print int(/1024)awk: cmd. line:2: ^ unexpected newline$ ls -l /proc/kcore | awk {print int($5/1024)}/bin/ksh: syntax error: `(' unexpected$ ls -l /proc/kcore | awk `BEGIN {print int($5/1024)}'> > ^C$ $ ls -l /proc/kcore | awk `{print int($5/1024)}`/bin/ksh: syntax error: `(' unexpected$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'> > ^C$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'> ^C$ awk '{ print int($5/1024) }` < ls -l /proc/kcore> ^C$ ls -l /proc/kcore > temp; awk '{ print int($5/1024) }` temp> ^C
As you can see, I'm stuck on awk. Can anyone shed some light on this?
I basically want to take the 5th field of an ls and display the result of that field divided by 1024.
Anyone?
TIA!
chewy
Participate on our website and join the conversation
This topic is archived. New comments cannot be posted and votes cannot be cast.
Responses to this topic
I think there's an error in these two lines:
Code:
The AWK stuff is causing problems because these lines are sending AWK invalid data... (GIGO). I hopes this helps but I'm not that familiar with bash scripting, just prgramming... 8)
Code:
$ ls -l /proc/kcore | 'expr $5/1024'/bin/ksh: expr $5/1024: not found
The AWK stuff is causing problems because these lines are sending AWK invalid data... (GIGO). I hopes this helps but I'm not that familiar with bash scripting, just prgramming... 8)
.
Quote:'m writing a series of scripts for deploying in our support center. One that I'm working on involves /proc/kcore, the physical RAMof a linux system. I'm trying to display the amount of physical RAM in a system by returning the size of this file divided by 1024.
I'd like it to eventually say: PHYSICAL RAM: 512MB.
Here's what I've tried, and the results:
Code:
$ echo "System RAM";ls -l /proc/kcore
System RAM
-r-------- 1 root root 958595072 Feb 14 13:13 /proc/kcore
$
$ ls -l /proc/kcore | 'expr $5/1024'
/bin/ksh: expr $5/1024: not found
$ ls -l /proc/kcore | echo $5
$ ls -l /proc/kcore | echo $1
$ ls -l /proc/kcore > echo $5
/bin/ksh: cannot create echo: No such file or directory
$ ls -l /proc/kcore | awk "print int($5/1024)"
awk: cmd. line:1: print int(/1024)
awk: cmd. line:1: ^ parse error
awk: cmd. line:1: print int(/1024)
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:2: print int(/1024)
awk: cmd. line:2: ^ unexpected newline
$ ls -l /proc/kcore | awk {print int($5/1024)}
/bin/ksh: syntax error: `(' unexpected
$ ls -l /proc/kcore | awk `BEGIN {print int($5/1024)}'
>
> ^C
$
$ ls -l /proc/kcore | awk `{print int($5/1024)}`
/bin/ksh: syntax error: `(' unexpected
$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'
>
> ^C
$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'
> ^C
$ awk '{ print int($5/1024) }` < ls -l /proc/kcore
> ^C
$ ls -l /proc/kcore > temp; awk '{ print int($5/1024) }` temp
> ^C
As you can see, I'm stuck on awk. Can anyone shed some light on this?
I basically want to take the 5th field of an ls and display the result of that field divided by 1024.
The output of:
ls -l /proc/kcore
is:
-r-------- 1 root root 958595072 Feb 14 13:13 /proc/kcore
The number of column 5 should go into "$5" (apparently a variable) which should then be divided ("/") by 1024, to get
the number of bytes in megabytes. The number in column 5 may not be 'numeric', it may be a string of characters. This is most likely. There
is nothing here to separate column five from all the other columns, nor to determine and/or change column five to a
number and store it in a variable. Some programming languages will allow a character string to be divided by an integer,
but the results will not be valid in a mathematic expression.
this:
$ ls -l /proc/kcore | 'expr $5/1024' takes the output from "ls -l" and sent it through "|" to "'expr $5/1024'"
here is where the error comes in - when the shell executes that command ($ ls -l /proc/kcore | 'expr $5/1024') It
sends all the "ls -l" output to what is on the other side of the "|". It does not extract column 5, nor does it
ensure that the output is valid. When the command is executed you get:
/bin/ksh: expr $5/1024: not found
This is an error from the shell (/bin/ksh) - it could not execute "ls -l /proc/kcore | " because it was unable to locate something
called 'expr $5/1024'. I have never used ksh, but it may be different than bash, but it still seems that 'expr $5/1024' means
simething different to your shell than 'expr $5/1024' means to you. Regardless, because your shell does not have the ouput
of 'expr $5/1024', all the rest of the lines that depend upon the value of column five divided by 1024 will not output that value
to the screen, nor send it through awk.All the awk errors are meaningless, because it has nothing to work with. I hope this helps! 8)
Quote:'m writing a series of scripts for deploying in our support center. One that I'm working on involves /proc/kcore, the physical RAMof a linux system. I'm trying to display the amount of physical RAM in a system by returning the size of this file divided by 1024.
I'd like it to eventually say: PHYSICAL RAM: 512MB.
Here's what I've tried, and the results:
Code:
$ echo "System RAM";ls -l /proc/kcore
System RAM
-r-------- 1 root root 958595072 Feb 14 13:13 /proc/kcore
$
$ ls -l /proc/kcore | 'expr $5/1024'
/bin/ksh: expr $5/1024: not found
$ ls -l /proc/kcore | echo $5
$ ls -l /proc/kcore | echo $1
$ ls -l /proc/kcore > echo $5
/bin/ksh: cannot create echo: No such file or directory
$ ls -l /proc/kcore | awk "print int($5/1024)"
awk: cmd. line:1: print int(/1024)
awk: cmd. line:1: ^ parse error
awk: cmd. line:1: print int(/1024)
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:2: print int(/1024)
awk: cmd. line:2: ^ unexpected newline
$ ls -l /proc/kcore | awk {print int($5/1024)}
/bin/ksh: syntax error: `(' unexpected
$ ls -l /proc/kcore | awk `BEGIN {print int($5/1024)}'
>
> ^C
$
$ ls -l /proc/kcore | awk `{print int($5/1024)}`
/bin/ksh: syntax error: `(' unexpected
$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'
>
> ^C
$ ls -l /proc/kcore | awk -F `{print int($5/1024)}'
> ^C
$ awk '{ print int($5/1024) }` < ls -l /proc/kcore
> ^C
$ ls -l /proc/kcore > temp; awk '{ print int($5/1024) }` temp
> ^C
As you can see, I'm stuck on awk. Can anyone shed some light on this?
I basically want to take the 5th field of an ls and display the result of that field divided by 1024.
The output of:
ls -l /proc/kcore
is:
-r-------- 1 root root 958595072 Feb 14 13:13 /proc/kcore
The number of column 5 should go into "$5" (apparently a variable) which should then be divided ("/") by 1024, to get
the number of bytes in megabytes. The number in column 5 may not be 'numeric', it may be a string of characters. This is most likely. There
is nothing here to separate column five from all the other columns, nor to determine and/or change column five to a
number and store it in a variable. Some programming languages will allow a character string to be divided by an integer,
but the results will not be valid in a mathematic expression.
this:
$ ls -l /proc/kcore | 'expr $5/1024' takes the output from "ls -l" and sent it through "|" to "'expr $5/1024'"
here is where the error comes in - when the shell executes that command ($ ls -l /proc/kcore | 'expr $5/1024') It
sends all the "ls -l" output to what is on the other side of the "|". It does not extract column 5, nor does it
ensure that the output is valid. When the command is executed you get:
/bin/ksh: expr $5/1024: not found
This is an error from the shell (/bin/ksh) - it could not execute "ls -l /proc/kcore | " because it was unable to locate something
called 'expr $5/1024'. I have never used ksh, but it may be different than bash, but it still seems that 'expr $5/1024' means
simething different to your shell than 'expr $5/1024' means to you. Regardless, because your shell does not have the ouput
of 'expr $5/1024', all the rest of the lines that depend upon the value of column five divided by 1024 will not output that value
to the screen, nor send it through awk.All the awk errors are meaningless, because it has nothing to work with. I hope this helps! 8)
Yeah, but all variables in the shell are strings.
That's why you can't say:
Code:
expr returns the numeric (integer) value of an expression, like "$x + 1"
But I still don't understand why this doesn't work...
help?
That's why you can't say:
Code:
$x = 5$x = $x + 1echo $x
expr returns the numeric (integer) value of an expression, like "$x + 1"
But I still don't understand why this doesn't work...
help?