Tips, notes, HOWTOs

19 Aug 10 Recovering A File Deleted With “rm”

It happens, you accidentally delete a file and you need it back.  Maybe you don’t do backups (shame on you).  Maybe your most current backup isn’t good enough.  Whatever the reason many people, myself included, have accidentally removed something that they need back.  Here is a quick trick that might save you.

grep -a -B 25 -A 100 'some string in the file' /dev/sda1 > results.txt

“-a” – treat the drive (binary) as text

“-B 25 -A 100″ – print 25 lines before a match and 100 lines after

The search string must be something you know was in the file you removed that is likely to be unique.

It’s probably a good idea to write the output on a different partition than the one you are searching.  You can also substitute something like “-C 100″ for the -B/-A switches.  The -C switch is short hand for the arguement number of lines both before and after the match.

via Atomic Spin

Tags: , , ,

17 Feb 10 Dealing With Recursiveless Grep

If you work at all in Solaris (and maybe just older versions I don’t know) you will eventually find out that the version of “grep” shipped with the OS is missing the “-r” option for doing recursive greps.  Over the years I have found myself becoming a huge fan of this ability and I am always amazed to find there are versions that don’t include it.  Today I set out to come up with a way to emulate the behavior.

I came up with two solutions.  First we have:

find . |xargs grep PATTERN

While this seemed to work fine at first I noticed that it had issues with file that contained spaces. It would treat each “word” of a file name with spaces as a separate filename and I would get errors from grep about not being able to find the file. If you know that you don’t have any filenames with spaces though the above should work just fine.

As I played around further I managed to come up with the following second iteration:

find . -exec grep PATTERN {} /dev/null \;

This one worked just as well as the first one but had the added advantage of treating file names with spaces in the correctly. I don’t claim to be a find master. Unfortunately I can’t tell you why the “/dev/null” is required except that I can tell you without it you will get the lines in files matching the pattern returned but not the filename the line is contained in.

Tags: , , ,

15 Feb 10 When grep and sed are not enough…

I found an article over at Linux Journal that lead with the sentence:

When grep and sed aren’t enough, gawk may provide the extra horsepower that you need.

I would have to argue against that.  Nothing personal against gawk, awk itself, or any of it’s variants.  I personally love awk.  Though I would rewrite their first sentence a bit.

When grep and sed aren’t enough, you obviously don’t know enough grep and sed.

At any rate he does provide some gawk examples that aren’t totally worthless but certainly don’t require it over grep and/or sed.  I am guessing that there will be some decent examples either way in the comments section as well.

Tags: , , , ,

18 Nov 09 Move LVM2 VG From Old Drive To A Drive On A New Machine

My old computer recently died.  It was old enough that I didn’t spend a lot of time trying to fix it.  I took the opportunity to get a new one.  I have my drives set up so that my “home” partitions are in an LVM volume group.  I wanted to move that VG to the new drive on the new machine.  This is what worked well for me.

Assuming you have the old drive connected to the new machine the simplest way seemed to be adding the physical volume on the new disk to the VG on the old disk then moving all of the extents that exist in the VG on the old disk to the new.  Finally I removed the old disk from the VG.

Here are the steps I took, I will explain each after the code.

vgchange -ay
pvcreate /dev/sda5
vgextend MyVG /dev/sda5
vgmove -v /dev/sdb3 /dev/sda5
vgreduce MyVG /dev/sdb3

1: That started up the MyVG volume group on the old HDD.  Although it’s not shown above I mounted it and looked around to make sure the files were there and everything looked good.

2: I allocated the partition on the physical disk in the new machine (sda5 for me) to LVM.

3: Here I added the LVM physical volume (pv) created above to the MyVG volume group that up to this point resided only on the old HDD.  So now instead of a 100G “disk” only on the 1 HDD I now had a 360G “disk” that actually spanned 2 physical disks.

4: This moved all of the physical extents of MyVG that resided on the old HDD (sdb3 for me) to physical extents on the new HDD.  -v just gave me a 15 second rolling counter of the progress.  It took about 25 minutes to move 100G or so.

5: This removed the old HDD from the MyVG.  Everything is now on the same volume group it has always been on but that VG now resides fully on the new HDD now.

In case you are wondering why I didn’t just keep the old HDD I moved from a desktop machine to a laptop.

Tags: , , , , , , , , ,

18 Nov 09 Simple Vim Macros

