intent: df -kh | filter based on capacity (used space) column where % > 85

I want to accomplish this in sh, however if the capability exists only in other shells elsewhere that's acceptable.

% df -kh
Filesystem size used avail capacity Mounted on
...
/dev/dsk/c0t0d0s1 103G 102G 23M 100% /export/DISK15
...
# output truncated for brevity

my objective is to create a script to filter and print all entries in a df -kh output:

  • commands available to !/bin/sh - preferred

  • where the % value in the capacity column is greater than 85%

  • i want the resulting output to print the original entry from df -k output
    to contain the filesystem capacity and mount-point

  • also I'd like to sort by alphanumeric character contained in the Mounted on column, this is nice to have, not necessary** I didn't have much success with the sort -k 6,6d or 6,6d operands

I'm relatively new to the UNIX environment, windows guy by trade so get the boos and jeers out of your systems up front. :wink:

Back to business:

I was thinking foreach statements, not sure how to feed each line to the foreach statement where a carriage return/or new line character would be used as the field separator in foreach input; awk coupled with gt statements but not really sure if that's the best tool. I suspect maybe test statements gotta be used, but I'm drawing blanks as to how to accomplish this and put it together since I have very limited exposure to scripting. I have no idea how to designate carriage returns/new line characters as the field separator for foreach input, remember I'm new I've read documentation for all over so my direction could be severely misguided or even out of correct context.

here are my initial thoughts, this could clarify my intentions

df -kh
either pipe output to input for "foreach command statement" or redirect to temp file, << EOFs (here document) acceptable, probably preferred for conservation of space each time command is run to avoid generating file backlog

either temp file or << EOF provide foreach inputs to be taken for action, at which point I want the % value in the capacity column compared with gt statement against value of 85%.

Then any of the original entries whose capacity column value evaluates as true for the gt 85% comparison, I want those printed and ultimately sorted by alphanumeric value of the mountpoint.

Please let me know if you can help and/or if you want me to do any further footwork, be specific in any following requests so we can get it done right and with minimal delay. Thanks a bunch in advance.

your friendly neighborhood programmar!

so I discovered some info on this site AFTER I posted, I guess this isn't uncommon using the suggested links for related posts.

anyway,

syntax I got for accomplishing everything I wanted ended up being

# df -kh | grep /export | awk '$5 >= 85' | sort 6,6d

HOWEVER this omits any entries where the capacity field has a value of 100%, last time I checked...that was more than 85. What am I missing?

Useless use of grep

df -kh | awk '/\/export/ && int($5) >= 85'

error:
Unmatched '

thanks for your input though. If you don't mind explaining, could you go into detail of the structure of this statement and why you did that.

I'm still trying to figure out the placement/requirement/caveats of (), ,{}, of which you're only using parentheses here. Hopefully you understand what I'm asking.

Am I right to assume the single quotes are to group the commands together or are they dual purpose in order to execute commands within the awk command as well as grouping the contents. kind of like sub-shell execution?

I'm familiar with using the forward-slash to initiate a search as within vi, less environments, then you're using the back-slash to escape the following forward-slash metacharacter which is a part of the search string...what's the last forward-slash's purpose in that statement? Also, the open-close parentheses around the integer and column id? If you have reference material, I'll gladly take as response.

df -kh |       \  # Pipe the output of df to awk
awk '             # Start the awk script
/\/mnt/        \  # Grep for pattern(first condition)
&&             \  # add a second condition (and)
int($5) >= 85  \  # Check if integer of $5 is greater that 85(second condition) 
'                 # End awk script
df -kh | \
awk '{
   if (NF==1) {
      getline l
      gsub(" +"," ",l)
      $0=$0l
      l=""
   }
   if ($(NF-1)+0 > 85)
      print
}' | \
sort -k6,6