Unix Book
Unix Book
Frank G. Fiamingo
Linda DeBula
Linda Condron
UNIX is a registered trademark of The Open Group, AT&T is a trademark of American Telephone and
Telegraph, Inc.
This publication is provided “as is” without warranty of any kind. This publication may include
technical inaccuracies or typographical errors.
2                 1998 University Technology Services, The Ohio State University                      Introduction to Unix
                                           Table of Contents
Introduction to Unix        1998 University Technology Services, The Ohio State University                                 3
                 3.8.2      cat - concatenate a file .................................................31
                 3.8.3      more, less, and pg - page through a file ......................31
                 3.8.4      head - display the start of a file ...................................32
                 3.8.5      tail - display the end of a file ......................................32
    4   System Resources & Printing ....................................................33
        4.1      System Resources ........................................................................33
                 4.1.1 df - summarize disk block and file usage ....................34
                 4.1.2 du - report disk space in use ........................................34
                 4.1.3 ps - show status of active processes ............................35
                 4.1.4 kill - terminate a process .............................................36
                 4.1.5 who - list current users ................................................37
                 4.1.6 whereis - report program locations ............................37
                 4.1.7 which - report the command found .............................38
                 4.1.8 hostname/uname - name of machine ...........................38
                 4.1.9 script - record your screen I/O ....................................38
                 4.1.10 date - current date and time .........................................40
        4.2      Print Commands .........................................................................41
                 4.2.1 lp/lpr - submit a print job ............................................41
                 4.2.2 lpstat/lpq - check the status of a print job ...................42
                 4.2.3 cancel/lprm - cancel a print job ...................................42
                 4.2.4 pr - prepare files for printing .......................................43
    5   Shells ............................................................................................45
        5.1      Built-in Commands .....................................................................46
                 5.1.1 Sh ................................................................................46
                 5.1.2 Csh ..............................................................................47
        5.2      Environment Variables ..............................................................48
        5.3      The Bourne Shell, sh ...................................................................49
        5.4      The C Shell, csh ...........................................................................50
        5.5      Job Control ..................................................................................51
        5.6      History ..........................................................................................52
        5.7      Changing your Shell ...................................................................54
    6   Special Unix Features .................................................................55
        6.1      File Descriptors ...........................................................................55
        6.2      File Redirection ...........................................................................55
                 6.2.1 Csh ..............................................................................56
                 6.2.2 Sh ................................................................................57
        6.3      Other Special Command Symbols .............................................58
        6.4      Wild Cards ...................................................................................58
    7   Text Processing ............................................................................59
        7.1      Regular Expression Syntax ........................................................59
        7.2      Text Processing Commands .......................................................61
                 7.2.1 grep .............................................................................61
                 7.2.2 sed ...............................................................................65
4        1998 University Technology Services, The Ohio State University                                 Introduction to Unix
                       7.2.3     awk, nawk, gawk .........................................................67
       8       Other Useful Commands ............................................................70
               8.1     Working With Files ....................................................................70
                       8.1.1 cmp - compare file contents ........................................71
                       8.1.2 diff - differences in files ..............................................72
                       8.1.3 cut - select parts of a line ............................................73
                       8.1.4 paste - merge files .......................................................74
                       8.1.5 touch - create a file ......................................................76
                       8.1.6 wc - count words in a file ............................................77
                       8.1.7 ln - link to another file ................................................78
                       8.1.8 sort - sort file contents .................................................79
                       8.1.9 tee - copy command output .........................................82
                       8.1.10 uniq - remove duplicate lines ......................................84
                       8.1.11 strings - find ASCII strings .........................................85
                       8.1.12 file - file type ...............................................................86
                       8.1.13 tr - translate characters ................................................86
                       8.1.14 find - find files ............................................................89
               8.2     File Archiving, Compression and Conversion .........................91
                       8.2.1 File Compression ........................................................91
                       8.2.2 tar - archive files .........................................................93
                       8.2.3 uuencode/uudecode - encode a file .............................94
                       8.2.4 dd - block copy and convert ........................................95
                       8.2.5 od - octal dump of a file ..............................................96
               8.3     Remote Connections ...................................................................98
                       8.3.1 TELNET and FTP - remote login and file transfer protocols 98
                       8.3.2 finger - get information about users ..........................100
                       8.3.3 Remote commands ....................................................101
       9       Shell Programming ...................................................................103
               9.1     Shell Scripts ...............................................................................103
               9.2     Setting Parameter Values .........................................................103
               9.3     Quoting ......................................................................................104
               9.4     Variables ....................................................................................105
               9.5     Parameter Substitution ............................................................107
               9.6     Here Document ..........................................................................109
               9.7     Interactive Input .......................................................................110
                       9.7.1 Sh ..............................................................................110
                       9.7.2 Csh ............................................................................110
               9.8     Functions ....................................................................................111
               9.9     Control Commands ...................................................................113
                       9.9.1 Conditional if ............................................................113
                              9.9.1.1 Sh ........................................................................113
                              9.9.1.2 Csh ......................................................................114
                       9.9.2 Conditional switch and case ......................................115
                              9.9.2.1 Sh ........................................................................115
Introduction to Unix       1998 University Technology Services, The Ohio State University                                 5
                            9.9.2.2 Csh ......................................................................116
                  9.9.3     for and foreach ..........................................................117
                            9.9.3.1 Sh ........................................................................117
                            9.9.3.2 Csh ......................................................................117
                  9.9.4     while ..........................................................................118
                            9.9.4.1 Sh ........................................................................118
                            9.9.4.2 Csh ......................................................................119
                  9.9.5     until ...........................................................................119
                  9.9.6     test .............................................................................120
                  9.9.7     C Shell Logical and Relational Operators ................122
    10   Editors ........................................................................................123
         10.1     Configuring Your vi Session ....................................................124
         10.2     Configuring Your emacs Session .............................................125
         10.3     vi Quick Reference Guide ........................................................126
         10.4     emacs Quick Reference Guide ..............................................127
    11   Unix Command Summary .......................................................128
         11.1     Unix Commands ........................................................................128
    12   A Short Unix Bibliography ......................................................131
         12.1     Highly Recommended ...............................................................131
         12.2     Assorted Others .........................................................................131
6         1998 University Technology Services, The Ohio State University                              Introduction to Unix
CHAPTER 1                   History of Unix
1965 Bell Laboratories joins with MIT and General Electric in the development effort for the new
operating system, Multics, which would provide multi-user, multi-processor, and multi-level
(hierarchical) file system, among its many forward-looking features.
1969 AT&T was unhappy with the progress and drops out of the Multics project. Some of the Bell
Labs programmers who had worked on this project, Ken Thompson, Dennis Ritchie, Rudd Canaday,
and Doug McIlroy designed and implemented the first version of the Unix File System on a PDP-7
along with a few utilities. It was given the name UNIX by Brian Kernighan as a pun on Multics.
1971 The system now runs on a PDP-11, with 16Kbytes of memory, including 8Kbytes for user
programs and a 512Kbyte disk.
Its first real use is as a text processing tool for the patent department at Bell Labs. That utilization
justified further research and development by the programming group. UNIX caught on among
programmers because it was designed with these features:
       •   programmers environment
       •   simple user interface
       •   simple utilities that can be combined to perform powerful functions
       •   hierarchical file system
       •   simple interface to devices consistent with file format
       •   multi-user, multi-process system
       •   architecture independent and transparent to the user.
1973 Unix is re-written mostly in C, a new language developed by Dennis Ritchie. Being written in
this high-level language greatly decreased the effort needed to port it to new machines.
1974 Thompson and Ritchie publish a paper in the Communications of the ACM describing the
new Unix OS. This generates enthusiasm in the Academic community which sees a potentially great
teaching tool for studying programming systems development. Since AT&T is prevented from
marketing the product due to the 1956 Consent Decree they license it to Universities for educational
purposes and to commercial entities.
Introduction to Unix      1998 University Technology Services, The Ohio State University             7
                                          History of Unix
1984 There are now about 100,000 Unix sites running on many different hardware platforms, of
vastly different capabilities.
1988 AT&T and Sun Microsystems jointly develop System V Release 4 (SVR4). This would later
be developed into UnixWare and Solaris 2.
1995 Santa Cruz Operations buys UnixWare from Novell. Santa Cruz Operations and
Hewlett-Packard announce that they will jointly develop a 64-bit version of Unix.
1996 International Data Corporation forecasts that in 1997 there will be 3 million Unix systems
shipped world-wide.
8              1998 University Technology Services, The Ohio State University   Introduction to Unix
                                         The Operating System
User programs interact with the kernel through a set of standard system calls. These system calls
request services to be provided by the kernel. Such services would include accessing a file: open
close, read, write, link, or execute a file; starting or updating accounting records; changing ownership
of a file or directory; changing to a new directory; creating, suspending, or killing a process; enabling
access to hardware devices; and setting limits on system resources.
Unix is a multi-user, multi-tasking operating system. You can have many users logged into a
system simultaneously, each running many programs. It’s the kernel’s job to keep each process and
user separate and to regulate access to system hardware, including cpu, memory, disk and other I/O
devices.
Introduction to Unix       1998 University Technology Services, The Ohio State University             9
                                         Unix Structure
Programs
Kernel
Hardware
System Calls
10            1998 University Technology Services, The Ohio State University   Introduction to Unix
                                           The File System
The Unix file system looks like an inverted tree structure. You start with the root directory, denoted
by /, at the top and work down through sub-directories underneath it.
                 ttya cua0
                                                     bin lib local
                           passwd group
   sh date csh
                                                  condron frank lindadb
xntp traceroute
Introduction to Unix      1998 University Technology Services, The Ohio State University          11
                                               Unix Structure
Each node is either a file or a directory of files, where the latter can contain other files and
directories. You specify a file or directory by its path name, either the full, or absolute, path name or
the one relative to a location. The full path name starts with the root, /, and follows the branches of
the file system, each separated by /, until you reach the desired file, e.g.:
/home/condron/source/xntp
A relative path name specifies the path relative to another, usually the current working directory that
you are at. Two special directory entries should be introduced now:
So if I’m at /home/frank and wish to specify the path above in a relative fashion I could use:
../condron/source/xntp
This indicates that I should first go up one directory level, then come down through the condron
directory, followed by the source directory and then to xntp.
Every directory and file is listed in its parent directory. In the case of the root directory, that parent
is itself. A directory is a file that contains a table listing the files contained within it, giving file
names to the inode numbers in the list. An inode is a special file designed to be read by the kernel to
learn the information about each file. It specifies the permissions on the file, ownership, date of
creation and of last access and change, and the physical location of the data blocks on the disk
containing the file.
The system does not require any particular structure for the data in the file itself. The file can be
ASCII or binary or a combination, and may represent text data, a shell script, compiled object code
for a program, directory table, junk, or anything you would like.
There’s no header, trailer, label information or EOF character as part of the file.
12               1998 University Technology Services, The Ohio State University      Introduction to Unix
                                            Unix Programs
A program, or command, interacts with the kernel to provide the environment and perform the
functions called for by the user. A program can be: an executable shell file, known as a shell script; a
built-in shell command; or a source compiled, object code file.
The shell is a command line interpreter. The user interacts with the kernel through the shell. You can
write ASCII (text) scripts to be acted upon by a shell.
System programs are usually binary, having been compiled from C source code. These are located in
places like /bin, /usr/bin, /usr/local/bin, /usr/ucb, etc. They provide the functions that you normally
think of when you think of Unix. Some of these are sh, csh, date, who, more, and there are many
others.
Introduction to Unix      1998 University Technology Services, The Ohio State University            13
                                           Getting Started
3.1 Logging in
After connecting with a Unix system, a user is prompted for a login username, then a password. The
login username is the user's unique name on the system. The password is a changeable code known
only to the user. At the login prompt, the user should enter the username; at the password prompt,
the current password should be typed.
Note: Unix is case sensitive. Therefore, the login and password should be typed exactly as issued;
the login, at least, will normally be in lower case.
Most systems are set up so the user is by default prompted for a terminal type, which should be set to
match the terminal in use before proceeding. Most computers work if you choose "vt100". Users
connecting using a Sun workstation may want to use "sun"; those using an X-Terminal may want to
use "xterms" or "xterm".
The terminal type indicates to the Unix system how to interact with the session just opened.
Should you need to reset the terminal type, enter the command:
       setenv TERM <term type>               - if using the C-shell (see Chapter 4.)
       (On some systems, e.g. MAGNUS, it’s also necessary to type "unsetenv TERMCAP".)
       -or-
       TERM=<term type>; export TERM         - if using the Bourne shell (see Chapter 4.)
where <term type> is the terminal type, such as vt100, that you would like set.
14              1998 University Technology Services, The Ohio State University        Introduction to Unix
                                                     Logging in
3.1.2 Passwords
When your account is issued, you will be given an initial password. It is important for system and
personal security that the password for your account be changed to something of your choosing. The
command for changing a password is "passwd". You will be asked both for your old password and to
type your new selected password twice. If you mistype your old password or do not type your new
password the same way twice, the system will indicate that the password has not been changed.
Some system administrators have installed programs that check for appropriateness of password (is it
cryptic enough for reasonable system security). A password change may be rejected by this program.
When choosing a password, it is important that it be something that could not be guessed -- either by
somebody unknown to you trying to break in, or by an acquaintance who knows you. Suggestions for
choosing and using a password follow:
       Don't             use a word (or words) in any language
                         use a proper name
                         use information that can be found in your wallet
                         use information commonly known about you (car license, pet name, etc)
                         use control characters. Some systems can't handle them
                         write your password anywhere
                         ever give your password to *anybody*
       Do                use a mixture of character types (alphabetic, numeric, special)
                         use a mixture of upper case and lower case
                         use at least 6 characters
                         choose a password you can remember
                         change your password often
                         make sure nobody is looking over your shoulder when you are entering your password
                        3.1.3 Exiting
       ^D - indicates end of data stream; can log a user off. The latter is disabled on many systems
       ^C - interrupt
       logout - leave the system
       exit - leave the shell
Introduction to Unix        1998 University Technology Services, The Ohio State University             15
                                              Getting Started
                       3.1.4 Identity
The system identifies you by the user and group numbers (userid and groupid, respectively)
assigned to you by your system administrator. You don’t normally need to know your userid or
groupid as the system translates username ↔ userid, and groupname ↔ groupid automatically. You
probably already know your username; it’s the name you logon with. The groupname is not as
obvious, and indeed, you may belong to more than one group. Your primary group is the one
associated with your username in the password database file, as set up by your system administrator.
Similarly, there is a group database file where the system administrator can assign you rights to
additional groups on the system.
In the examples below % is your shell prompt; you don’t type this in.
You can determine your userid and the list of groups you belong to with the id and groups
commands. On some systems id displays your user and primary group information, e.g.:
        % id
            uid=1101(frank) gid=10(staff)
on other systems it also displays information for any additional groups you belong to:
        % id
            uid=1101(frank) gid=10(staff) groups=10(staff),5(operator),14(sysadmin),110(uts)
The groups command displays the group information for all the groups you belong to, e.g.:
        % groups
           staff sysadmin uts operator