I found myself editing a configuration file (multiple actually) at work today and ran into an issue.  The config file looked similar to:


As it happened I needed to remove one of the lines at position 23.  The program that reads/uses these config files has an issue if there is a break in the sequence.  So after removing the line with “Var_23″ I needed to shift all of the numbers in following lines down by 1.  Here is how I accomplished that.

In vim I put my cursor on the 24 in the line that now follows the “Var_22″ line and performed the following commands:


Here is what happened broken down by line:

1: Here I am recording a macro (q) with the name or identifier of ‘a’.  Note you will probably see some indication in the last line that you are in “recording” mode.

2: CTRL-X decrements the number under the cursor.  Since I am on the 24 that decrements it to 23.

3:  I move down 1 line and now the cursor is on the 25 in the next line.

4: I quit recording the macro.  I know have a named (a) macro that includes the commands “decrement the number under the cursor and move down one row”.

5: I perform that named (a) macro 125 times.  Now realistically I only needed to do it 123 times.  It didn’t seem to matter that I used 125 but YMMV.  The first line after the last line I wanted to change was a blank line so I assume the macro quit when the CTRL-X failed.  You are probably better off using the exact number.

And there you have it.  I successfully renumbered all of the variables below the line I deleted to be in sequence.

Tags: , , , , ,

06 Jun 09 Serving Files Simply With Python

I had found this code for serving up a directory with a simple python command.

python -m SimpleHTTPServer 9914

The above command will start a simple HTTP server on port 9914 serving files out of the current directory and below.

For those looking for something just a bit more fancy the below script should do the trick while still keeping things simple.  Again, this will serve files from the current directory down.


import BaseHTTPServer, SimpleHTTPServer

import os
import sys

def run(server_class=BaseHTTPServer.HTTPServer,
print 'Server version:',handler_class.server_version


if len(sys.argv)>1:
if sys.argv[1].isdigit():
server_address = ('', port)

httpd = server_class(server_address, handler_class)

print 'Your Server is running on:',myurl
print 'and serving files from:',os.getcwd(),'and below.'
print 'To stop the server, type ^C.'

if 'b' in sys.argv:
print 'Trying to start webbrowser...'
import webbrowser



The longer script was found here (site is in German but the code is clear).  It may be advisable to get the script code from the actual site since my code plugin seems to be messing up the formatting which is kind of important in python code.

If you would rather use WebDAV I have used the code from the pywebdav project with some decent results.

NOTE: I believe both the above python code and pywebdav require Python2.4 or greater but I have not tested that myself.

Tags: , , , ,

25 Jan 09 Magic Keys

Just wanted to save this off finally.  Not that having it here will help me if I am locked up but…

If you enabled Magic SysRq (CONFIG_MAGIC_SYSRQ=y, found in make menuconfig at Kernel hacking -> Magic SysRq key) in your kernel you can cleanly reboot if evil freezes your system with the following keyboard combination:
Alt-SysRq-R (keyboard in raw mode)
Alt-SysRq-S (save unsaved data to disk)
Alt-SysRq-E (send termination signal)
Alt-SysRq-I (send kill signal)
Alt-SysRq-U (remount all mounted file systems)
Alt-SysRq-B (reboots the system)

More info at WP including some nice mnemonic’s for helping to remember.

Tags: , ,

23 Jan 09 Add A Comma To The End Of A Line

I work with long lists and WinSQL a lot.  I always find myself wishing these long lists had commas at the end for pasting into a SQL where clause using “IN” for the list.  This can be accomplished in one of two ways.

From the command line:

sed "s/$/,/g" <FILENAME>

I usually pipe the output there to a new file.

In vi (from command mode):


The “%” says to perfom the substitution on the whole file.  In both cases we are doing a substitution of “$” (the end of the line) with a “,”.

Tags: , , , ,

15 Jan 09 Process A File Line By Line In A Script

There are multiple ways to skin this cat.  For now one of the simplest.


while read LINE
done <somefile.txt

Replace “somefile.txt” with the file you want to process.

Tags: , , , ,

15 Jan 09 How To Set The Window/XTerm Title

I find it useful to set the window title of my terminals for long running processes so I can see at a glace what is happening in the window or where in the process running in that window is at.  In scripts I will use the following:

echo "\033]0;Window for ${USER}\007"

Of course replace “Window for ${USER}” with whatever is appropriate for your use.

Tags: , , , ,

SEO Powered by Platinum SEO from Techblissonline