Unix 101
Information here is useful for all Unix systems ; some examples are geared
toward Solaris, AIX, and Linux systems, with shell scripts leaning toward Bourne and
Korn flavors.
Back to main page
email ...
js99@rocket99.com
Copyright 1998-2000 © Citisoft, Inc. All Rights Reserved.
Setting variables
# set a variable (ksh)
logfile=/usr/dumps/errors.log
echo "Log file = " $logfile
# set a variable to a command result
date1=`date`
echo "The date is " $date1
servname = `uname -n`
echo "The server name is " $servname
# numeric variable (ksh)
i=1
i=`expr $i + 1`
echo "i = " $i
# set a variable (csh)
TEST1="2522"
export TEST1
echo "Test 1 = $TEST1"
Getting input
# get a value from the user, put it in myvar (ksh)
read myvar'?Selection:> '
echo "myvar=" $myvar
Conditionals
Examples are for ksh and sh unless otherwise noted
if test $myvar = "20" ; then
echo "myvar is twenty"
fi
if test ! $myvar = "20" ; then
echo "myvar is not twenty"
fi
if test $# -lt 3 ; then
echo "The script received less than 3 parms"
fi
# check for file existance
if test -f /usr/scripts/contact.txt ; then
echo "contact.txt file was found !!!"
fi
# check for file existance, exit script if not found
if test ! -f /usr/scripts/contact.txt ; then
echo " contact.txt file not found "
exit
fi
#!/usr/bin/ksh
# ---------------------------------
# complete script, ksh if then stmt
# note use of directive, at line 1
#----------------------------------
i=12
i=`expr $i + 1`
if [ $i -gt 5 ] ; then
echo "i is greater than five"
else
echo "i is less or equal to than five"
fi
if [ $i -eq 5 ] ; then
echo "i equals 5"
fi
Looping
# loop until 'x' is entered
while read sel1'?Selection:> '; do
if test $sel1 = 'x' ; then
clear
exit
fi
echo 'Loop continues ...'
done
# loop for each qualifying file
for filename in "*.txt" ; do
echo 'Deleting ...' $filename
rm $filename
done
A simple menu
A menu is presented which automates simple system tasks. Two files
are necessary: sysmgr (script file) and sysmgr.mnu (menu text)
#!/usr/bin/ksh
#----------------------------------
# System manager menu
#----------------------------------
clear
cat /usr/lib/scripts/sysmgr.mnu
while read sel1'?Selection:> '; do
if test $sel1 = "x" ; then
clear
exit
fi
if test $sel1 = "1" ; then
finger
fi
if test $sel1 = "2" ; then
ps -elf
fi
cd
print "--------------------------------------------"
read sel2'?Press any key to continue ...'
clear
cat /usr/lib/scripts/sysmgr.mnu
done
//------- listed below is contents of sysmgr.mnu
System Menu
1 -> List active sessions
2 -> List all processes
x -> Exit
Using grep and egrep
Grep and egrep are the utilities for filtering output. Egrep can handle
more complex criteria (like and / or, regular expressions)
# display detailed info on session processes
ps -elf | grep $LOGNAME
# display only lines which contain the word "error"
cat errors.log | grep "error"
# display only lines which contain the word "error" or "warning"
cat errors.log | egrep "error|warning"
# display only lines which do not contain the word "message"
cat errors.log | grep -v "message"
Using sed
The sed stream editor makes changes to submitted input and routes it
to standard output. The examples here are fairly straightforward, as
complex sed use is not needed, with the advent of Perl.
# replace ":" with "-"
cat /etc/passwd | sed "s/:/-/g"
# replace spaces with "-"
ls -lap | sed "s/ /-/g"
Using awk/nawk 101
Awk and nawk are powerful tools for processing output. Pattern
scanning and matching are one of the many features which make these
utilities indispensible. This first section deals with simple one-liners.
# print a simpler file list
ls -lap | awk '{ print $9 "\t\t\t" $5 }'
# list users idle for more than 15 minutes, not including root
w | awk '$1!~/root/' | awk '$4 > 15 {print $1}'
# same as above, but force line to contain "pts"
w | awk '$2~/pts/ && $4 > 15 && $1!~/root/ {print $1}'
# move the oldest file to the tmp directory
ls -t *.txt | nawk '{ fname=$1 } END{ system("mv " fname "/tmp") }'
# reverse two terms, separated by a comma
echo "aaa, bbb" | sed s/,//g | awk '{print $2 " " $1}
Using awk/nawk 201
This section illustrates several multi-line awk programs.
# Example 1a: to use an awk program file:
ls -lap | nawk -f myfile.awk
# Example 1b: passing a value to an awk program.
# The variable "myvar" will be accessible within the test6.awk program
ls | nawk -f test6.awk myvar=10
# Example 2: list users idle for mre than 15 minutes
w | nawk -f idle15.awk
# idle15.awk
{
if ($2~/pts/ && $4 > 15 && $1!~/root/)
{
print $1
system("echo " $1)
}
}
# Example 3: file list, with total kbytes / meg
#!/bin/ksh
ls -lap | awk -f /usr/lib/scripts/dir3.awk
# dir3.awk
{
if (length($9) > 7)
{
print $9 "\t\t" $5
}
else
{
print $9 "\t\t\t" $5
}
x1 = x1 + $5
} END{
print "----------------------------"
print "Total bytes:\t\t" x1
x2 = x1 / 1000000
print "Total meg: \t\t" x2
}
Using awk/nawk 301
More complex examples. Note how the BEGIN and END blocks execute once. Also
check out the getline function, which allows a file to be read within an awk
program.
#-------------------------------------------------------
# Run kill script for users idle for more than 55 minutes
# ... exclude users found in developers.txt file
# .. note that the system function works in nawk only.
#-------------------------------------------------------
BEGIN {
devlist = "."
while (getline devname < "developers.txt")
{
devlist = devlist "." devname
}
}
{
if ((substr($6,1,1) > 0 || substr($6,3,2) > 55) && index(devlist,$1)==0)
{
system("ps_kill " $1)
}
}
#-------------------------------------
# Compare passwd file with
# phone listing, change desc
# in passwd file, send output to /tmp
#-------------------------------------
BEGIN {
FS=":"
}
{
pline=$0
pwdline=$5
chflag=0
len2=0
while ((getline pname < "/tmp/list1.txt") && (chflag==0))
{
addrline=pname;
len2 = length(addrline);
addrline2 = substr(addrline,1,len2 - 4 );
if ((index(pwdline,addrline2) > 0) && (len2 > 5))
{
pline=$1 ":" $2 ":" $3 ":" $4 ":" pname ":" $6 ":" $7 ;
chflag=1 ;
}
}
close("/tmp/list1.txt") ;
print pline ;
if (chflag==0)
{
system("echo " "\"" pline "\"" " >> /tmp/list2.txt") ;
}
else
{
modcmd = "zzz" addrline "zzz " ;
system("echo " "\"" "usermod -c " modcmd $1 "\"" ">> /tmp/list3.txt") ;
}
}
# to call the above awk program, use
cat /etc/passwd | nawk -f passwdmod.awk
# this final step puts the quotes in the usermods file
cat /tmp/list3.txt | sed "s/zzz/\"/g" > /tmp/usermods
Finding files
A handy script for finding files quickly.
#!/usr/bin/ksh
if test $# -lt 1
then
echo " "
echo "usage:"
echo "------"
echo "find2 "
echo " "
echo " "
exit
fi
echo " "
echo "Searching file systems ..."
echo " "
find $PWD -name "$1" 2>/dev/null
Moving/copying files
A handy script for changing file extensions. The source could
be modified to copy and move files.
#!/usr/bin/ksh
#-----------------------------
# File Extension Changer
# Parms: extension, new-extension
#-----------------------------
if test $# -lt 2 ; then
echo " "
echo "useage: "
echo "chxtn source-xtn dest-xtn"
echo " "
exit
fi
for fname in *.$1 ; do
echo "Moving: " $fname
newname=${fname%%.*}
if test -f $fname ; then
mv $fname $newname.$2
fi
done
Deleting files
This script deletes the first n# files in a directory, useful
for numbered log files.
#------------------------------------------
# Parms: Directory, wildcard, # of files to delete
#------------------------------------------
if test $# -lt 3
then
echo " "
echo "usage:"
echo "------"
echo "rmfiles <# of files>"
echo " "
echo " "
exit
fi
if test ! -d $1 ; then
echo " "
echo " Invalid path: "
echo $1
echo " "
exit
fi
cd $1
i=1
for filename in $2 ; do
echo $filename
rm $filename
i=`expr $i + 1`
if test $i -gt $3 ; then
cd
exit
fi
done
Sending mail
#!/usr/bin/ksh
# send an e-mail, via shell script
rmail jsmith@mydomain.com << endmsg2
From sjones 10:00am remote from servername
Hi Jim -
Send an e-mail if we're still on for lunch at
12:30 ...
Steve
endmsg2
#!/usr/bin/ksh
#-------------------------------------
# Send big mail
#-------------------------------------
if test $# -lt 4
then
echo " "
echo "usage:"
echo "------"
echo "bigmail "
echo "(type quotes around message if more than one word)"
echo " "
echo " "
exit
fi
print From $2 3:00pm remote from $3 > /tmp/r1.txt
print " " >> /tmp/r1.txt
banner $4 >> /tmp/r1.txt
print '.' >> /tmp/r1.txt
rmail $1 < /tmp/r1.txt
rm /tmp/r1.txt
Back to main page
email ...
js99@rocket99.com
Copyright 1998-2000 © Citisoft, Inc. All Rights Reserved.