In fact, Bryan O'Sullivan (who wrote Real World Haskell) just held a tutorial session on Haskell a couple of weeks ago where people completely new to the language implemented simple Unix tools like "wc". I don't think monads were mentioned at all.
With "do" and the coincidental naming of "return", and IORefs if you insist, you can write imperative bottom-up code in Haskell.
main = interact id
This is a slightly crude implementation of cat in Haskell. As you can see, it is replete with scary monad plumbing that gets in the way of the actual functionality (copying stdin to stdout).I would explain further and implement more than what the blog post suggested but there's already a book (Real World Haskell) that does this with a number of other Unix commands.
I just made a few more suggestions. I can't count how many neat, small tools are provided by Unix. It's a large ground to play in!
Also, you should take a look at the top comment in this thread.