Show "free" (not used for a while) ports on Cisco switch with one command

Reasonably common task I come accross is to find free ports on switches (ports that havent been used for sometime). Sometimes its very easy where you can use an NMS or similar to give you a pretty output to show ports and their last input/output. However in my experience this is the exception rather than the rule. Heres a couple of examples using the pipe "|" to parse the output down a bit to only show us interfaces we want. All example shown have been tested on 2900, 3750 and 6500 switches running IOS 12.2+ (you should always check the switches uptime before taking these outputs to mean anything). Thanks to Steve B for suggesting "i proto" rather than "i GigabitE" to catch all flavours of interface.

This example shows all interfaces followed by the last input/output no matter if they are used or not.

Command: show int | i proto|Last in

Example of output

m00nie_cat#show int | i proto|Last in
GigabitEthernet1/1 is down, line protocol is down (notconnect)
  Last input 6w6d, output 6w6d, output hang never
GigabitEthernet1/2 is down, line protocol is down (notconnect)
  Last input 21w1d, output 21w1d, output hang never
GigabitEthernet1/3 is up, line protocol is up (connected)
  Last input 00:00:00, output 00:00:24, output hang never
GigabitEthernet1/4 is up, line protocol is up (connected)
  Last input 00:00:58, output 00:00:24, output hang never
GigabitEthernet1/5 is down, line protocol is down (notconnect)
  Last input never, output never, output hang never

This example is my favourite. Shows only admin down or unconnected ports that have no input/input for +6 weeks

Command: show int | i proto.notconnect|proto.administratively down|Last in. [6-9]w|Last in.[0-9][0-9]w|[0-9]y|disabled|Last input never, output never, output hang never

Example of output

m00nie_cat#$ in.* [6-9]w|Last in.*[0-9][0-9]w|[0-9]y|Last input never, output never, output hang never
  Last input never, output never, output hang never
GigabitEthernet1/1 is down, line protocol is down (notconnect)
  Last input 6w6d, output 6w6d, output hang never
GigabitEthernet1/2 is down, line protocol is down (notconnect)
  Last input 21w1d, output 21w1d, output hang never
GigabitEthernet1/5 is down, line protocol is down (notconnect)
  Last input never, output never, output hang never

There are some exceptions here where a port that is unconnected but used more recently than 6 weeks. These ports will show as below. They wont have any input/output info directly below them. I find for a very quick simple way to see free ports this works pretty well without having to mess about with other scripts. It might also show other port types (SVI, portchannel etc) that are down or have no input/output but this is quite rare in my experience.

Small caveat output

GigabitEthernet2/8 is down, line protocol is down (notconnect)
  Last input never, output never, output hang never
GigabitEthernet2/17 is down, line protocol is down (notconnect)
GigabitEthernet2/18 is down, line protocol is down (notconnect)
GigabitEthernet2/20 is down, line protocol is down (notconnect)

The 2nd command above isnt exactly easy to type/remember but used with an alias its pretty good!

m00nie_cat#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
m00nie_cat(config)#al
m00nie_cat(config)#ali
m00nie_cat(config)#alias ex
m00nie_cat(config)#alias exec free show int | i proto.*notconnect|proto.*administratively down|Last in.* [6-9]w|Last in.*[0-9][0-9]w|[0-9]y|Last input never, output never, output hang never
m00nie_cat(config)#^Z
m00nie_cat#free

GigabitEthernet1/1 is down, line protocol is down (notconnect)
  Last input 6w6d, output 6w6d, output hang never
GigabitEthernet1/2 is down, line protocol is down (notconnect)
  Last input 21w1d, output 21w1d, output hang never
GigabitEthernet1/5 is down, line protocol is down (notconnect)
  Last input never, output never, output hang never

Some more info about the pipe command and regex can be found in [this post].

m00nie :D