16                 1998 University Technology Services, The Ohio State University     Introduction to Unix
                                                  Control Keys
as in:
         ls -a -l -R
Some commands have options that require parameters. Options requiring parameters are usually
specified separately, e.g.:
         lpr -Pprinter3 -# 2 file
will send 2 copies of file to printer3.
These are the standard conventions for commands. However, not all Unix commands will follow the
standard. Some don’t require the hyphen before options and some won’t let you group options
together, i.e. they may require that each option be preceded by a hyphen and separated by whitespace
from other options and arguments.
Options and syntax for a command are listed in the man page for the command.
Control-U is normally the "line-kill" signal for your terminal. When typed it erases the entire input
line.
In the vi editor you can type a control key into your text file by first typing ^V followed by the control
character desired, so to type ^H into a document type ^V^H.
For new users, the most important use of the stty command is setting the erase function to the
appropriate key on their terminal. For systems programmers or shell script writers, the stty command
provides an invaluable tool for configuring many aspects of I/O control for a given device, including
the following:
         - erase and line-kill characters
         - data transmission speed
         - parity checking on data transmission
         - hardware flow control
         - newline (NL) versus carriage return plus linefeed (CR-LF)
Introduction to Unix          1998 University Technology Services, The Ohio State University          17
                                                  Getting Started
This command is very system specific, so consult the man pages for the details of the stty command
on your system.
Syntax
         stty [options]
Options
         (none)            report the terminal settings
         all (or -a)       report on all options
         echoe             echo ERASE as BS-space-BS
         dec               set modes suitable for Digital Equipment Corporation operating systems (which
                           distinguishes between ERASE and BACKSPACE) (Not available on all systems)
         kill              set the LINE-KILL character
         erase             set the ERASE character
         intr              set the INTERRUPT character
Examples
You can display and change your terminal control settings with the stty command. To display all (-a)
of the current line settings:
         % stty -a
             speed 38400 baud, 24 rows, 80 columns
             parenb -parodd cs7 -cstopb -hupcl cread -clocal -crtscts
             -ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl -iuclc
             ixon -ixany -ixoff imaxbel
             isig iexten icanon -xcase echo echoe echok -echonl -noflsh -tostop
             echoctl -echoprt echoke
             opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel
             erase kill werase rprnt flush lnext susp intr quit stop eof
             ^H ^U ^W ^R ^O ^V ^Z/^Y ^C ^\ ^S/^Q ^D
You can change settings using stty, e.g., to change the erase character from ^? (the delete key) to ^H:
         % stty erase ^H
This will set the terminal options for the current session only. To have this done for you
automatically each time you login, it can be inserted into the .login or .profile file that we’ll look at
later.
18                  1998 University Technology Services, The Ohio State University     Introduction to Unix
                                                      Getting Help
The Unix manual, usually called man pages, is available on-line to explain the usage of the Unix
system and commands. To use a man page, type the command "man" at the system prompt followed
by the command for which you need information.
Syntax
         man [options] command_name
Common Options
         -k keyword                 list command synopsis line for all keyword matches
         -M path                    path to man pages
         -a                         show all matching man pages (SVR4)
Examples
You can use man to provide a one line synopsis of any commands that contain the keyword that you
want to search on with the "-k" option, e.g. to search on the keyword password, type:
         % man -k password
               passwd (5)           - password file
               passwd (1)           - change password information
The number in parentheses indicates the section of the man pages where these references were found.
You can then access the man page (by default it will give you the lower numbered entry, but you can
use a command line option to specify a different one) with:
         % man passwd
         PASSWD(1)                 USER COMMANDS                     PASSWD(1)
         NAME
              passwd     - change password information
         SYNOPSIS
              passwd [ -e login_shell ] [ username ]
         DESCRIPTION
              passwd changes (or sets) a user's password.
              passwd prompts twice for the new password, without displaying
              it. This is to allow for the possibility of typing mistakes.
              Only the user and the super-user can change the user's password.
         OPTIONS
              -e Change the user's login shell.
Here we’ve paraphrased and truncated the output for space and copyright concerns.
Introduction to Unix           1998 University Technology Services, The Ohio State University   19
                                                      Getting Started
The Unix file system is set up like a tree branching out from the root. The the root directory of the
system is symbolized by the forward slash (/). System and user directories are organized under the
root. The user does not have a root directory in Unix; users generally log into their own home
directory. Users can then create other directories under their home. The following table summarizes
some directory navigation commands.
If you’re familiar with DOS the following table comparing similar commands might help to provide
the proper reference frame.
20                   1998 University Technology Services, The Ohio State University    Introduction to Unix
                                          Directory Navigation and Control
You can change to a new directory with the cd, change directory, command. cd will accept both
absolute and relative path names.
Syntax
         cd [directory]
Examples
         cd (also chdir in some shells)         change directory
         cd                                     changes to user's home directory
         cd /                                   changes directory to the system's root
         cd ..                                  goes up one directory level
         cd ../..                               goes up two directory levels
         cd /full/path/name/from/root           changes directory to absolute path named (note the leading slash)
         cd path/from/current/location          changes directory to path relative to current location (no leading
                                                slash)
         cd ~username/directory                 changes directory to the named username's indicated directory
                                                (Note: the ~ is not valid in the Bourne shell; see Chapter 5.)
Introduction to Unix           1998 University Technology Services, The Ohio State University                   21
                                               Getting Started
Syntax
         mkdir [options] directory
Common Options
         -p                      create the intermediate (parent) directories, as needed
         -m mode                 access permissions (SVR4). (We’ll look at modes later in this Chapter).
Examples
         % mkdir /home/frank/data
or, if your present working directory is /home/frank the following would be equivalent:
         % mkdir data
A directory needs to be empty before you can remove it. If it’s not, you need to remove the files first.
Also, you can’t remove a directory if it is your present working directory; you must first change out
of it.
Syntax
         rmdir directory
Examples
To remove the empty directory /home/frank/data while in /home/frank use:
         % rmdir data
or
         % rmdir /home/frank/data
22                1998 University Technology Services, The Ohio State University       Introduction to Unix
                                         Directory Navigation and Control
Syntax
         ls [options] [argument]
Common Options
When no argument is used, the listing will be of the current directory. There are many very useful
options for the ls command. A listing of many of them follows. When using the command, string the
desired options together preceded by "-".
         -a             lists all files, including those beginning with a dot (.).
         -d             lists only names of directories, not the files in the directory
         -F             indicates type of entry with a trailing symbol:
                        directories                 /
                        sockets                     =
                        symbolic links              @
                        executables                 *
         -g             displays Unix group assigned to the file, requires the -l option (BSD only)
                        -or- on an SVR4 machine, e.g. Solaris, this option has the opposite effect
         -L             if the file is a symbolic link, lists the information for the file or directory the link
                        references, not the information for the link itself
         -l             long listing: lists the mode, link information, owner, size, last modification (time). If
                        the file is a symbolic link, an arrow (-->) precedes the pathname of the linked-to file.
The mode field is given by the -l option and consists of 10 characters. The first character is one of
the following:
              CHARACTER            IF ENTRY IS A
              d                    directory
              -                    plain file
              b                    block-type special file
              c                    character-type special file
              l                    symbolic link
              s                    socket
The next 9 characters are in 3 sets of 3 characters each. They indicate the file access permissions:
the first 3 characters refer to the permissions for the user, the next three for the users in the Unix
group assigned to the file, and the last 3 to the permissions for other users on the system.
Designations are as follows:
Introduction to Unix        1998 University Technology Services, The Ohio State University                        23
                                                 Getting Started
            r             read permission
            w             write permission
            x             execute permission
            -             no permission
There are a few less commonly used permission designations for special circumstances. These are
explained in the man page for ls.
Examples
To list all files in a directory, including the hidden (dot) files try:
        % ls -a
            .         .cshrc        .history   .plan      .rhosts         frank
            ..        .emacs        .login     .profile   demofiles       linda
24                  1998 University Technology Services, The Ohio State University    Introduction to Unix
                                                  File Maintenance Commands
To create, copy, remove and change permissions on files you can use the following commands.
If you’re familiar with DOS the following table comparing similar commands might help to provide
the proper reference frame.
Introduction to Unix             1998 University Technology Services, The Ohio State University                               25
                                              Getting Started
Syntax
         cp [options] old_filename new_filename
Common Options
         -i                    interactive (prompt and wait for confirmation before proceeding)
         -r                    recursively copy a directory
Examples
         % cp old_filename new_filename
You now have two copies of the file, each with identical contents. They are completely independent
of each other and you can edit and modify either as needed. They each have their own inode, data
blocks, and directory table entries.
Syntax
         mv [options] old_filename new_filename
Common Options
         -i                    interactive (prompt and wait for confirmation before proceeding)
         -f                    don’t prompt, even when copying over an existing target file (overrides -i)
Examples
         % mv old_filename new_filename
You now have a file called new_filename and the file old_filename is gone. Actually all you’ve
done is to update the directory table entry to give the file a new name. The contents of the file remain
where they were.
26                1998 University Technology Services, The Ohio State University       Introduction to Unix
                                        File Maintenance Commands
Syntax
         rm [options] filename
Common Options
         -i                      interactive (prompt and wait for confirmation before proceeding)
         -r                      recursively remove a directory, first removing the files and subdirectories
                                 beneath it
         -f                      don’t prompt for confirmation (overrides -i)
Examples
         % rm old_filename
A listing of the directory will now show that the file no longer exists. Actually, all you’ve done is to
remove the directory table entry and mark the inode as unused. The file contents are still on the disk,
but the system now has no way of identifying those data blocks with a file name. There is no
command to "unremove" a file that has been removed in this way. For this reason many novice users
alias their remove command to be "rm -i", where the -i option prompts them to answer yes or no
before the file is removed. Such aliases are normally placed in the .cshrc file for the C shell; see
Chapter 5)
Each file, directory, and executable has permissions set for who can read, write, and/or execute it.
To find the permissions assigned to a file, the ls command with the -l option should be used. Also,
using the -g option with "ls -l" will help when it is necessary to know the group for which the
permissions are set (BSD only).
When using the "ls -lg" command on a file (ls -l on SysV), the output will appear as follows:
The area above designated by letters and dashes (-rwxr-x---) is the area showing the file type and
permissions as defined in the previous Section. Therefore, a permission string, for example, of
-rwxr-x--- allows the user (owner) of the file to read, write, and execute it; those in the unixgroup of
the file can read and execute it; others cannot access it at all.
Introduction to Unix        1998 University Technology Services, The Ohio State University                    27
                                               Getting Started
The command to change permissions on an item (file, directory, etc) is chmod (change mode). The
syntax involves using the command with three digits (representing the user (owner, u) permissions,
the group (g) permissions, and other (o) user's permissions) followed by the argument (which may
be a file name or list of files and directories). Or by using symbolic representation for the
permissions and who they apply to.
or a single letter:
         read=r, write=w, execute=x
A permission of 4 or r would specify read permissions. If the permissions desired are read and write,
the 4 (representing read) and the 2 (representing write) are added together to make a permission of 6.
Therefore, a permission setting of 6 would allow read and write permissions.
Alternatively, you could use symbolic notation which uses the one letter representation for who and
for the permissions and an operator, where the operator can be:
         +                      add permissions
         -                      remove permissions
         =                      set permissions
So to set read and write for the owner we could use "u=rw" in symbolic notation.
Syntax
         chmod nnn [argument list]                   numeric mode
         chmod [who]op[perm] [argument list]         symbolic mode
where nnn are the three numbers representing user, group, and other permissions, who is any of u, g,
o, or a (all) and perm is any of r, w, x. In symbolic notation you can separate permission
specifications by commas, as shown in the example below.
Common Options
         -f                     force (no error message is generated if the change is unsuccessful)
         -R                     recursively descend through the directory structure and change the modes
Examples
If the permission desired for file1 is user: read, write, execute, group: read, execute, other: read,
execute, the command to use would be
         chmod 755 file1              or             chmod u=rwx,go=rx file1
28                1998 University Technology Services, The Ohio State University        Introduction to Unix
                                         File Maintenance Commands
Reminder: When giving permissions to group and other to use a file, it is necessary to allow at least
execute permission to the directories for the path in which the file is located. The easiest way to do
this is to be in the directory for which permissions need to be granted:
         chmod 711 .         or           chmod u=rw,+x .           or         chmod u=rwx,go=x .
Ownership of a file can be changed with the chown command. On most versions of Unix this can
only be done by the super-user, i.e. a normal user can’t give away ownership of their files. chown is
used as below, where # represents the shell prompt for the super-user:
Syntax
         chown [options] user[:group] file                 (SVR4)
         chown [options] user[.group] file                 (BSD)
Common Options
         -R                       recursively descend through the directory structure
         -f                       force, and don’t report any errors
Examples
         # chown new_owner file
Anyone can change the group of files they own, to another group they belong to, with the chgrp
command.
Syntax
         chgrp [options] group file
Common Options
         -R                       recursively descend through the directory structure
         -f                       force, and don’t report any errors
Examples
         % chgrp new_group file
Introduction to Unix         1998 University Technology Services, The Ohio State University        29
                                                      Getting Started
Syntax
         echo [string]
Common Options
         -n                            don’t print <new-line> (BSD, shell built-in)
         \c                            don’t print <new-line> (SVR4)
         \0n                           where n is the 8-bit ASCII character code (SVR4)
         \t                            tab (SVR4)
         \f                            form-feed (SVR4)
         \n                            new-line (SVR4)
         \v                            vertical tab (SVR4)
Examples
         % echo Hello Class                   or                  echo "Hello Class"
where the style to use in the last example depends on the echo command in use.
The \x options must be within pairs of single or double quotes, with or without other string characters.
30                      1998 University Technology Services, The Ohio State University               Introduction to Unix
                                                  Display Commands
Syntax
         cat [options] [file]
Common Options
         -n                          precede each line with a line number
         -v                          display non-printing characters, except tabs, new-lines, and form-feeds
         -e                          display $ at the end of each line (prior to new-line) (when used with -v option)
Examples
         % cat filename
You can list a series of files on the command line, and cat will concatenate them, starting each in turn,
immediately after completing the previous one, e.g.:
         % cat file1 file2 file3
Syntax
         more [options] [+/pattern] [filename]
         less [options] [+/pattern] [filename]
         pg [options] [+/pattern] [filename]
Options
         more             less               pg               Action
         -c               -c                 -c               clear display before displaying
                          -i                                  ignore case
         -w               default            default          don’t exit at end of input, but prompt and wait
         -lines                              -lines           # of lines/screenful
         +/pattern        +/pattern          +/pattern        search for the pattern
Introduction to Unix             1998 University Technology Services, The Ohio State University                  31
                                                  Getting Started
Internal Controls
         more                              displays (one screen at a time) the file requested
                <space bar>                to view next screen
                <return> or <CR>           to view one more line
                q                          to quit viewing the file
                h                          help
                b                          go back up one screenful
                /word                      search for word in the remainder of the file
                                           See the man page for additional options
         less                              similar to more; see the man page for options
         pg                                the SVR4 equivalent of more (page)
Syntax
         head [options] file
