Archive for August, 2008

Link for today: Bluetooth Proximity – Ubuntu HOWTO

Thursday, August 14th, 2008

Link to Howto

I’ve used this successfully and can attest to how handy it is. Kudos to Iceni for putting that Howto together.

BT dongles are getting cheap enough today that this is very doable. Most phones have BT already, so why not try it out?

Linksys also makes a USB Bluetooth adapter with a movable antenna. I’ve not heard anything about that particular adapter, but I would wager that its range is greater than that of normal Bluetooth dongles.

That’s it for today!

-LightningCrash

basics in awk

Wednesday, August 13th, 2008

awk is a very, very useful command-line program that any Linux/Unix ninja should be familiar with. Awk is specifically geared towards processing text, and it was actually a combination of awk and sed that were an inspiration for Perl.

To start with, awk has three major elements that you need to be aware of when you’re working with it. These are the field separator, the pattern, and the action for the pattern.

Your fied separator is obviously what is inbetween the text elements you want to work with. If you open up a terminal and type ‘ps -elf’, you’ll see that this would just be spaces. Some files, like CSV files, have commas as the separator. Awk can be told what to look for via the -F option on the command-line, or in the program itself. For one-off piping, I prefer to do it via the -F option.

The pattern is much like an ‘if … then’ statement in other programming languages. If there isn’t a pattern, the action specified will be applied to all rows of input.

What makes awk handy is that it gives you capabilities that the `cut` command simply can’t provide. For instance, if I have a twenty-column CSV and I would like to spit out the third and eleventh column, I can execute the following:

awk -F',' '{print $3 FS $11}' file.input

The -F’,’ tells awk that the input fields will be separated by commas. The area enclosed in the braces is the action I talked about earlier. I didn’t specify a pattern before the action, so the action was applied to every line of input. “print $3 FS $11” tells awk to print to the screen the third field of input, the field separator (which we defined as a comma with the -F’,'), and the eleventh field of input.

If I wanted to do the same, but only print lines where the third field was over a number, say, 110, I could execute the following:

awk -F',' '$3 > 110 {print $3 FS $11}'" file.input

The pattern before the braces functions much like an “if … then”. If the third field is over 110, awk prints out the third field, the field separator, and the eleventh field.

There is much, much more that you can do with awk, but this should be enough to hint you in the right direction. I know I use awk daily for various tasks related to command-line mischief. A common thing I use awk for is to manipulate /etc/passwd, where some user account information is stored.

Fortunately, GNU awk is often smart enough to pick up the field separators without specifying the -F option. For instance, /etc/passwd is separated by a colon “:”, but GNU awk automatically recognizes this. It’s worth noting that on some other systems without GNU utilities, awk may behave in ways that you don’t anticipate.

That’s it for the moment, just some small tips to get you moving. I’d recommend picking up a book on AWK. I recommend you pick up a copy of “The AWK Programming Language” by Aho, Kernighan and Weinberger. It only makes sense, since they are the creators of AWK. I have also been told that the O’Reilly AWK book is very good. In addition, the GNU awk is well-documented all over the Internet, so you shouldn’t be lacking in study material if you put some effort into it.

Until next time!

-LightningCrash

comm — when diff won’t do

Thursday, August 7th, 2008

Don’t get me wrong, I appreciate the utility of diff. I use diff all the time. Unfortunately, there are times when I don’t want a diff output.

Case in point: I was comparing two lists of accounts. I wanted the accounts that were present in the newer file. Diff gave me output, but the diff output wasn’t what I wanted.

comm is handy for this. You would do the following to get the list I want:
comm -1 -3 oldfile newfile

Lovely! comm is actually part of the GNU Core Utilities and was written by Richard Stallman and David MacKenzie. That confirmed my suspicions that comm subscribed to an old UNIX adage for some utilities: Do one thing very, very well.

I have nothing more to say about comm, you’ll have to wear it out yourself.

Until next time,

-LightningCrash