While researching on an issue with a Java Stored procedure at work recently, I had to go to oracle udump† directory to find out if there was any errors. To do this, we do grep like,
grep -i -l "nullpointer" *
to list the names of all log files that may contain NullPointer exceptions‡. -i = ignore case, -l = list only file names.
This tip is to be able to use that list in another command using back-quote (`). This is the character (also called grave accent) before 1 on PC keyboards, if you haven’t used it. Back-quote is used for command substitution in *nix (unix, linux) systems. It’s available in
For eg, to list those files with full directory listing:
ls -lt `grep -i -l "nullpointer" *`
Or to open the trace files found by grep, all at once in vi:
vi `grep -i -l "nullpointer" *`
(and then use :n in vi to go through the files)
Below line copies the found files out to another directory,
cp `grep -i -l "nullpointer" *` ~/nullsod
(where nullsod is a directory in my home directory.)
Command Substitution (using Back quote)
This process of executing commands inside back-quote is called command substitution. The command inside the back-quote is executed first and the output is plugged into the commandline that contains it. For e.g.,
returns System Date. Notice a back-quoted command is mostly embedded inside another. If you miss the echo there, it will try to return the date string to the shell which it will try to execute as a command which results in “Command not found” error.
Back-quote is often used in scripts to set the result into a variable. For e.g., we can save the date value in a variable called dt. Then we can use this variable in script.
$> export dt=`date +"%m%d%C%y%H%M%S"` $> echo "Date is $dt" $> cp output.log output.log."$dt" #
Where, $> is the shell prompt
In the above list, Date is executed with a specific format (mmddyyyhhmiss). This is then stored in a variable called dt. First we echo dt. Then we use dt to rename a file with date suffix, very handy when you are running a script on a regular basis and want to save the output in timestamped logs.
Incidentally, the statements above, show another kind of substitution, a string or variable substitution using double quotes(“). Any expression inside a double quote is often evaluated first and substituted in the command that uses it. Notice the difference: double quote simply evaluates a string/variable and plugs in the value. A back-quote on the other hand, actually executes the string inside as a command and returns the output to the enclosing command.
You can combine many of these expressions, and that’s what makes it all powerful. If you haven’t tried back-quote yet, try it. You will be glad you did!
† udump – user dump – contains user trace files in Oracle database; all print statements from stored programs in Oracle (Java, PL/SQL) end up here.
‡ udump directory may have a large # of files depending on activity, in which case, grep may not work with wild card (*). You may have to refine the grep parms.