Common Options
         -n number                 number of lines to display, counting from the top of the file
         -number                   same as above
Examples
By default head displays the first 10 lines. You can display more with the "-n number", or
"-number" options, e.g., to display the first 40 lines:
         % head -40 filename               or          head -n 40 filename
Syntax
         tail [options] file
Common Options
         -number                   number of lines to display, counting from the bottom of the file
Examples
The default is to display the last 10 lines, but you can specify different line or byte numbers, or a
different starting point within the file. To display the last 30 lines of a file use the -number style:
         % tail -30 filename
32                   1998 University Technology Services, The Ohio State University            Introduction to Unix
                                                 System Resources
Introduction to Unix            1998 University Technology Services, The Ohio State University                           33
                                            System Resources & Printing
Syntax
         df [options] [resource]
Common Options
         -l                        local file systems only (SVR4)
         -k                        report in kilobytes (SVR4)
Examples
         {unix prompt 1} df
              Filesystem                        kbytes          used      avail capacity           Mounted on
              /dev/sd0a                          20895        19224              0     102%        /
              /dev/sd0h                         319055      131293       155857          46%       /usr
              /dev/sd1g                         637726      348809       225145          61%       /usr/local
              /dev/sd1a                         240111      165489        50611          77%
              /home/guardian
              peri:/usr/local/backup
                                               1952573      976558       780758          56%
              /usr/local/backup
              peri:/home/peri                   726884      391189       263007          60%       /home/peri
              peri:/usr/spool/mail              192383          1081     172064           1%
              /var/spool/mail
              peri:/acs/peri/2                  723934      521604      129937          80%       /acs/peri/2
Syntax
         du [options] [directory or file]
Common Options
         -a                        display disk usage for each file, not just subdirectories
         -s                        display a summary total only
         -k                        report in kilobytes (SVR4)
34                 1998 University Technology Services, The Ohio State University             Introduction to Unix
                                                  System Resources
Examples
         {unix prompt 3} du
              1    ./.elm
              1    ./Mail
              1    ./News
              20   ./uc
              86   .
         {unix prompt 4} du -a uc
              7    uc/unixgrep.txt
              5    uc/editors.txt
              1    uc/.emacs
              1    uc/.exrc
              4    uc/telnet.ftp
              1    uc/uniq.tee.txt
              20   uc
Syntax
         ps [options]
Common Options
         BSD            SVR4
         -a             -e                  all processes, all users
         -e                                 environment/everything
         -g                                 process group leaders as well
         -l             -l                  long format
         -u             -u user             user oriented report
         -x             -e                  even processes not executed from terminals
                        -f                  full listing
         -w                                 report first 132 characters per line
note -- Because the ps command is highly system-specific, it is recommended that you consult the
man pages of your system for details of options and interpretation of ps output.
Introduction to Unix             1998 University Technology Services, The Ohio State University   35
                                             System Resources & Printing
Examples
         {unix prompt 5} ps
                PID TT STAT            TIME COMMAND
              15549 p0 IW              0:00 -tcsh (tcsh)
              15588 p0 IW              0:00 man nice
              15594 p0 IW              0:00 sh -c less /tmp/man15588
              15595 p0 IW              0:00 less /tmp/man15588
              15486 p1 S               0:00 -tcsh (tcsh)
              15599 p1 T               0:00 emacs unixgrep.txt
              15600 p1 R               0:00 ps
Syntax
         kill [-signal] process-id
Common Options
         -l                          displays the available kill signals:
Examples
         {unix prompt 9} kill -l
              HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP
              TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH LOST USR1 USR2
The -KILL signal, also specified as -9 (because it is 9th on the above list), is the most commonly
used kill signal. Once seen, it can’t be ignored by the program whereas the other signals can.
         {unix prompt 10} kill -9 15599
              [1] + Killed             emacs unixgrep.txt
36                 1998 University Technology Services, The Ohio State University   Introduction to Unix
                                              System Resources
Syntax
         who [am i]
Examples
         beauty condron>who
            wmtell   ttyp1            Apr   21   20:15      (apple.acs.ohio-s)
            fbwalk   ttyp2            Apr   21   23:21      (worf.acs.ohio-st)
            stwang   ttyp3            Apr   21   23:22      (127.99.25.8)
            david    ttyp4            Apr   21   22:27      (slip1-61.acs.ohi)
            tgardner ttyp5            Apr   21   23:07      (picard.acs.ohio-)
            awallace ttyp6            Apr   21   23:00      (ts31-4.homenet.o)
            gtl27    ttyp7            Apr   21   23:24      (data.acs.ohio-st)
            ccchang ttyp8             Apr   21   23:32      (slip3-10.acs.ohi)
            condron ttypc             Apr   21   23:38      (lcondron-mac.acs)
            dgildman ttype            Apr   21   22:30      (slip3-36.acs.ohi)
            fcbetz   ttyq2            Apr   21   21:12      (ts24-10.homenet.)
         beauty condron>who am i
            beauty!condron ttypc                 Apr 21 23:38           (lcondron-mac.acs)
whereis reports the filenames of source, binary, and manual page files associated with command(s).
Syntax
         whereis [options] command(s)
Common Options
         -b                      report binary files only
         -m                      report manual sections only
         -s                      report source files only
Examples
         brigadier: condron [69]> whereis Mail
             Mail: /usr/ucb/Mail /usr/lib/Mail.help /usr/lib/Mail.rc /usr/man/man1/Mail.1
Introduction to Unix         1998 University Technology Services, The Ohio State University     37
                                           System Resources & Printing
Syntax
         which command(s)
example--
         brigadier: condron [73]> which Mail
              /usr/ucb/Mail
uname has additional options to print information about system hardware type and software version.
script creates a script of your session input and output. Using the script command, you can capture
all the data transmission from and to your terminal screen until you exit the script program. This can
be useful during the programming-and-debugging process, to document the combination of things
you have tried, or to get a printed copy of it all for later perusal.
Syntax
         script [-a] [file] <. . .> exit
Common Options
         -a                        append the output to file
You must remember to type exit to end your script session and close your typescript file.
38                  1998 University Technology Services, The Ohio State University   Introduction to Unix
                                        System Resources
Examples
       beauty condron>script
          Script started, file is typescript
       beauty condron>ps
            PID TT STAT   TIME COMMAND
          23323 p8 S      0:00 -h -i (tcsh)
          23327 p8 R      0:00 ps
          18706 pa S      0:00 -tcsh (tcsh)
          23315 pa T      0:00 emacs
          23321 pa S      0:00 script
          23322 pa S      0:00 script
           3400 pb I      0:00 -tcsh (tcsh)
       beauty condron>kill -9 23315
       beauty condron>date
          Mon Apr 22 22:29:44 EDT 1996
       beauty condron>exit
          exit
          Script done, file is typescript
          [1] + Killed                  emacs
Introduction to Unix    1998 University Technology Services, The Ohio State University   39
                                          System Resources & Printing
Syntax
         date [options] [+format]
Common Options
         -u                       use Universal Time (or Greenwich Mean Time)
         +format                  specify the output format
              %a                  weekday abbreviation, Sun to Sat
              %h                  month abbreviation, Jan to Dec
              %j                  day of year, 001 to 366
              %n                  <new-line>
              %t                  <TAB>
              %y                  last 2 digits of year, 00 to 99
              %D                  MM/DD/YY date
              %H                  hour, 00 to 23
              %M                  minute, 00 to 59
              %S                  second, 00 to 59
              %T                  HH:MM:SS time
Examples
         beauty condron>date
              Mon Jun 10 09:01:05 EDT 1996
         beauty condron>date -u
              Mon Jun 10 13:01:33 GMT 1996
40                   1998 University Technology Services, The Ohio State University   Introduction to Unix
                                                  Print Commands
The print commands allow us to print files to standard output (pr) or to a line printer (lp/lpr) while
filtering the output. The BSD and SysV printer commands use different names and different options
to produce the same results: lpr, lprm, and lpq vs lp, cancel, and lpstat for the BSD and SysV submit,
cancel, and check the status of a print job, respectively.
Syntax
         lp [options] filename
         lpr [options] filename
Common Options
         lp                    lpr                   function
         -n number             -#number              number of copies
         -t title              -Ttitle               title for job
         -d destination        -Pprinter             printer name
         -c                    (default)             copy file to queue before printing
         (default)             -s                    don’t copy file to queue before printing
         -o option                                   additional options, e.g. nobanner
Files beginning with the string "%!" are assumed to contain PostScript commands.
Examples
This submits the job to the queue for the default printer, lp, with the request-id lp-153.
Introduction to Unix           1998 University Technology Services, The Ohio State University        41
                                              System Resources & Printing
Syntax
         lpstat [options]
         lpq [options] [job#] [username]
Common Options
         lpstat                       lpq                            function
         -d                           (defaults to lp)               list system default destination
         -s                                                          summarize print status
         -t                                                          print all status information
         -u [login-ID-list]                                          user list
         -v                                                          list printers known to the system
         -p printer_dest              -Pprinter_dest                 list status of printer, printer_dest
Examples
         % lpstat
              lp-153          frank         208068       Apr 29 15:14 on lp
Syntax
         cancel [request-ID] [printer]
         lprm [options] [job#] [username]
Common Options
         cancel                       lprm                           function
                                      -Pprinter                      specify printer
                                      -                              all jobs for user
         -u [login-ID-list]                                          user list
Examples
42                   1998 University Technology Services, The Ohio State University                Introduction to Unix
                                                Print Commands
Syntax
         pr [options] file
Common Options
         +page_number             start printing with page page_number of the formatted input file
         -column                  number of columns
         -a                       modify -column option to fill columns in round-robin order
         -d                       double spacing
         -e[char][gap]            tab spacing
         -h header_string         header for each page
         -l lines                 lines per page
         -t                       don’t print the header and trailer on each page
         -w width                 width of page
Examples
The file containing the list of P. G. Wodehouse’s Lord Emsworth books could be printed, at 14 lines
per page (including 5 header and 5 (empty) trailer lines) below, where the -e option specifies the
<tab> conversion style:
         % pr -l 14 -e42 wodehouse
Introduction to Unix          1998 University Technology Services, The Ohio State University         43
                                System Resources & Printing
44          1998 University Technology Services, The Ohio State University   Introduction to Unix
                                            Print Commands
CHAPTER 5 Shells
The shell sits between you and the operating system, acting as a command interpreter. It reads your
terminal input and translates the commands into actions taken by the system. The shell is analogous
to command.com in DOS. When you log into the system you are given a default shell. When the shell
starts up it reads its startup files and may set environment variables, command search paths, and
command aliases, and executes any commands specified in these files.
The original shell was the Bourne shell, sh. Every Unix platform will either have the Bourne shell, or
a Bourne compatible shell available. It has very good features for controlling input and output, but is
not well suited for the interactive user. To meet the latter need the C shell, csh, was written and is now
found on most, but not all, Unix systems. It uses C type syntax, the language Unix is written in, but
has a more awkward input/output implementation. It has job control, so that you can reattach a job
running in the background to the foreground. It also provides a history feature which allows you to
modify and repeat previously executed commands.
The default prompt for the Bourne shell is $ (or #, for the root user). The default prompt for the C shell
is %.
Numerous other shells are available from the network. Almost all of them are based on either sh or
csh with extensions to provide job control to sh, allow in-line editing of commands, page through
previously executed commands, provide command name completion and custom prompt, etc. Some
of the more well known of these may be on your favorite Unix system: the Korn shell, ksh, by David
Korn and the Bourne Again SHell, bash, from the Free Software Foundations GNU project, both based
on sh, the T-C shell, tcsh, and the extended C shell, cshe, both based on csh. Below we will describe
some of the features of sh and csh so that you can get started.
Introduction to Unix       1998 University Technology Services, The Ohio State University             45
                                                    Shells
                     5.1.1 Sh
For the Bourne shell some of the more commonly used built-in commands are:
       :                      null command
       .                      source (read and execute) commands from a file
       case                   case conditional loop
       cd                     change the working directory (default is $HOME)
       echo                   write a string to standard output
       eval                   evaluate the given arguments and feed the result back to the shell
       exec                   execute the given command, replacing the current shell
       exit                   exit the current shell
       export                 share the specified environment variable with subsequent shells
       for                    for conditional loop
       if                     if conditional loop
       pwd                    print the current working directory
       read                   read a line of input from stdin
       set                    set variables for the shell
       test                   evaluate an expression as true or false
       trap                   trap for a typed signal and execute commands
       umask                  set a default file permission mask for new files
       unset                  unset shell variables
       wait                   wait for a specified process to terminate
       while                  while conditional loop
46               1998 University Technology Services, The Ohio State University       Introduction to Unix
                                            Built-in Commands
                       5.1.2 Csh
For the C shell the more commonly used built-in functions are:
       alias                   assign a name to a function
       bg                      put a job into the background
       cd                      change the current working directory
       echo                    write a string to stdout
       eval                    evaluate the given arguments and feed the result back to the shell
       exec                    execute the given command, replacing the current shell
       exit                    exit the current shell
       fg                      bring a job to the foreground
       foreach                 for conditional loop
       glob                    do filename expansion on the list, but no "\" escapes are honored
       history                 print the command history of the shell
       if                      if conditional loop
       jobs                    list or control active jobs
       kill                    kill the specified process
       limit                   set limits on system resources
       logout                  terminate the login shell
       nice command            lower the scheduling priority of the process, command
       nohup command           do not terminate command when the shell exits
       popd                    pop the directory stack and return to that directory
       pushd                   change to the new directory specified and add the current one to the directory
                               stack
       rehash                  recreate the hash table of paths to executable files
       repeat                  repeat a command the specified number of times
       set                     set a shell variable
       setenv                  set an environment variable for this and subsequent shells
       source                  source (read and execute) commands from a file
       stop                    stop the specified background job
       switch                  switch conditional loop
       umask                   set a default file permission mask for new files
       unalias                 remove the specified alias name
       unset                   unset shell variables
       unsetenv                unset shell environment variables
       wait                    wait for all background processes to terminate
       while                   while conditional loop
Introduction to Unix       1998 University Technology Services, The Ohio State University                 47
                                                 Shells
The current value of the variable is accessed via the "$name", or "${name}", notation.
48               1998 University Technology Services, The Ohio State University     Introduction to Unix
                                              The Bourne Shell, sh
Introduction to Unix           1998 University Technology Services, The Ohio State University           49
                                                     Shells
50               1998 University Technology Services, The Ohio State University            Introduction to Unix
                                                  Job Control
Some new features here that we didn’t see in .profile are noclobber, ignoreeof, and history.
Noclobber indicates that output will not be redirected to existing files, while ignoreeof specifies that
EOF (^D) will not cause the login shell to exit and log you off the system.
With the history feature you can recall previously executed commands and re-execute them, with
changes if desired.
An alias allows you to use the specified alias name instead of the full command. In the "ls" example
above, typing "ls" will result in "/usr/bin/ls -sbF" being executed. You can tell which "ls" command
is in your path with the built-in which command, i.e.:
       which ls
       ls:          aliased to /usr/bin/ls -sbF
A simple .login could be:
       # .login
       stty erase ^H                                     # set Control-H to be the erase key
       set noglob                                        # prevent wild card pattern matching
       eval ‘tset -Q -s -m ’:?xterm’‘                    # prompt for the terminal type, assume "xterm"
       unset noglob                                    # re-enable wild card pattern matching
Setting and unsetting noglob around tset prevents it from being confused by any csh filename wild card
pattern matching or expansion.
Should you make any changes to your startup files you can initiate the change by sourcing the changed
file. For csh you do this with the built-in source command, i.e.:
       source .cshrc
For further information about csh type "man csh" at the shell prompt.
With the C shell, csh, and many newer shells including some newer Bourne shells, you can put jobs
into the background at anytime by appending "&" to the command, as with sh. After submitting a
command you can also do this by typing ^Z (Control-Z) to suspend the job and then "bg" to put it into
the background. To bring it back to the foreground type "fg".
You can have many jobs running in the background. When they are in the background they are no
longer connected to the keyboard for input, but they may still display output to the terminal,
interspersing with whatever else is typed or displayed by your current job. You may want to redirect
I/O to or from files for the job you intend to background. Your keyboard is connected only to the
current, foreground, job.
The built-in jobs command allows you to list your background jobs. You can use the kill command to
kill a background job. With the %n notation you can reference the nth background job with either of
these commands, replacing n with the job number from the output of jobs. So kill the second
background job with "kill %2" and bring the third job to the foreground with "fg %3".
Introduction to Unix        1998 University Technology Services, The Ohio State University               51
                                                  Shells
                        5.6 History
The C shell, the Korn shell and some other more advanced shells, retain information about the former
commands you’ve executed in the shell. How history is done will depend on the shell used. Here
we’ll describe the C shell history features.
You can use the history and savehist variables to set the number of previously executed commands
to keep track of in this shell and how many to retain between logins, respectively. You could put a
line such as the following in .cshrc to save the last 100 commands in this shell and the last 50 through
the next login.
       set history=100 savehist=50
The shell keeps track of the history list and saves it in ~/.history between logins.
You can use the built-in history command to recall previous commands, e.g. to print the last 10:
       % history 10
       52 cd workshop
       53 ls
       54 cd unix_intro
       55 ls
       56 pwd
       57 date
       58 w
       59 alias
       60 history
       61 history 10
52                 1998 University Technology Services, The Ohio State University     Introduction to Unix
                                                       History
You can repeat any numbered command by prefacing the number with a !, e.g.:
          % !57
          date
          Tue Apr 9 09:55:31 EDT 1996
Or repeat a command starting with any string by prefacing the starting unique part of the string with a
!, e.g.:
          % !da
          date
          Tue Apr 9 09:55:31 EDT 1996
When the shell evaluates the command line it first checks for history substitution before it interprets
anything else. Should you want to use one of these special characters in a shell command you will
need to escape, or quote it first, with a \ before the character, i.e. \!. The history substitution
characters are summarized in the following table.
Introduction to Unix       1998 University Technology Services, The Ohio State University                       53
                                                     Shells
54                  1998 University Technology Services, The Ohio State University         Introduction to Unix
                                           File Descriptors
One of the most important contributions Unix has made to Operating Systems is the provision of
many utilities for doing common tasks or obtaining desired information. Another is the standard way
in which data is stored and transmitted in Unix systems. This allows data to be transmitted to a file,
the terminal screen, or a program, or from a file, the keyboard, or a program; always in a uniform
manner. The standardized handling of data supports two important features of Unix utilities: I/O
redirection and piping.
With output redirection, the output of a command is redirected to a file rather than to the terminal
screen. With input redirection, the input to a command is given via a file rather than the keyboard.
Other tricks are possible with input and output redirection as well, as you will see. With piping, the
output of a command can be used as input (piped) to a subsequent command. In this chapter we discuss
many of the features and utilities available to Unix users.
Normally input is from the keyboard or a file. Output, both stdout and stderr, normally go to the
terminal, but you can redirect one or both of these to one or more files.
You can also specify additional file descriptors, designating them by a number 3 through 9, and
redirect I/O through them.
Output redirection takes the output of a command and places it into a named file. Input redirection
reads the file as input to the command. The following table summarizes the redirection options.
Introduction to Unix      1998 University Technology Services, The Ohio State University          55
                                               Special Unix Features
       Symbol                                                    Redirection
 >                           output redirect
 >!                          same as above, but overrides noclobber option of csh
 >>                          append output
 >>!                         same as above, but overrides noclobber option on csh and creates the file if
                             it doesn’t already exist.
 |                           pipe output to another command
 <                           input redirection
 <<String                    read from standard input until "String" is encountered as the only thing on the line.
                             Also known as a "here document" (see Chapter 8).
 <<\String                   same as above, but don’t allow shell substitutions
An example of output redirection is:
        cat file1 file2 > file3
The above command concatenates file1 then file2 and redirects (sends) the output to file3. If file3
doesn't already exist it is created. If it does exist it will either be truncated to zero length before the
new contents are inserted, or the command will be rejected, if the noclobber option of the csh is set.
(See the csh in Chapter 4). The original files, file1 and file2, remain intact as separate entities.
Output is appended to a file in the form:
        cat file1 >> file2
This command appends the contents of file1 to the end of what already exists in file2. (Does not
overwrite file2).
Input is redirected from a file in the form:
        program < file
This command takes the input for program from file.
To pipe output to another command use the form:
        command | command
This command makes the output of the first command the input of the second command.
                         6.2.1 Csh
        >& file                     redirect stdout and stderr to file
        >>&                         append stdout and stderr to file
        |& command                  pipe stdout and stderr to command
To redirect stdout and stderr to two separate files you need to first redirect stdout in a sub-shell, as in:
        % (command > out_file) >& err_file
56                1998 University Technology Services, The Ohio State University             Introduction to Unix
                                                File Redirection
                       6.2.2 Sh
        2> file                 direct stderr to file
        > file 2>&1             direct both stdout and stderr to file
        >> file 2>&1            append both stdout and stderr to file
        2>&1 | command          pipe stdout and stderr to command
To redirect stdout and stderr to two separate files you can do:
        $ command 1> out_file 2> err_file
With the Bourne shell you can specify other file descriptors (3 through 9) and redirect output through
them. This is done with the form:
        n>&m                    redirect file descriptor n to file descriptor m
We used the above to send stderr (2) to the same place as stdout (1), 2>&1, when we wanted to have
error messages and normal messages to go to file instead of the terminal. If we wanted only the error
messages to go to the file we could do this by using a place holder file descriptor, 3. We’ll first
redirect 3 to 2, then redirect 2 to 1, and finally, we’ll redirect 1 to 3:
        $ (command 3>&2 2>&1 1>&3) > file
This sends stderr to 3 then to 1, and stdout to 3, which is redirected to 2. So, in effect, we’ve reversed
file descriptors 1 and 2 from their normal meaning. We might use this in the following example:
        $ (cat file 3>&2 2>&1 1>&3) > errfile
So if file is read the information is discarded from the command output, but if file can’t be read the
error message is put in errfile for your later use.
You can close file descriptors when you’re done with them:
        m<&-                    closes an input file descriptor
        <&-                     closes stdin
        m>&-                    closes an output file descriptor
        >&-                     closes stdout
Introduction to Unix       1998 University Technology Services, The Ohio State University             57
                                            Special Unix Features
The \ character can also be used to escape the <newline> character so that you can continue a long
command on more than one physical line of text.
58                 1998 University Technology Services, The Ohio State University       Introduction to Unix
                                      Regular Expression Syntax
Regular expression syntax is as follows. Some programs will accept all of these, others may only
accept some.
       .                     match any single character except <newline>
       *                     match zero or more instances of the single character (or meta-character)
                             immediately preceding it
       [abc]                 match any of the characters enclosed
       [a-d]                 match any character in the enclosed range
       [^exp]                match any character not in the following expression
       ^abc                  the regular expression must start at the beginning of the line (Anchor)
       abc$                  the regular expression must end at the end of the line (Anchor)
       \                     treat the next character literally. This is normally used to escape the meaning
                             of special characters such as "." and "*".
       \{n,m\}               match the regular expression preceding this a minimum number of n times
                             and a maximum of m times (0 through 255 are allowed for n and m). The \{
                             and \} sets should be thought of as single operators. In this case the \
                             preceding the bracket does not escape its special meaning, but rather turns on
                             a new one.
       \<abc\>               will match the enclosed regular expression as long as it is a separate word.
                             Word boundaries are defined as beginning with a <newline> or anything
                             except a letter, digit or underscore (_) or ending with the same or a end-of-line
                             character. Again the \< and \> sets should be thought of as single operators.
Introduction to Unix     1998 University Technology Services, The Ohio State University                   59
                                                Text Processing
       \(abc\)                 saves the enclosed pattern in a buffer. Up to nine patterns can be saved for
                               each line. You can reference these latter with the \n character set. Again the
                               \( and \) sets should be thought of as single operators.
       \n                      where n is between 1 and 9. This matches the nth expression previously
                               saved for this line. Expressions are numbered starting from the left. The \n
                               should be thought of as a single operator.
       &                       print the previous search pattern (used in the replacement string)
There are a few meta-characters used only by awk and egrep. These are:
       +                       match one or more of the preceding expression
       ?                       match zero or more of the preceding expression
       |                       separator. Match either the preceding or following expression.
       ()                      group the regular expressions within and apply the match to the set.
60                1998 University Technology Services, The Ohio State University           Introduction to Unix
                                              Text Processing Commands
7.2.1 grep
This section provides an introduction to the use of regular expressions and grep.
The grep utility is used to search for generalized regular expressions occurring in Unix files. Regular
expressions, such as those shown above, are best specified in apostrophes (or single quotes) when
specified in the grep utility. The egrep utility provides searching capability using an extended set of
meta-characters. The syntax of the grep utility, some of the available options, and a few examples are
shown below.
Syntax
         grep [options] regexp [file[s]]
Common Options
         -i                          ignore case
         -c                          report only a count of the number of lines containing matches, not the
                                     matches themselves
         -v                          invert the search, displaying only lines that do not match
         -n                          display the line number along with the line on which a match was found
         -s                          work silently, reporting only the final status:
                                              0, for match(es) found
                                              1, for no matches
                                              2, for errors
         -l                          list filenames, but not lines, in which matches were found
Introduction to Unix            1998 University Technology Services, The Ohio State University                         61
                                                Text Processing
Examples
Here are some grep examples using this file. In the first we’ll search for the number 15:
       {unix prompt 6} grep '15' num.list
            1       15    fifteen
           15        1    one
Now we’ll use the "-c" option to count the number of lines matching the search criterion:
       {unix prompt 7} grep -c '15' num.list
           2
Here we’ll be a little more general in our search, selecting for all lines containing the character 1
followed by either of 1, 2 or 5:
       {unix prompt 8} grep '1[125]' num.list
            1       15    fifteen
            4       12    twelve
            5       11    eleven
           11        5    five
           12        4    four
           15        1    one
62              1998 University Technology Services, The Ohio State University    Introduction to Unix
                                         Text Processing Commands
Now we’ll search for all lines that begin with a space:
       {unix prompt 9} grep '^ ' num.list
            1          15    fifteen
            2          14    fourteen
            3          13    thirteen
            4          12    twelve
            5          11    eleven
            6          10    ten
            7          9     nine
            8          8     eight
            9          7     seven
The latter could also be done by using the -v option with the original search string, e.g.:
       {unix prompt 11} grep -v '^ ' num.list
           10           6    six
           11           5    five
           12           4    four
           13           3    three
           14           2    two
           15           1    one
Here we search for all lines that begin with the characters 1 through 9:
       {unix prompt 12} grep '^[1-9]' num.list
           10           6    six
           11           5    five
           12           4    four
           13           3    three
           14           2    two
           15           1    one
Introduction to Unix         1998 University Technology Services, The Ohio State University   63
                                               Text Processing
This example will search for any instances of t followed by zero or more occurrences of e:
       {unix prompt 13} grep 'te*' num.list
           1         15    fifteen
           2         14    fourteen
           3         13    thirteen
           4         12    twelve
           6         10    ten
           8          8    eight
           13         3    three
           14         2    two
This example will search for any instances of t followed by one or more occurrences of e:
       {unix prompt 14} grep 'tee*' num.list
           1         15    fifteen
           2         14    fourteen
           3         13    thirteen
           6         10    ten
We can also take our input from a program, rather than a file. Here we report on any lines output by
the who program that begin with the letter l.
       {unix prompt 15} who | grep '^l'
           lcondron ttyp0 Dec 1 02:41 (lcondron-pc.acs.)
64               1998 University Technology Services, The Ohio State University   Introduction to Unix
                                         Text Processing Commands
                       7.2.2 sed
The non-interactive, stream editor, sed, edits the input stream, line by line, making the specified
changes, and sends the result to standard output.
Syntax
         sed [options] edit_command [file]
where the addresses are optional and can be separated from the function by spaces or tabs. The
function is required. The arguments may be optional or required, depending on the function in use.
Line-number Addresses are decimal line numbers, starting from the first input line and incremented
by one for each. If multiple input files are given the counter continues cumulatively through the files.
The last input line can be specified with the "$" character.
Context Addresses are the regular expression patterns enclosed in slashes (/).
Substitution functions allow context searches and are specified in the form:
         s/regular_expression_pattern/replacement_string/flag
and should be quoted with single quotes (’) if additional options or functions are specified. These
patterns are identical to context addresses, except that while they are normally enclosed in slashes (/),
any normal character is allowed to function as the delimiter, other than <space> and <newline>.
The replacement string is not a regular expression pattern; characters do not have special meanings
here, except:
         &                      substitute the string specified by regular_expression_pattern
         \n                     substitute the nth string matched by regular_expression_pattern enclosed in
                                ’\(’, ’\)’ pairs.
These special characters can be escaped with a backslash (\) to remove their special meaning.
Introduction to Unix        1998 University Technology Services, The Ohio State University                     65
                                                      Text Processing
Common Options
       -e script                     edit script
       -n                            don’t print the default output, but only those lines specified by p or s///p
                                     functions
       -f script_file                take the edit scripts from the file, script_file
Examples
This example changes all incidents of a comma (,) into a comma followed by a space (, ) when doing
output:
       % cat filey | sed s/,/,\ /g
The following example removes all incidents of Jr preceded by a space ( Jr) in filey:
       % cat filey | sed s/\ Jr//g
To perform multiple operations on the input precede each operation with the -e (edit) option and
quote the strings. For example, to filter for lines containing "Date: " and "From: " and replace these
without the colon (:), try:
       sed -e ’s/Date: /Date /’ -e ’s/From: /From /’
To print only those lines of the file from the one beginning with "Date:" up to, and including, the one
beginning with "Name:" try:
       sed -n ’/^Date:/,/^Name:/p’
To print only the first 10 lines of the input (a replacement for head):
       sed -n 1,10p
66                  1998 University Technology Services, The Ohio State University              Introduction to Unix
                                           Text Processing Commands
awk searches its input for patterns and performs the specified operation on each line, or fields of the
line, that contain those patterns. You can specify the pattern matching statements for awk either on
the command line, or by putting them in a file and using the -f program_file option.
Syntax
         awk program [file]
fields. Each input line is checked for a pattern match with the indicated action being taken on a
match. This continues through the full sequence of patterns, then the next line of input is checked.
Input is divided into records and fields. The default record separator is <newline>, and the variable
NR keeps the record count. The default field separator is whitespace, spaces and tabs, and the
variable NF keeps the field count. Input field, FS, and record, RS, separators can be set at any time to
match any single character. Output field, OFS, and record, ORS, separators can also be changed to
any single character, as desired. $n, where n is an integer, is used to represent the nth field of the
input record, while $0 represents the entire input record.
BEGIN and END are special patterns matching the beginning of input, before the first field is read,
and the end of input, after the last field is read, respectively.
Printing is allowed through the print, and formatted print, printf, statements.
Comma separated patterns define the range for which the pattern is applicable, e.g.:
         /first/,/last/
selects all lines starting with the one containing first, and continuing inclusively, through the one
containing last.
Introduction to Unix           1998 University Technology Services, The Ohio State University       67
                                              Text Processing
Regular expressions must be enclosed with slashes (/) and meta-characters can be escaped with the
backslash (\). Regular expressions can be grouped with the operators:
       |                       or, to separate alternatives
       +                       one or more
       ?                       zero or one
So the program:
       $1 ~ /[Ff]rank/
is true if the first field, $1, contains "Frank" or "frank" anywhere within the field. To match a field
identical to "Frank" or "frank" use:
       $1 ~ /^[Ff]rank$/
Offhand you don’t know if variables are strings or numbers. If neither operand is known to be
numeric, than string comparisons are performed. Otherwise, a numeric comparison is done. In the
absence of any information to the contrary, a string comparison is done, so that:
       $1 > $2
will compare the string values. To ensure a numerical comparison do something similar to:
       ( $1 + 0 ) > $2
68                1998 University Technology Services, The Ohio State University   Introduction to Unix
                                            Text Processing Commands
assigns the first field of the current input record to the ith element of the array.
Flow control statements using if-else, while, and for are allowed with C type syntax:
        for (i=1; i <= NF; i++) {actions}
        while (i<=NF) {actions}
        if (i<NF) {actions}
Common Options
        -f program_file         read the commands from program_file
        -Fc                     use character c as the field separator character
Examples
        % cat filex | tr a-z A-Z | awk -F: '{printf ("7R %-6s %-9s %-24s \n",$1,$2,$3)}'>upload.file
changes all lower case characters to upper case with the tr utility, and formats the file into the
following which is written into the file upload.file:
        7R NFB791 99999999 SMITH
        7R 7AX791 999999999 JONES
        7R 8AB792 99999999 CHEN
        7R 8AA791 999999999 MCNULTY
Introduction to Unix        1998 University Technology Services, The Ohio State University                 69
                                                Other Useful Commands
This section will describe a number of commands that you might find useful in examining and
manipulating the contents of your files.
70                      1998 University Technology Services, The Ohio State University                Introduction to Unix
                                                Working With Files
Syntax
         cmp [options] file1 file2 [skip1] [skip2]
The skip numbers are the number of bytes to skip in each file before starting the comparison.
Common Options
         -l                        report on each difference
         -s                        report exit status only, not byte differences
Examples
This command is useful in determining which version of a file should be kept when there is more than
one version.
Introduction to Unix          1998 University Technology Services, The Ohio State University    71
                                                Other Useful Commands
Syntax
         diff [options] file1 file2
Common Options
         -b                           ignore trailing blanks
         -i                           ignore the case of letters
         -w                           ignore <space> and <tab> characters
         -e                           produce an output formatted for use with the editor, ed
         -r                           apply diff recursively through common sub-directories
Examples
For the mon.logins and tues.logins files above, the difference between them is given by:
         % diff mon.logins tues.logins
              2d1
              < bsmith
              4a4
              > jdoe
              7c7
              < mschmidt
              ---
              > proy
Note that the output lists the differences as well as in which file the difference exists. Lines in the
first file are preceded by "< ", and those in the second file are preceded by "> ".
72                   1998 University Technology Services, The Ohio State University            Introduction to Unix
                                                   Working With Files
Syntax
         cut [options] file
Common Options
         -c character_list           character positions to select (first character is 1)
         -d delimiter                field delimiter (defaults to <TAB>)
         -f field_list               fields to select (first field is 1)
Both the character and field lists may contain comma-separated or blank-character-separated
numbers (in increasing order), and may contain a hyphen (-) to indicate a range. Any numbers
missing at either before (e.g. -5) or after (e.g. 5-) the hyphen indicates the full range starting with the
first, or ending with the last character or field, respectively. Blank-character-separated lists must be
enclosed in quotes. The field delimiter should be enclosed in quotes if it has special meaning to the
shell, e.g. when specifying a <space> or <TAB> character.
Examples
If you only wanted the username and the user's real name, the cut command could be used to get only
that information:
         % cut -f 1,2 users
             jdoe            John Doe
             lsmith          Laura Smith
             pchen           Paul Chen
             jhsu            Jake Hsu
             sphilip         Sue Phillip
Introduction to Unix            1998 University Technology Services, The Ohio State University         73
                                             Other Useful Commands
The cut command can also be used with other options. The -c option allows characters to be the
selected cut. To select the first 4 characters:
         % cut -c 1-4 users
This yields:
              jdoe
              lsmi
              pche
              jhsu
              sphi
Syntax
         paste [options] file1 file2
Common Options
         -d list                   list of delimiting characters
         -s                        concatenate lines
The list of delimiters may include a single character such as a comma; a quoted string, such as a
space; or any of the following escape sequences:
         \n                        <newline> character
         \t                        <tab> character
         \\                        backslash character
         \0                        empty string (non-null character)
A hyphen (-) in place of a file name is used to indicate that field should come from standard input.
74                    1998 University Technology Services, The Ohio State University   Introduction to Unix
                                              Working With Files
Examples
the paste command can be used in conjunction with the cut command to create a new file, listing, that
includes the username, real name, last login, and phone number of all the users. First, extract the
phone numbers into a temporary file, temp.file:
       % cut -f2 phone > temp.file
          555-6634
          555-3382
          555-0987
          555-1235
          555-7623
The result can then be pasted to the end of each line in users and directed to the new file, listing:
       % paste users temp.file > listing
          jdoe                  John Doe                4/15/96           237-6634
          lsmith                Laura Smith             3/12/96           878-3382
          pchen                 Paul Chen               1/5/96            888-0987
          jhsu                  Jake Hsu                4/17/96           545-1235
          sphilip               Sue Phillip             4/2/96            656-7623
This could also have been done on one line without the temporary file as:
       % cut -f2 phone | paste users - > listing
with the same results. In this case the hyphen (-) is acting as a placeholder for an input field (namely,
the output of the cut command).
Introduction to Unix        1998 University Technology Services, The Ohio State University             75
                                            Other Useful Commands
The touch command can be used to create a new (empty) file or to update the last access date/time on
an existing file. The command is used primarily when a script requires the pre-existence of a file (for
example, to which to append information) or when the script is checking for last date or time a
function was performed.
Syntax
         touch [options] [date_time] file
         touch [options] [-t time] file
Common Options
         -a                       change the access time of the file (SVR4 only)
         -c                       don’t create the file if it doesn’t already exist
         -f                       force the touch, regardless of read/write permissions
         -m                       change the modification time of the file (SVR4 only)
         -t time                  use the time specified, not the current time (SVR4 only)
where:
         CC                       first two digits of the year
         YY                       second two digits of the year
         MM                       month, 01-12
         DD                       day of month, 01-31
         hh                       hour of day, 00-23
         mm                       minute, 00-59
         SS                       second, 00-61
The date cannot be set to be before 1969 or after January 18, 2038.
Examples
To create a file:
         % touch filename
76                  1998 University Technology Services, The Ohio State University          Introduction to Unix
                                                  Working With Files
wc stands for "word count"; the command can be used to count the number of lines, characters, or
words in a file.
Syntax
         wc [options] file
Common Options
         -c                         count bytes
         -m                         count characters (SVR4)
         -l                         count lines
         -w                         count words
Examples
The first number indicates the number of lines in the file, the second number indicates the number of
words in the file, and the third number indicates the number of characters.
Using the wc command with one of the options (-l, lines; -w, words; or -c, characters) would result in
only one of the above. For example, "wc -l users" yields the following result:
5 users
Introduction to Unix          1998 University Technology Services, The Ohio State University      77
                                            Other Useful Commands
Syntax
         ln [options] source [target]
If not specified target defaults to a file of the same name in the present working directory.
Common Options
         -f                       force a link regardless of target permissions; don’t report errors (SVR4 only)
         -s                       make a symbolic link
Examples
A symbolic link is used to create a new path to another file or directory. If a group of users, for
example, is accustomed to using a command called chkmag, but the command has been rewritten and
is now called chkit, creating a symbolic link so the users will automatically execute chkit when they
enter the command chkmag will ease transition to the new command.
Note that while the permissions for chkmag are open to all, since it is linked to chkit, the permissions,
group and owner characteristics for chkit will be enforced when chkmag is run.
With a symbolic link, the link can exist without the file or directory it is linked to existing first.
A hard link can only be done to another file on the same file system, but not to a directory (except by
the superuser). A hard link creates a new directory entry pointing to the same inode as the original
file. The file linked to must exist before the hard link can be created. The file will not be deleted until
all the hard links to it are removed. To link the two files above with a hard link to each other do:
         % ln chkit chkmag
Then a long listing shows that the inode number (742) is the same for each:
         % ls -il chkit chkmag
              742 -rwxr-x---            2 lindadb     acs         15927 Apr 23 04:10 chkit
              742 -rwxr-x---            2 lindadb     acs         15927 Apr 23 04:10 chkmag
78                 1998 University Technology Services, The Ohio State University          Introduction to Unix
                                                    Working With Files
Syntax
         sort [options] [+pos1 [ -pos2 ]] file
Common Options
         -b                        ignore leading blanks (<space> & <tab>) when determining starting and
                                   ending characters for the sort key
         -d                        dictionary order, only letters, digits, <space> and <tab> are significant
         -f                        fold upper case to lower case
         -k keydef                 sort on the defined keys (not available on all systems)
         -i                        ignore non-printable characters
         -n                        numeric sort
         -o outfile                output file
         -r                        reverse the sort
         -t char                   use char as the field separator character
         -u                        unique; omit multiple copies of the same line (after the sort)
         +pos1 [-pos2]             (old style) provides functionality similar to the "-k keydef" option.
For the +/-position entries pos1 is the starting word number, beginning with 0 and pos2 is the ending
word number. When -pos2 is omitted the sort field continues through the end of the line. Both pos1
and pos2 can be written in the form w.c, where w is the word number and c is the character within the
word. For c 0 specifies the delimiter preceding the first character, and 1 is the first character of the
word. These entries can be followed by type modifiers, e.g. n for numeric, b to skip blanks, etc.
where:
         start_field, end_field define the keys to restrict the sort to a portion of the line
         type                   modifies the sort, valid modifiers are given the single characters (bdfiMnr)
                                from the similar sort options, e.g. a type b is equivalent to "-b", but applies
                                only to the specified field
Introduction to Unix          1998 University Technology Services, The Ohio State University                     79
                                            Other Useful Commands
Examples
If, however, a listing sorted by last name is desired, use the option to specify which field to sort on
(fields are numbered starting at 0):
        % sort +2 users:
            pchen                Paul Chen                      1/5/96
            jdoe                 John Doe                       4/15/96
            jhsu                 Jake Hsu                       4/17/96
            sphilip              Sue Phillip                    4/2/96
            lsmith               Laura Smith                    3/12/96
80                  1998 University Technology Services, The Ohio State University   Introduction to Unix
                                           Working With Files
A particularly useful sort option is the -u option, which eliminates any duplicate entries in a file while
ordering the file. For example, the file todays.logins:
       sphillip
       jchen
       jdoe
       lkeres
       jmarsch
       ageorge
       lkeres
       proy
       jchen
shows a listing of each username that logged into the system today. If we want to know how many
unique users logged into the system today, using sort with the -u option will list each user only once.
(The command can then be piped into "wc -l" to get a number):
       % sort -u todays.logins
           ageorge
           jchen
           jdoe
           jmarsch
           lkeres
           proy
           sphillip
Introduction to Unix       1998 University Technology Services, The Ohio State University             81
                                             Other Useful Commands
Syntax
         tee [options] [file[s]]
Common Options
         -a                        append the output to the files
         -i                        ignore interrupts
Examples
In this first example the output of who is displayed on the screen and stored in the file users.file:
         brigadier: condron [55]> who | tee users.file
              condron     ttyp0         Apr 22 14:10           (lcondron-pc.acs.)
              frank       ttyp1         Apr 22 16:19           (nyssa)
              condron     ttyp9         Apr 22 15:52           (lcondron-mac.acs)
In this next example the output of who is sent to the files users.a and users.b. It is also piped to the
wc command, which reports the line count.
         brigadier: condron [57]> who | tee users.a users.b | wc -l
                   3
82                1998 University Technology Services, The Ohio State University     Introduction to Unix
                                          Working With Files
In the following example a long directory listing is sent to the file files.long. It is also piped to the
grep command which reports which files were last modified in August.
       brigadier: condron [60]> ls -l | tee files.long |grep Aug
                1 drwxr-sr-x       2 condron              512 Aug      8   1995 News/
                2 -rw-r--r--       1 condron             1076 Aug      8   1995 magnus.cshrc
                2 -rw-r--r--       1 condron             1252 Aug      8   1995 magnus.login
       brigadier: condron [63]> cat files.long
           total 34
                2 -rw-r--r--       1 condron             1253 Oct 10       1995 #.login#
                1 drwx------       2 condron              512 Oct 17       1995 Mail/
                1 drwxr-sr-x       2 condron              512 Aug      8   1995 News/
                5 -rw-r--r--       1 condron             4299 Apr 21 00:18 editors.txt
                2 -rw-r--r--       1 condron             1076 Aug      8   1995 magnus.cshrc
                2 -rw-r--r--       1 condron             1252 Aug      8   1995 magnus.login
                7 -rw-r--r--       1 condron             6436 Apr 21 23:50 resources.txt
                4 -rw-r--r--       1 condron             3094 Apr 18 18:24 telnet.ftp
                1 drwxr-sr-x       2 condron              512 Apr 21 23:56 uc/
                1 -rw-r--r--       1 condron             1002 Apr 22 00:14 uniq.tee.txt
                1 -rw-r--r--       1 condron             1001 Apr 20 15:05 uniq.tee.txt~
                7 -rw-r--r--       1 condron             6194 Apr 15 20:18 unixgrep.txt
Introduction to Unix       1998 University Technology Services, The Ohio State University            83
                                              Other Useful Commands
Syntax
         uniq [options] [+|-n] file [file.new]
Common Options
         -d                         one copy of only the repeated lines
         -u                         select only the lines not repeated
         +n                         ignore the first n characters
         -s n                       same as above (SVR4 only)
         -n                         skip the first n fields, including any blanks (<space> & <tab>)
         -f fields                  same as above (SVR4 only)
Examples
Consider the following file and example, in which uniq removes the 4th line from file and places the
result in a file called file.new.
         {unix prompt 1} cat file
                1236
                4536
                7890
                7890
         {unix prompt 2} uniq file file.new
         {unix prompt 3} cat file.new
                1236
                4536
                7890
Below, the -n option of the uniq command is used to skip the first 2 fields in file, and filter out lines
which are duplicates from the 3rd field onward.
         {unix prompt 4} uniq -2 file
                1236
                7890
84                    1998 University Technology Services, The Ohio State University       Introduction to Unix
                                                    Working With Files
Syntax
         strings [options] file
Common Options
         -n number                     use number as the minimum string length, rather than 4 (SVR4 only)
         -number                       same as above
         -t format                     precede the string with the byte offset from the start of the file, where format
                                       is one of: d = decimal, o = octal, x = hexadecimal (SVR4 only)
         -o                            precede the string with the byte offset in decimal (BSD only)
Examples
         % strings /bin/cut
              SUNW_OST_OSCMD
              no delimiter specified
              invalid delimiter
              b:c:d:f:ns
              cut: -n may only be used with -b
              cut: -d may only be used with -f
              cut: -s may only be used with -f
              no list specified
              cut: cannot open %s
              invalid range specifier
              too many ranges specified
              ranges must be increasing
              invalid character in range
              Internal error processing input
              invalid multibyte character
              unable to allocate enough memory
              unable to allocate enough memory
              cut:
              usage: cut -b list [-n] [filename ...]
                     cut -c list [filename ...]
                     cut -f list [-d delim] [-s] [filename]
Introduction to Unix              1998 University Technology Services, The Ohio State University                    85
                                               Other Useful Commands
Syntax
         file [options] [-m magic_file] [-f file_list] file
Common Options
         -c                       check the magic file for errors in format
         -f file_list             file_list contains a list of files to examine
         -h                       don’t follow symbolic links (SVR4 only)
         -L                       follow symbolic links (BSD only)
         -m magic_file            use magic_file as the magic file instead of /etc/magic
Examples
Below we list the output from the command "file filename" for some representative files.
         /etc/magic:              ascii text
         /usr/local/bin/gzip:     Sun demand paged SPARC executable dynamically linked
         /usr/bin/cut:            ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped
         source.tar:              USTAR tar archive
         source.tar.Z:            compressed data block compressed 16 bits
Syntax
         tr [options] string1 [string2]
With no options the characters in string1 are translated into the characters in string2, character by
character in the string arrays. The first character in string1 is translated into the first character in
string2, etc.
A range of characters in a string is specified with a hyphen between the upper and lower characters of
the range, e.g. to specify all lower case alphabetic characters use ’[a-z]’.
Repeated characters in string2 can be represented with the ’[x*n]’ notation, where character x is
repeated n times. If n is 0 or absent it is assumed to be as large as needed to match string1.
86                  1998 University Technology Services, The Ohio State University        Introduction to Unix
                                             Working With Files
Characters can include \octal (BSD and SVR4) and \character (SVR4 only) notation. Here "octal"
is replaced by the one, two, or three octal integer sequence encoding the ASCII character and
"character" can be one of:
       b                         back space
       f                         form feed
       n                         new line
       r                         carriage return
       t                         tab
       v                         vertical tab
The SVR4 version of tr allows the operand ":class:" in the string field where class can take on
character classification values, including:
       alpha                     alphabetic characters
       lower                     lower case alphabetic characters
       upper                     upper case alphabetic characters
Common Options
       -c                        complement the character set in string1
       -d                        delete the characters in string1
       -s                        squeeze a string of repeated characters in string1 to a single character
Examples
The following examples will use as input the file, a list of P. G. Wodehouse Jeeves & Wooster books.
       The Inimitable Jeeves [1923]                            The Mating Season [1949]
       Carry On, Jeeves [1925]                                 Ring for Jeeves [1953]
       Very Good, Jeeves [1930]                                Jeeves and the Feudal Spirit [1954]
       Thank You, Jeeves [1934]                                Jeeves in the Offing [1960]
       Right Ho, Jeeves [1934]                                 Stiff Upper Lip, Jeeves [1963]
       The Code of the Woosters [1938]                         Much Obliged, Jeeves [1971]
       Joy in the Morning [1946]                               Aunts Aren't Gentlemen [1974]
To translate all lower case alphabetic characters to upper case we could use either of:
       tr ’[a-z]’ ’[A-Z]’            or               tr ’[:lower:]’ ’[:upper:]’
Introduction to Unix         1998 University Technology Services, The Ohio State University                87
                                          Other Useful Commands
Since tr reads from stdin we first cat the file and pipe the output to tr, as in:
        % cat wodehouse | tr ’[a-z]’ ’[A-Z]’
            THE INIMITABLE JEEVES [1923]                    THE MATING SEASON [1949]
            CARRY ON, JEEVES [1925]                         RING FOR JEEVES [1953]
            VERY GOOD, JEEVES [1930]                        JEEVES AND THE FEUDAL SPIRIT [1954]
            THANK YOU, JEEVES [1934]                        JEEVES IN THE OFFING [1960]
            RIGHT HO, JEEVES [1934]                         STIFF UPPER LIP, JEEVES [1963]
            THE CODE OF THE WOOSTERS [1938]                 MUCH OBLIGED, JEEVES [1971]
            JOY IN THE MORNING [1946]                       AUNTS AREN'T GENTLEMEN [1974]
88                1998 University Technology Services, The Ohio State University          Introduction to Unix
                                                 Working With Files
Syntax
         find directory [search options] [actions]
Common Options
Introduction to Unix          1998 University Technology Services, The Ohio State University                    89
                                           Other Useful Commands
Complex expressions are allowed. Expressions should be grouped within parenthesis (escaping the
parenthesis with a backslash to prevent the shell from interpreting them). The exclamation symbol (!)
can be used to negate an expression. The operators: -a (and) and -o (or) are used to group
expressions.
Examples
find will recursively search through sub-directories, but for the purpose of these examples we will
just use the following files:
           14 -rw-r--r--            1 frank         staff             6682 Feb        5 10:04 library
            6 -r--r-----            1 frank         staff             3034 Mar 16           1995 netfile
           34 -rw-r--r--            1 frank         staff            17351 Feb        5 10:04 standard
            2 -rwxr-xr-x            1 frank         staff               386 Apr 26 09:51 tr25*
To find all files with general read or execute permission set, and then to change the permissions on
those files to disallow this:
        % find . \( -perm -004 -o -perm -001 \) -exec chmod o-rx {} \; -exec ls -al {} \;
            -rw-r-----          1 frank           staff            6682 Feb       5 10:04 ./library
            -rwxr-x---          1 frank           staff             386 Apr 26 09:51 ./tr25
            -rw-r-----          1 frank           staff          17351 Feb        5 10:04 ./standard
In this example the parentheses and semicolons are escaped with a backslash to prevent the shell from
interpreting them. The curly brackets are automatically replaced by the results from the previous
search and the semicolon ends the command.
We could search for any file name containing the string "ar" with:
        % find . -name \*ar\* -ls
            326584        7 -rw-r-----         1 frank staff          6682 Feb       5 10:04 ./library
            326585      17 -rw-r-----          1 frank staff 17351 Feb               5 10:04 ./standard
where the -ls option prints out a long listing, including the inode numbers.
90                1998 University Technology Services, The Ohio State University           Introduction to Unix
                                    File Archiving, Compression and Conversion
Syntax
         compress [options] [file]
         uncompress [options] [file.Z]
         zcat [file.Z]
Common Options
         -c                         write to standard output and don’t create or change any files
         -f                         force compression of a file, even if it doesn’t reduce the size of the file or if
                                    the target file (file.Z) already exists.
         -v                         verbose. Report on the percentage reduction for the file.
Introduction to Unix            1998 University Technology Services, The Ohio State University                           91
                                           Other Useful Commands
Examples
A display of the file using commands other than zcat yields an unreadable, binary, output.
The uncompress command is used to return the file to its original format:
        % uncompress logins.*.Z ; ls -als logins.*
            96 -rw-r--r--            1 lindadb        acs    45452   Apr   24   09:13   logins.beauty
           184 -rw-r--r--            1 lindadb        acs    90957   Apr   24   09:13   logins.bottom
           152 -rw-r--r--            1 lindadb        acs    75218   Apr   24   09:13   logins.photon
           168 -rw-r--r--            1 lindadb        acs    85970   Apr   24   09:13   logins.top
92                  1998 University Technology Services, The Ohio State University     Introduction to Unix
                                    File Archiving, Compression and Conversion
In addition to the standard Unix compress, uncompress, zcat utilities there are a set of GNU ones
freely available. These do an even better job of compression using a more efficient algorithm. The
GNU programs to provide similar functions to those above are often installed as gzip, gunzip, and
zcat, respectively. Files compressed with gzip are given the endings .z or .gz. GNU software can be
obtained via anonymous ftp from ftp://ftp.gnu.org/pub/gnu.
Syntax
         tar [options] [directory file]
Common Options
         c                          create an archive (begin writting at the start of the file)
         t                          table of contents list
         x                          extract from an archive
         v                          verbose
         f                          archive file name
         b                          archive block size
tar will accept its options either with or without a preceding hyphen (-). The archive file can be a disk
file, a tape device, or standard input/output. The latter are represented by a hyphen.
Examples
Many anonymous FTP archive sites on the Internet store their packages in compressed tar format, so
the files will end in .tar.Z or .tar.gz. To extract the files from these files you would first uncompress
them, or use the appropriate zcat command and pipe the output into tar, e.g.:
         % zcat archive.tar.Z | tar -xvf -
where the hyphen at the end of the tar command indicates that the file is taken from stdin.
Introduction to Unix           1998 University Technology Services, The Ohio State University        93
                                                                   Other Useful Commands
Syntax
         uuencode [ source_file ] pathname_to_uudecode_to [ > new_file ]
         uudecode [ -p ] encoded_file
Common Options
         -p                                   send output to standard output, rather than to the default file
Examples
The first line of encoded file includes the permission modes and name that uudecode will use when
decoding the file. The file begins and ends with the begin and end keywords, respectively, e.g.:
         begin 555 binary_filename
         M?T5,1@$" 0                        " (    ! %"W                #0 5"<             T"
         M!0 H !4 %           8        T $-            "@           H        4         P
         M -0                !$         !          !           !             %"
         M%P !0A<            % $            $ 4(8 -"&                    W& W%                  < 0
         M      @ !0B T(@                    )@             !P          O=7-R+VQI8B]L9"YS
         M;RXQ               ?< 'Y          VP             "O !VP )8 &6 !G0
         M      %[      U0             %G !3           ;< #Q                          %Q !
         MEP :P !_                                         '@ !PP (P
         M     N0 =H               _0             $D       Y        <    #F            /L
         M01     $'                $          &        !       P #0A@ 4(8
         M"              !        0 !E        !@       , T(@ %"(                  )@       $
         M        0      (    ;@        $     ' -"N !0K@ /H
         M $     #      ',    !        P #1J 4:@ #8                               !
         M      !Y      0     , TH %*              !=X                       0
         M@      @       # -/X !3^ "E,                               $            (4   !
         M             4_>        )0               0           ".        P
         ;     %0 P )@                       $
end
94                     1998 University Technology Services, The Ohio State University                   Introduction to Unix
                                  File Archiving, Compression and Conversion
Syntax
         dd [if=input_device] [of=output_device] [operand=value]
Common Options
         if=input_device           the input file or device
         of=output_device          the output file or device
If the input or output devices are not specified they default to standard input and standard output,
respectively.
Block sizes are specified in bytes and may end in k, b, or w to indicate 1024 (kilo), 512 (block), or 2
(word), respectively.
Introduction to Unix           1998 University Technology Services, The Ohio State University                95
                                            Other Useful Commands
Examples
To copy files written on a tape drive on a big endian machine, written with a block size of 20 blocks,
to a file on a little endian machine that now has the tape inserted in its drive, we would need to swap
pairs of bytes, as in:
         % dd if=/dev/rmt/0 of=new_file ibs=20b conv=swab
              1072+0 records in
              21440+0 records out
Upon completion dd reports the number of whole blocks and partial blocks for both the input and
output files.
Syntax
         od [options] file
Common Options
         -b                       octal dump
         -d|-D                    decimal (-d) or long decimal (-D) dump
         -s|-S                    signed decimal (-s) and signed long decimal (-S) dump
         -f|-F                    floating point (-f) or long (double) floating point (-F) dump
         -x|-X                    hex (-x) or long hex (-X) dump
         -c|-C                    character (single byte) or long character dump (single or multi-byte
                                  characters, as determined by locale settings) dump
         -v                       verbose mode
96                 1998 University Technology Services, The Ohio State University          Introduction to Unix
                             File Archiving, Compression and Conversion
Examples
To look at the actual contents of the following file, a list of P. G. Wodehouse’s Lord Emsworth
novels.
       Something Fresh [1915]                   Uncle Dynamite [1948]
       Leave it to Psmith [1923]                Pigs Have Wings [1952]
       Summer Lightning [1929]                  Cocktail Time [1958]
       Heavy Weather [1933]                     Service with a Smile [1961]
       Blandings Castle and Elsewhere [1935]    Galahad at Blandings [1965]
       Uncle Fred in the Springtime [1939]      A Pelican at Blandings [1969]
       Full Moon [1947]                         Sunset at Blandings [1977]
we could do:
       % od -c wodehouse
          0000000 S o m e t h i n g             F r e s h
          0000020 [ 1 9 1 5 ] \t U n c l e              D y n
          0000040 a m i t e        [ 1 9 4 8 ] \n L e a
          0000060 v e     i t     t o     P s m i t h
          0000100 [ 1 9 2 3 ] \t P i g s            H a v e
          0000120     W i n g s        [ 1 9 5 2 ] \n S u
          0000140 m m e r        L i g h t n i n g           [
          0000160 1 9 2 9 ] \t C o c k t a i l              T
          0000200 i m e       [ 1 9 5 8 ] \n H e a v y
          0000220     W e a t h e r          [ 1 9 3 3 ] \t
          0000240 S e r v i c e          w i t h      a    S
          0000260 m i l e       [ 1 9 6 1 ] \n B l a n
          0000300 d i n g s        C a s t l e        a n d
          0000320     E l s e w h e r e           [ 1 9 3 5
          0000340 ] \t G a l a h a d           a t    B l a
          0000360 n d i n g s         [ 1 9 6 5 ] \n U n
          0000400 c l e     F r e d        i n     t h e
          0000420 S p r i n g t i m e             [ 1 9 3 9
          0000440 ] \t A     P e l i c a n          a t   B
          0000460 l a n d i n g s           [ 1 9 6 9 ] \n
          0000500 F u l l       M o o n         [ 1 9 4 7 ]
          0000520 \t S u n s e t         a t     B l a n d
          0000540 i n g s       [ 1 9 7 7 ] \n
          0000554
Introduction to Unix     1998 University Technology Services, The Ohio State University    97
                                              Other Useful Commands
                           8.3.1 TELNET and FTP - remote login and file transfer protocols
TELNET and FTP are Application Level Internet protocols. The TELNET and FTP protocol
specifications have been implemented by many different sources, including The National Center for
Supercomputer Applications (NCSA), and many other public domain and shareware sources.
The programs implementing the TELNET protocol are usually called telnet, but not always. Some
notable exceptions are tn3270, WinQVT, and QWS3270, which are also TELNET protocol
implementations. TELNET is used for remote login to other computers on the Internet.
The programs implementing the FTP protocol are usually called ftp, but there are exceptions to that
too. A program called Fetch, distributed by Dartmouth College, WS_FTP, written and distributed by
John Junod, and Ftptool, written by a Mike Sullivan, are FTP protocol implementations with graphic
user interfaces. There’s an enhanced FTP version, ncftp, that allows additional features, written by
Mike Gleason. Also, FTP protocol implementations are often included in TELNET implementation
programs, such as the ones distributed by NCSA. FTP is used for transferring files between
computers on the Internet.
rlogin is a remote login service that was at one time exclusive to Berkeley 4.3 BSD UNIX.
Essentially, it offers the same functionality as telnet, except that it passes to the remote computer
information about the user's login environment. Machines can be configured to allow connections
from trusted hosts without prompting for the users’ passwords. A more secure version of this
protocol is the Secure SHell, SSH, software written by Tatu Ylonen and available via
ftp://ftp.net.ohio-state.edu/pub/security/ssh.
From a Unix prompt, these programs are invoked by typing the command (program name) and the
(Internet) name of the remote machine to which to connect. You can also specify various options, as
allowed, for these commands.
98                     1998 University Technology Services, The Ohio State University         Introduction to Unix
                                              Remote Connections
Syntax
         telnet [options] [ remote_host [ port_number ] ]
         tn3270 [options] [ remote_host [ port_number ] ]
         ftp [options] [ remote_host ]
Common Options
         ftp             telnet               Action
         -d                                   set debugging mode on
                         -d                   same as above (SVR4 only)
         -i                                   turn off interactive prompting
         -n                                   don’t attempt auto-login on connection
         -v                                   verbose mode on
                         -l user              connect with username, user, on the remote host (SVR4 only)
                         -8                   8-bit data path (SVR4 only)
telnet and tn3270 allow you the option of specifying a port number to connect to on the remote host.
For both commands it defaults to port number 23, the telnet port. Other ports are used for debugging
of network services and for specialized resources.
Examples
         telnet oscar.us.ohio-state.edu
         tn3270 ohstmvsa.acs.ohio-state.edu
         ftp magnus.acs.ohio-state.edu
The remote machine will query you for your login identification and your password. Machines set up
as archives for software or information distribution often allow anonymous ftp connections. You ftp
to the remote machine and login as anonymous (the login ftp is equivalent on many machines), that
is, when asked for your "login" you would type anonymous.
Once you have successfully connected to a remote computer with telnet and rlogin (and assuming
terminal emulation is appropriate) you will be able to use the machine as you always do.
Once you have successfully connected to a remote computer with ftp, you will be able to transfer a
file "up" to that computer with the put command, or "down" from that computer with the get
command. The syntax is as follows:
         put local-file-name remote-file-name
         get local-file-name remote-file-name
Introduction to Unix           1998 University Technology Services, The Ohio State University              99
                                             Other Useful Commands
Other commands are available in ftp as well, depending on the specific "local" and "remote" FTP
implementations. The help command will display a list of available commands. The help command
will also display the purpose of a specific command. Examples of valid commands are shown below:
         help                     display list of available commands
         help mget                display the purpose of the mget command ("get multiple files")
         pwd                      present working directory
         ls or dir                directory list
         cd                       change directory
         lcd                      local change directory
         open                     specify the machine you wish to connect with
         user                     specify your login id (in cases where you are not prompted)
         quit                     quit out of the FTP program
Syntax
         finger [options] [user[@hostname]]
Common Options
         -l                       force long output format
         -m                       match username only, not first or last names
         -s                       force short output format
Examples
         brigadier: condron [77]> finger workshop@nyssa
             This is a sample .plan file for the nyssa id, workshop.
             This id is being used this week by Frank Fiamingo, Linda
             DeBula, and Linda Condron, while we teach a pilot version
             of the new Unix workshop we developed for UTS.
100                1998 University Technology Services, The Ohio State University       Introduction to Unix
                                              Remote Connections
The rlogin command allows remote login access to another host in the local network. rlogin passes
information about the local environment, including the value of the TERM environment variable, to
the remote host.
The rsh command provides the ability to invoke a Unix shell on a remote host in the local network for
the purpose of executing a shell command there. This capability is similar to the "shell escape"
function commonly available from within such Unix software systems as editors and email.
The rcp command provides the ability to copy files from the local host to a remote host in the local
network.
Syntax
         rlogin [ -l username ] remote_host
         rsh [ -l username ] remote_host [ command ]
         rcp [ [user1]@host1:]original_filename [ [user2]@host2:]new_filename
where the parts in brackets ([]) are optional. rcp does not prompt for passwords, so you must have
permission to execute remote commands on the specified machines as the selected user on each
machine.
Common Options
         -l username             connect as the user, username, on the remote host (rlogin & rsh)
The .rhosts file, if it exists in the user's home directory on the remote host, permits rlogin, rsh, or rcp
access to that remote host without prompting for a password for that account. The .rhosts file
contains an entry for each remote host and username from which the owner of the .rhosts file may
wish to connect. Each entry in the .rhosts file is of the form:
         remote_host remote_user
where listing the remote_user is optional. For instance, if Heather Jones wants to be able to connect
to machine1 (where her username is heather) from machine2 (where her username is jones), or from
machine 3 (where her username is heather, the same as for machine1), she could create a .rhosts file
in her home directory on machine1. The contents of this file could be:
Introduction to Unix        1998 University Technology Services, The Ohio State University            101
                                         Other Useful Commands
         machine2 jones
         machine3
--or--
         machine2 jones
         machine3 heather
On a system-wide basis the file /etc/hosts.equiv serves the same purpose for all users, except the
super-user. Such a file with the contents:
         remote_machine
allows any user from remote_machine to remote connect to this machine without a password, as the
same username on this machine.
allows remote_user, on remote_machine, to remote connect to this machine as any local user, except
the super-user.
The Secure SHell (SSH) versions of the rcp, rsh, and rlogin programs are freely available and
provide much greater security.
102               1998 University Technology Services, The Ohio State University   Introduction to Unix
                                               Shell Scripts
where the "-f" option indicates that it should not read your .cshrc. Any blanks following the magic
symbols, #!, are optional.
You also need to specify that the script is executable by setting the proper bits on the file with chmod,
e.g.:
        % chmod +x shell_script
Within the scripts # indicates a comment from that point until the end of the line, with #! being a
special case if found as the first characters of the file.
where value is any valid string, and can be enclosed within quotations, either single (’value) or
double ("value"), to allow spaces within the string value. When enclosed with backquotes (‘value‘)
the string is first evaluated by the shell and the result is substituted. This is often used to run a
command, substituting the command output for value, e.g.:
Introduction to Unix        1998 University Technology Services, The Ohio State University          103
                                           Shell Programming
       $ day=‘date +%a‘
       $ echo $day
           Wed
After the parameter values has been assigned the current value of the parameter is accessed using the
$param, or ${param}, notation.
                       9.3 Quoting
We quote strings to control the way the shell interprets any parameters or variables within the string.
We can use single (’) and double (") quotes around strings. Double quotes define the string, but
allow variable substitution. Single quotes define the string and prevent variable substitution. A
backslash (\) before a character is said to escape it, meaning that the system should take the character
literally, without assigning any special meaning to it. These quoting techniques can be used to
separate a variable from a fixed string. As an example lets use the variable, var, that has been
assigned the value bat, and the constant string, man. If I wanted to combine these to get the result
"batman" I might try:
       $varman
but this doesn’t work, because the shell will be trying to evaluate a variable called varman, which
doesn’t exist. To get the desired result we need to separate it by quoting, or by isolating the variable
with curly braces ({}), as in:
       "$var"man               - quote the variable
       $var""man               - separate the parameters
       $var"man"               - quote the constant
       $var''man               - separate the parameters
       $var'man'               - quote the constant
       $var\man                - separate the parameters
       ${var}man               - isolate the variable
These all work because ", ’, \, {, and } are not valid characters in a variable name.
When using the curly braces they should surround the variable only, and not include the $, otherwise,
they will be included as part of the resulting string, e.g.:
       % echo {$var}man
          {bat}man
104               1998 University Technology Services, The Ohio State University       Introduction to Unix
                                                           Variables
                             9.4 Variables
There are a number of variables automatically set by the shell when it starts. These allow you to
reference arguments on the command line.
We can illustrate these with some simple scripts. First for the Bourne shell the script will be:
          #!/bin/sh
          echo "$#:" $#
          echo '$#:' $#
          echo '$-:' $-
          echo '$?:' $?
          echo '$$:' $$
          echo '$!:' $!
          echo '$3:' $3
          echo '$0:' $0
          echo '$*:' $*
          echo '$@:' $@
Introduction to Unix             1998 University Technology Services, The Ohio State University                      105
                                             Shell Programming
When executed with some arguments it displays the values for the shell variables, e.g.:
       $ ./variables.sh one two three four five
            5: 5
            $#: 5
            $-:
            $?: 0
            $$: 12417
            $!:
            $3: three
            $0: ./variables.sh
            $*: one two three four five
            $@: one two three four five
As you can see, we needed to use single quotes to prevent the shell from assigning special meaning to
$. The double quotes, as in the first echo statement, allowed substitution to take place.
Similarly, for the C shell variables we illustrate variable substitution with the script:
       #!/bin/csh -f
       echo '$$:' $$
       echo '$3:' $3
       echo '$0:' $0
       echo '$*:' $*
       echo '$argv[2]:' $argv[2]
       echo '${argv[4]}:' ${argv[4]}
       echo '$#argv:' $#argv
106              1998 University Technology Services, The Ohio State University       Introduction to Unix
                                          Parameter Substitution
There are no spaces in the above operators. If a colon (:) is inserted before the -, =, +, or ? then a test
if first performed to see if the parameter has a non-null setting.
The C shell also defines the array, $argv[n] to contain the n arguments on the command line and
$#argv to be the number of arguments, as noted in Table 9.1.
Introduction to Unix       1998 University Technology Services, The Ohio State University                107
                                              Shell Programming
To illustrate some of these features we’ll use the test script below.
        #!/bin/sh
            param0=$0
            test -n "$1" && param1=$1
            test -n "$2" && param2=$2
            test -n "$3" && param3=$3
            echo 0: $param0
            echo "1: ${param1-1}: \c" ;echo $param1
            echo "2: ${param2=2}: \c" ;echo $param2
            echo "3: ${param3+3}: \c" ;echo $param3
In the script we first test to see if the variable exists, if so we set a parameter to its value. Below this
we report the values, allowing substitution.
In the first run through the script we won’t provide any arguments:
        $ ./parameter.sh
            0: ./parameter.sh                     # always finds $0
            1: 1:                                 # substitute 1, but don’t assign this value
            2: 2: 2                               # substitute 2 and assign this value
            3: :                                  # don’t substitute
In the second run through the script we’ll provide the arguments:
        $ ./parameter one two three
            0: ./parameter.sh                     # always finds $0
            1: one: one                           # don’t substitute, it already has a value
            2: two: two                           # don’t substitute, it already has a value
            3: 3: three                           # substitute 3, but don’t assign this value
108                  1998 University Technology Services, The Ohio State University           Introduction to Unix
                                             Here Document
A here document is a form of quoting that allows shell variables to be substituted. It’s a special form
of redirection that starts with <<WORD and ends with WORD as the only contents of a line. In the
Bourne shell you can prevent shell substitution by escaping WORD by putting a \ in front of it on the
redirection line, i.e. <<\WORD, but not on the ending line. To have the same effect the C shell
expects the \ in front of WORD at both locations.
In the top part of the example the shell variables $does and $not are substituted. In the bottom part
they are treated as simple text strings without substitution.
Introduction to Unix        1998 University Technology Services, The Ohio State University        109
                                             Shell Programming
                        9.7.1 Sh
Sh uses the built-in command, read, to read in a line, e.g.:
       read param
When we run this script it prompts for input and then echoes the results:
       $ ./read.sh
           Input a phrase hello frank            # I type in hello frank <return>
           param=hello frank
                        9.7.2 Csh
Csh uses the $< symbol to read a line from stdin, e.g.:
       set param = $<
The spaces around the equal sign are important. The following script illustrates how to use this.
       #!/bin/csh -f
       echo -n "Input a phrase "                 # This built-in echo requires -n to prevent <newline>
       set param = $<
       echo param=$param
110                 1998 University Technology Services, The Ohio State University      Introduction to Unix
                                                Functions
                       9.8 Functions
The Bourne shell has functions. These are somewhat similar to aliases in the C shell, but allow you
more flexibility. A function has the form:
       fcn () { command; }
where the space after {, and the semicolon (;) are both required; the latter can be dispensed with if a
<newline> precedes the }. Additional spaces and <newline>’s are allowed. We saw a few examples
of this in the sample .profile in an earlier chapter, where we had functions for ls and ll:
       ls() { /bin/ls -sbF "$@";}
       ll() { ls -al "$@";}
The first one redefines ls so that the options -sbF are always supplied to the standard /bin/ls
command, and acts on the supplied input, "$@". The second one takes the current value for ls (the
previous function) and tacks on the -al options.
Functions are very useful in shell scripts. The following is a simplified version of one I use to
automatically backup up system partitions to tape.
       #!/bin/sh
       #        Cron script to do a complete backup of the system
       HOST=`/bin/uname -n`
       admin=frank
       Mt=/bin/mt
       Dump=/usr/sbin/ufsdump
       Mail=/bin/mailx
       device=/dev/rmt/0n
       Rewind="$Mt -f $device rewind"
       Offline="$Mt -f $device rewoffl"
       # Failure - exit
       failure () {
                $Mail -s "Backup Failure - $HOST" $admin << EOF_failure
       $HOST
       Cron backup script failed. Apparently there was no tape in the device.
       EOF_failure
             exit 1
             }
Introduction to Unix       1998 University Technology Services, The Ohio State University         111
                                             Shell Programming
This script illustrates a number of topics that we’ve looked at in this document. It starts by setting
various parameter values. HOST is set from the output of a command, admin is the administrator of
the system, Mt, Dump, and Mail are program names, device is the special device file used to access
the tape drive, Rewind and Offline contain the commands to rewind and off-load the tape drive,
respectively, using the previously referenced Mt and the necessary options. There are three functions
defined: failure, dumpfail, and success. The functions in this script all use a here document to form
the contents of the function. We also introduce the logical OR (||) and AND (&&) operators here;
each is position between a pair of commands. For the OR operator, the second command will be run
only if the first command does not complete successfully. For the AND operator, the second
command will be run only if the first command does complete successfully.
The main purpose of the script is done with the Dump commands, i.e. backup the specified file
systems. First an attempt is made to rewind the tape. Should this fail, || failure, the failure function
is run and we exit the program. If it succeeds we proceed with the backup of each partition in turn,
each time checking for successful completion (|| dumpfail). Should it not complete successfully we
run the dumpfail subroutine and then exit. If the last backup succeeds we proceed with the success
function ((...) && success). Lastly, we rewind the tape and take it offline so that no other user can
accidently write over our backup tape.
112                1998 University Technology Services, The Ohio State University   Introduction to Unix
                                            Control Commands
                       9.9.1 Conditional if
The conditional if statement is available in both shells, but has a different syntax in each.
                       9.9.1.1 Sh
       if condition1
       then
                command list if condition1 is true
       [elif condition2
                then command list if condition2 is true]
       [else
                command list if condition1 is false]
        fi
The conditions to be tested for are usually done with the test, or [] command (see Section 8.9.6). The
if and then must be separated, either with a <newline> or a semicolon (;).
       #!/bin/sh
       if [ $# -ge 2 ]
       then
                echo $2
       elif [ $# -eq 1 ]; then
                echo $1
       else
                echo No input
       fi
There are required spaces in the format of the conditional test, one after [ and one before ]. This script
should respond differently depending upon whether there are zero, one or more arguments on the
command line. First with no arguments:
       $ ./if.sh
            No input
Introduction to Unix        1998 University Technology Services, The Ohio State University           113
                                                 Shell Programming
                           9.9.1.2 Csh
       if (condition) command
                    -or-
       if (condition1) then
                    command list if condition1 is true
       [else if (condition2) then
                    command list if condition2 is true]
       [else
                    command list if condition1 is false]
       endif
Again, this script should respond differently depending upon whether I have zero, one or more
arguments on the command line. First with no arguments:
       % ./if.csh
              No input
114                  1998 University Technology Services, The Ohio State University   Introduction to Unix
                                              Control Commands
                       9.9.2.1 Sh
       case parameter in
               pattern1[|pattern1a]) command list1;;
               pattern2) command list2
                         command list2a;;
               pattern3) command list3;;
               *) ;;
       esac
You can use any valid filename meta-characters within the patterns to be matched. The ;; ends each
choice and can be on the same line, or following a <newline>, as the last command for the choice.
Additional alternative patterns to be selected for a particular case are separated by the vertical bar, |,
as in the first pattern line in the example above. The wildcard symbols,: ? to indicate any one
character and * to match any number of characters, can be used either alone or adjacent to fixed
strings.
This simple example illustrates how to use the conditional case statement.
       #!/bin/sh
       case $1 in
               aa|ab) echo A
                         ;;
               b?)       echo "B \c"
                         echo $1;;
               c*)       echo C;;
               *)        echo D;;
       esac
So when running the script with the arguments on the left, it will respond as on the right:
       aa                          A
       ab                          A
       ac                          D
       bb                          B bb
       bbb                         D
       c                           C
       cc                          C
       fff                         D
Introduction to Unix           1998 University Technology Services, The Ohio State University        115
                                            Shell Programming
                       9.9.2.2 Csh
       switch (parameter)
       case pattern1:
               command list1
               [breaksw]
       case pattern2:
               command list2
               [breaksw]
       default:
               command list for default behavior
               [breaksw]
       endsw
breaksw is optional and can be used to break out of the switch after a match to the string value of the
parameter is made. Switch doesn’t accept "|" in the pattern list, but it will allow you to string several
case statements together to provide a similar result. The following C shell script has the same
behavior as the Bourne shell case example above.
       #!/bin/csh -f
       switch ($1)
               case aa:
               case ab:
                          echo A
                          breaksw
               case       b?:
                          echo -n "B "
                          echo $1
                          breaksw
               case       c*:
                          echo C
                          breaksw
               default:
                          echo D
       endsw
116                1998 University Technology Services, The Ohio State University   Introduction to Unix
                                              Control Commands
                       9.9.3.1 Sh
       for variable [in list_of_values]
       do
                command list
       done
The list_of_values is optional, with $@ assumed if nothing is specified. Each value in this list is
sequentially substituted for variable until the list is emptied. Wildcards can be used and are applied
to file names in the current directory. Below we illustrate the for loop in copying all files ending in
.old to similar names ending in .new. In these examples the basename utility extracts the base part of
the name so that we can exchange the endings.
       #!/bin/sh
       for file in *.old
       do
                newf=`basename $file .old`
                cp $file $newf.new
       done
                       9.9.3.2 Csh
       foreach variable (list_of_values)
                command list
       end
The equivalent C shell script to copy all files ending in .old to .new is:
       #!/bin/csh -f
       foreach file (*.old)
                set newf = `basename $file .old`
                cp $file $newf.new
       end
Introduction to Unix           1998 University Technology Services, The Ohio State University     117
                                             Shell Programming
                        9.9.4 while
The while commands let you loop as long as the condition is true.
                       9.9.4.1 Sh
       while condition
       do
               command list
               [break]
               [continue]
       done
This script takes the list of arguments, echoes the first one, then shifts the list to the left, losing the
original first entry. It loops through until it has shifted all the arguments off the argument list.
       $ ./while.sh one two three
       one
       two
       three
118                 1998 University Technology Services, The Ohio State University    Introduction to Unix
                                            Control Commands
                       9.9.4.2 Csh
       while (condition)
                command list
                [break]
                [continue]
       end
If you want the condition to always be true specify 1 within the conditional test.
                       9.9.5 until
This looping feature is only allowed in the Bourne shell.
       until condition
       do
                command list while condition is false
       done
The condition is tested at the start of each loop and the loop is terminated when the condition is true.
A script equivalent to the while examples above is:
       #!/bin/sh
       until [ $# -le 0 ]
       do
                echo $1
                shift
       done
Notice, though, that here we’re testing for less than or equal, rather than greater than or equal,
because the until loop is looking for a false condition.
Both the until and while loops are only executed if the condition is satisfied. The condition is
evaluated before the commands are executed.
Introduction to Unix         1998 University Technology Services, The Ohio State University        119
                                              Shell Programming
                       9.9.6 test
Conditional statements are evaluated for true or false values. This is done with the test, or its
equivalent, the [] operators. It the condition evaluates to true, a zero (TRUE) exit status is set,
otherwise a non-zero (FALSE) exit status is set. If there are no arguments a non-zero exit status is
set. The operators used by the Bourne shell conditional statements are given below.
For filenames the options to test are given with the syntax:
       -option filename
The options available for the test operator for files include:
       -r                       true if it exists and is readable
       -w                       true if it exists and is writable
       -x                       true if it exists and is executable
       -f                       true if it exists and is a regular file (or for csh, exists and is not a directory)
       -d                       true if it exists and is a directory
       -h or -L                 true if it exists and is a symbolic link
       -c                       true if it exists and is a character special file (i.e. the special device is accessed
                                one character at a time)
       -b                       true if it exists and is a block special file (i.e. the device is accessed in blocks
                                of data)
       -p                       true if it exists and is a named pipe (fifo)
       -u                       true if it exists and is setuid (i.e. has the set-user-id bit set, s or S in the third
                                bit)
       -g                       true if it exists and is setgid (i.e. has the set-group-id bit set, s or S in the sixth
                                bit)
       -k                       true if it exists and the sticky bit is set (a t in bit 9)
       -s                       true if it exists and is greater than zero in size
120                1998 University Technology Services, The Ohio State University              Introduction to Unix
                                            Control Commands
Introduction to Unix     1998 University Technology Services, The Ohio State University             121
                                              Shell Programming
The C shell also allows file type and permission inquiries with the operators:
       -r                      return true (1) if it exists and is readable, otherwise return false (0)
       -w                      true if it exists and is writable
       -x                      true if it exists and is executable
       -f                      true if it exists and is a regular file (or for csh, exists and is not a directory)
       -d                      true if it exists and is a directory
       -e                      true if the file exists
       -o                      true if the user owns the file
       -z                      true if the file has zero length (empty)
122               1998 University Technology Services, The Ohio State University             Introduction to Unix
C H A P T E R 10             Editors
There are numerous text processing utilities available with Unix, as is noted throughout this
document (e.g., ed, ex, sed, awk, the grep family, and the roff family). Among the editors, the
standard "visual" (or fullscreen) editor on Unix is vi. It comprises a super-set, so to speak, of ed and
ex (the Unix line editors) capabilities.
Vi is a modal editor. This means that it has specific modes that allow text insertion, text deletion, and
command entering. You leave the insert mode by typing the <escape> key. This brings you back to
command mode. The line editor, ex, is incorporated within vi. You can switch back and forth
between full-screen and line mode as desired. In vi mode type Q to go to ex mode. In ex mode at the
: prompt type vi to return to vi mode. There is also a read-only mode of vi, which you can invoke as
view.
Another editor that is common on Unix systems, especially in college and university environments, is
emacs (which stands for "editing macros"). While vi usually comes with the Unix operating system,
emacs usually does not. It is distributed by The Free Software Foundation. It is arguably the most
powerful editor available for Unix. It is also a very large software system, and is a heavy user of
computer system resources.
The Free Software Foundation and the GNU Project (of which emacs is a part) were founded by
Richard Stallman and his associates, who believe (as stated in the GNU Manifesto) that sharing
software is the "fundamental act of friendship among programmers." Their General Public License
guarantees your rights to use, modify, and distribute emacs (including its source code), and was
specifically designed to prevent anyone from hoarding or turning a financial profit from emacs or any
software obtained through the Free Software Foundation. Most of their software, including emacs, is
available at ftp://ftp.gnu.org/pub/gnu/ and http://www.gnu.org/.
Both vi and emacs allow you to create start-up files that you can populate with macros to control
settings and functions in the editors.
Introduction to Unix       1998 University Technology Services, The Ohio State University           123
                                                        Editors
To configure the vi environment certain options can be set with the line editor command :set during a
vi editing session. Alternatively, frequently used options can be set automatically when vi is invoked,
by use of the .exrc file. This file can also contain macros to map keystrokes into functions using the
map function. Within vi these macros can be defined with the :map command. Control characters
can be inserted by first typing <control>-V (^V), then the desired control character. The options
available in vi include, but are not limited to, the following. Some options are not available on every
Unix system.
       :set all                  display all option settings
       :set ignorecase           ignore the case of a character in a search
       :set list                 display tabs and carriage returns
       :set nolist               turn off list option
       :set number               display line numbers
       :set nonumber             turn off line numbers
       :set showmode             display indication that insert mode is on
       :set noshowmode           turn off showmode option
       :set wrapmargin=n         turn on word-wrap n spaces from the right margin
       :set wrapmargin=0         turn off wrapmargin option
       :set warn                 display "No write since last change"
       :set nowarn               turn off "write" warning
124                 1998 University Technology Services, The Ohio State University        Introduction to Unix
                                     Configuring Your emacs Session
Configuring the emacs environment amounts to making calls to LISP functions. Emacs is infinitely
customizable by means of emacs variables and built-in functions and by using Emacs LISP
programming. Settings can be specified from the minibuffer (or command line) during an emacs
session. Alternatively, frequently used settings can be established automatically when emacs is
invoked, by use of a .emacs file. Though a discussion of Emacs LISP is beyond the scope of this
document, a few examples of common emacs configurations follow.
To set or toggle emacs variables, or to use emacs built-in functions, use the <escape> key ("Meta" is
how emacs refers to it), followed by the letter x, then by the variable or function and its arguments.
       M-x what-line                                what line is the cursor on?
       M-x auto-fill-mode                           turn on word-wrap
       M-x auto-fill-mode                           turn off word-wrap
       M-x set-variable<return>
               fill-column<return>                  set line-length to
               45                                   45 characters
       M-x set-variable<return>
               auto-save-interval<return>           save the file automatically after every
               300                                  300 keystrokes
       M-x goto-line<return>16                      move the cursor to line 16
       M-x help-for-help                            invoke emacs help when C-h has been bound to the
                                                    backspace key
Introduction to Unix       1998 University Technology Services, The Ohio State University             125
                                                                   10.3    vi Quick Reference Guide
   Introduction to Unix
                                                                    (n)j    down (n) space(s)                                 command)                                       &           repeats last substitution (:s) command.
                                                                    (n)k    up (n) space(s)                           o       (alpha o) open new line after the current      (n)yy       yanks (n) lines to buffer
                                                                                                                              line to type text
                                                                    (n)l    right (n) space(s)                                                                               y(n)w                 yanks (n) words to buffer
                                                                                                                      O       (alpha O) open new line before the cur-
In the table below we summarize the more frequently used commands on a Unix system. In this
table, as in general, for most Unix commands, file, could be an actual file name, or a list of file names,
or input/output could be redirected to or from the command.
128                     1998 University Technology Services, The Ohio State University               Introduction to Unix
                                                   Unix Commands
Introduction to Unix             1998 University Technology Services, The Ohio State University                          129
                                              Unix Command Summary
 strings [options] file                       report any sequence of 4 or more printable characters ending in <NL> or
                                              <NULL>. Usually used to search binary files for ASCII strings.
 stty [options]                               set or display terminal control options
 tail [options] file                          display the last few lines (or parts) of a file
 tar key[options] [file(s)]                   tape archiver--refer to man pages for details on creating, listing, and
                                              retrieving from archive files. Tar files can be stored on tape or disk.
 tee [options] file                           copy stdout to one or more files
 telnet [host [port]]                         communicate with another host using telnet protocol
 touch [options] [date] file                  create an empty file, or update the access time of an existing file
 tr [options] string1 string2                 translate the characters in string1 from stdin into those in string2 in stdout
 uncompress file.Z                            uncompress file.Z and save it as a file
 uniq [options] file                          remove repeated lines in a file
 uudecode [file]                              decode a uuencoded file, recreating the original file
 uuencode [file] new_name                     encode binary file to 7-bit ASCII, useful when sending via email, to be
                                              decoded as new_name at destination
 vi [options] file                            visual, full-screen editor
 wc [options] [file(s)]                       display word (or character or line) count for file(s)
 whereis [options] command                    report the binary, source, and man page locations for the command
                                              named
 which command                                reports the path to the command or the shell alias in use
 who or w                                     report who is logged in and what processes are running
 zcat file.Z                                  concatenate (list) uncompressed file to screen, leaving file compressed on
                                              disk
130                     1998 University Technology Services, The Ohio State University               Introduction to Unix
                                        Highly Recommended
Introduction to Unix      1998 University Technology Services, The Ohio State University   131
                                    A Short Unix Bibliography
Unix Shell Programming, Stephen G. Kochan & Patrick H. Wood (Hayden Book Co., 1990, ISBN
0-8104-6309-1).
The Unix C Shell Field Guide, Gail Anderson and Paul Anderson (Prentice Hall, 1986, ISBN
0-13-937468-X).
A Student’s Guide to UNIX, Harley Hahn. (McGraw-Hill, 1993, ISBN 0-07-025511-3).
Tricks of the UNIX Masters, Russell G. Sage (Howard W. Sams & Co., Inc., 1987, ISBN
0-672-22449-6).
132  1998 University Technology Services, The Ohio State University Introduction to Unix