summaryrefslogtreecommitdiff
path: root/slides/using_linux_tools/ult.tex
diff options
context:
space:
mode:
Diffstat (limited to 'slides/using_linux_tools/ult.tex')
-rw-r--r--slides/using_linux_tools/ult.tex1721
1 files changed, 1721 insertions, 0 deletions
diff --git a/slides/using_linux_tools/ult.tex b/slides/using_linux_tools/ult.tex
new file mode 100644
index 0000000..a94dc14
--- /dev/null
+++ b/slides/using_linux_tools/ult.tex
@@ -0,0 +1,1721 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Using Linux Tools
+%
+% Author: FOSSEE
+% Copyright (c) 2009, FOSSEE, IIT Bombay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass[12pt,compress]{beamer}
+
+\mode<presentation>
+{
+ \usetheme{Warsaw}
+ \useoutertheme{infolines}
+ \setbeamercovered{transparent}
+}
+
+\usepackage[english]{babel}
+\usepackage[latin1]{inputenc}
+%\usepackage{times}
+\usepackage[T1]{fontenc}
+
+% Taken from Fernando's slides.
+\usepackage{ae,aecompl}
+\usepackage{mathpazo,courier,euler}
+\usepackage[scaled=.95]{helvet}
+
+\definecolor{darkgreen}{rgb}{0,0.5,0}
+
+\usepackage{listings}
+\lstset{language=sh,
+ basicstyle=\ttfamily\bfseries,
+ commentstyle=\color{red}\itshape,
+ stringstyle=\color{darkgreen},
+ showstringspaces=false,
+ keywordstyle=\color{blue}\bfseries}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Macros
+\setbeamercolor{emphbar}{bg=blue!20, fg=black}
+\newcommand{\emphbar}[1]
+{\begin{beamercolorbox}[rounded=true]{emphbar}
+ {#1}
+ \end{beamercolorbox}
+}
+\newcounter{time}
+\setcounter{time}{0}
+\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\tiny \thetime\ m}}
+
+\newcommand{\typ}[1]{\lstinline{#1}}
+
+\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}} }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Title page
+\title[Using Linux Tools]{SEES: Using Linux Tools}
+
+\author[FOSSEE] {FOSSEE}
+
+\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
+\date[]{}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo}
+%\logo{\pgfuseimage{iitmlogo}}
+
+
+%% Delete this, if you do not want the table of contents to pop up at
+%% the beginning of each subsection:
+
+\AtBeginSection[]
+{
+ \begin{frame}<beamer>
+ \frametitle{Outline}
+ \tableofcontents[currentsection]
+ \end{frame}
+}
+
+% If you wish to uncover everything in a step-wise fashion, uncomment
+% the following command:
+%\beamerdefaultoverlayspecification{<+->}
+
+%%\includeonlyframes{current,current1,current2,current3,current4,current5,current6}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DOCUMENT STARTS
+\begin{document}
+
+\begin{frame}
+ \maketitle
+\end{frame}
+
+% CREATING TOC
+\begin{frame}
+ \frametitle{Outline}
+ \tableofcontents
+ % You might wish to add the option [pausesections]
+\end{frame}
+
+
+\section{Introduction}
+\begin{frame}[fragile]
+ \begin{block}{What is the Linux OS?}
+ \begin{itemize}
+ \item Free Open Source Operating System
+ \begin{description}
+ \item[Free]
+ Free as in Free Speech, not Free Beer
+ \item[Open-Source]
+ Permit modifications and redistribution of source code
+ \end{description}
+ \item Unix-inspired
+ \item Linux Kernel + Application software
+ \item Runs on a variety of hardware
+ \item Also called GNU/Linux
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Why Linux?}
+ \begin{itemize}
+ \item Free as in Free Beer
+ \item Secure \& versatile
+ \end{itemize}
+
+ \begin{block}{Why Linux for Scientific Computing?}
+ \begin{itemize}
+ \item Free as in Free Speech
+ \item Can run for \emph{ever}
+ \item Libraries
+ \item Parallel Computing
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\section{Getting Started}
+\begin{frame}[fragile]
+ \frametitle{Logging in}
+ \begin{itemize}
+ \item GNU/Linux does have a GUI
+ \item Command Line for this module
+ \item Hit \texttt{Ctrl + Alt + F1}
+ \item Login
+ \item \texttt{logout} command logs you out
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Where am I?}
+ \begin{itemize}
+ \item Logged in. Where are we?
+ \item \texttt{pwd} command gives the present working directory
+ \end{itemize}
+ \begin{lstlisting}
+ $ pwd
+ /home/user
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{What is in there?}
+ \begin{itemize}
+ \item \texttt{ls} command lists contents of \texttt{pwd}
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls
+ jeeves.rst psmith.html blandings.html Music
+ \end{lstlisting} %$
+ \begin{itemize}
+ \item Can also pass directory as argument
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls Music
+ one.mp3 two.mp3 three.mp3
+ \end{lstlisting} %$
+ \begin{itemize}
+ \item \alert{the Unix world is case sensitive}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{New folders}
+ \begin{itemize}
+ \item \texttt{mkdir} creates new directories
+ \end{itemize}
+ \begin{lstlisting}
+ $ mkdir sees
+ $ ls
+ \end{lstlisting}
+ \begin{itemize}
+ \item Special characters need to be escaped OR quoted
+ \end{itemize}
+ \begin{lstlisting}
+ $ mkdir software\ engineering
+ $ mkdir "software engg"
+ \end{lstlisting}
+ \begin{itemize}
+ \item Generally, use hyphens or underscores instead of spaces in names
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Moving around}
+ \begin{itemize}
+ \item \texttt{cd} command changes the \texttt{pwd}
+ \end{itemize}
+ \begin{lstlisting}
+ $ cd sees
+ $ pwd
+ /home/user/sees/
+ \end{lstlisting}
+ \begin{itemize}
+ \item Alternately written as \texttt{cd ./sees}
+ \item Specifying path relative to \texttt{pwd}
+ \item \texttt{..} takes one level up the directory structure
+ \end{itemize}
+ \begin{lstlisting}
+ $ cd ..
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item We could use absolute path instead of relative
+ \end{itemize}
+ \begin{lstlisting}
+ $ cd /home/user/sees/
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{New files}
+ \begin{itemize}
+ \item \texttt{touch} command creates a blank file
+ \end{itemize}
+ \begin{lstlisting}
+ $ pwd
+ /home/user
+ $ cd sees
+ $ touch first
+ $ ls
+ first
+ \end{lstlisting} % $
+\end{frame}
+
+\section{Getting Help}
+\begin{frame}[fragile]
+ \frametitle{What does a command do?}
+
+ \begin{itemize}
+ \item \texttt{whatis} gives a quick description of a command
+ \end{itemize}
+ \begin{lstlisting}
+ $ whatis touch
+ touch (1) - change file timestamps
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{man} command gives more detailed description
+ \end{itemize}
+ \begin{lstlisting}
+ $ man touch
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Shows all tasks that the command can perform
+ \item Hit \texttt{q} to quit the \texttt{man} page
+ \item For more, see the \texttt{man} page of \texttt{man}
+ \end{itemize}
+ \begin{lstlisting}
+ $ man man
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Using additional options}
+
+ \begin{itemize}
+ \item \texttt{-h} or \texttt{--help} give summary of command usage
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls --help
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item List out all files within a directory, recursively
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls -R
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Create a new directory along with parents, if required
+ \end{itemize}
+ \begin{lstlisting}
+ $ pwd
+ /home/user/
+ $ ls sees/
+ $ mkdir -p sees/linux-tools/scripts
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Searching for a command}
+
+ \begin{itemize}
+ \item \texttt{apropos} searches commands based on their descriptions
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ apropos remove
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item Returns a list of all commands that contain the search term
+ \item In this case, we are interested in \texttt{rm}, \texttt{rmdir}
+ \end{itemize}
+\end{frame}
+
+\section{Basic File Handling}
+\begin{frame}[fragile]
+ \frametitle{Removing files}
+
+ \begin{itemize}
+ \item \texttt{rm} is used to delete files
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ rm foo
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item \alert{\texttt{rm} works only for files; not directories}
+ \end{itemize}
+
+ \begin{itemize}
+ \item Additional arguments required to remove a directory
+ \item \texttt{-r} stands for recursive.
+ \item Removes directory and all of it's content
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ rm -r bar
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item \alert{\texttt{rmdir} can also be used; Explore}
+ \end{itemize}
+
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{Copying Files}
+
+ \begin{itemize}
+ \item \texttt{cp} copies files from one location to another
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ cp linux-tools/scripts/foo linux-tools/
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item New file-name can be used at target location
+ \item \texttt{foo} copied to new location with the name \texttt{bar}
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ cp linux-tools/scripts/foo linux-tools/bar
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item \texttt{cp} overwrites files, unless explicitly asked not to
+ \item To prevent this, use the \texttt{-i} flag
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ cp -i linux-tools/scripts/foo linux-tools/bar
+ cp: overwrite `bar'?
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Copying Directories}
+
+ \begin{itemize}
+ \item \texttt{-r} is required to copy a directory and all it's
+ content
+ \item Copying directories is similar to copying files
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ cd /home/user
+ $ cp -ir sees course
+ \end{lstlisting}
+\end{frame}
+
+
+
+\begin{frame}[fragile]
+ \frametitle{Moving Files}
+ \begin{itemize}
+ \item \texttt{cp} and \texttt{rm} would be one way
+ \item \texttt{mv} command does the job
+ \item Also takes \texttt{-i} option to prompt before overwriting
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ cd /home/user
+ # Assume we have course directory already created
+ $ mv -i sees/ course/
+ \end{lstlisting}
+ \begin{itemize}
+ \item No prompt! Why?
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls course
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{sees} became a sub-directory of \texttt{course}
+ \item \texttt{mv} command doesn't over-write directories
+ \item \texttt{-i} option is useful when moving files around
+ \item \texttt{mv} to rename --- move to same location with new name
+ \end{itemize}
+\end{frame}
+
+\section{Linux File Hierarchy, Permissions \& Ownership}
+\begin{frame}
+ \frametitle{Linux File Hierarchy}
+ \begin{itemize}
+ \item \texttt{/} is called the root directory
+ \item It is the topmost level of the hierarchy
+ \item For details \texttt{man hier}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Permissions and Access control}
+
+ \begin{itemize}
+ \item In a multi-user environment, access control is vital
+ \item Look at the output of \texttt{ls -l}
+ \end{itemize}
+
+ \begin{lstlisting}
+ drwxr-xr-x 5 root users 4096 Jan 21 20:07 home
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item The first column shows the permission information
+ \item First character specifies type of the file
+ \item Files have \texttt{-}; Directories have \texttt{d}
+ \item 3 sets of 3 characters --- for user, group and others
+ \item \texttt{r}, \texttt{w}, \texttt{x} --- for read, write, execute
+ \item Either the corresponding character or \texttt{-} is present
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Changing the permissions}
+ \begin{itemize}
+ \item Permissions can be changed by owner of the file
+ \item \texttt{chmod} command is used
+ \item \texttt{-R} option to recursively change for all content of a
+ directory
+ \end{itemize}
+ \begin{itemize}
+ \item Change permissions of \texttt{foo.sh} from
+ \texttt{-rw-r-{}-r-{}-} to \texttt{-rwxr-xr-{}-}
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls -l foo.sh
+ $ chmod ug+x foo.sh
+ $ ls -l foo.sh
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Symbolic modes}
+ \begin{small}
+ \begin{center}
+ \begin{tabular}{lll}
+ Reference & Class & Description \\
+ \hline
+ u & user & the owner of the file \\
+ g & group & users who are members of the file's group \\
+ o & others & users who are not hte owner of the file or members of the group \\
+ a & all & all three of the above; is the same as \emph{ugo} \\
+ \end{tabular}
+ \end{center}
+
+ \begin{center}
+ \begin{tabular}{ll}
+ Operator & Description \\
+ \hline
+ + & adds the specified modes to the specified classes \\
+ - & removes the specified modes from the specified classes \\
+ = & the modes specified are to be made the exact modes for the specified classes \\
+ \end{tabular}
+ \end{center}
+
+ \begin{center}
+ \begin{tabular}{lll}
+ Mode & Name & Description \\
+ \hline
+ r & read & read a file or list a directory's contents \\
+ w & write & write to a file or directory \\
+ x & execute & execute a file or recurse a directory tree \\
+ \end{tabular}
+ \end{center}
+ \end{small}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Changing Ownership of Files}
+ \begin{itemize}
+ \item \texttt{chown} changes the owner and group
+ \item By default, the user who creates file is the owner
+ \item The default group is set as the group of the file
+ \end{itemize}
+ \begin{lstlisting}
+ $ chown alice:users wonderland.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Did it work? \alert{Not every user can change ownership}
+ \item Super-user or \texttt{root} user alone is empowered
+ \end{itemize}
+\end{frame}
+
+\section{Looking at files}
+\begin{frame}[fragile]
+ \frametitle{\texttt{cat}}
+ \begin{itemize}
+ \item Displays the contents of files
+ \end{itemize}
+ \begin{lstlisting}
+ $ cat foo.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Concatenates the text of multiple files
+ \end{itemize}
+ \begin{lstlisting}
+ $ cat foo.txt bar.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Not-convenient to view long files
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{less}}
+ \begin{itemize}
+ \item View contents of a file one screen at a time
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ less wonderland.txt
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item q: Quit
+ \item Arrows/Page Up/Page Down/Home/End: Navigation
+ \item ng: Jump to line number n
+ \item /pattern: Search. Regular expressions can be used
+ \item h: Help
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{wc}}
+ \begin{itemize}
+ \item Statistical information about the file
+ \item the number of lines in the file
+ \item the number of words
+ \item the number of characters
+ \end{itemize}
+
+ \begin{lstlisting}
+ $ wc wonderland.txt
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{head} \& \texttt{tail}}
+ \begin{itemize}
+ \item let you see parts of files, instead of the whole file
+ \item \texttt{head} -- start of a file; \texttt{tail} -- end of a
+ file
+ \item show 10 lines by default
+ \end{itemize}
+ \begin{lstlisting}
+ $ head wonderland.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-n} option to change the number of lines
+ \end{itemize}
+ \begin{lstlisting}
+ $ head -n 1 wonderland.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{tail} is commonly used to monitor files
+ \item \texttt{-f} option to monitor the file
+ \item \texttt{Ctrl-C} to interrupt
+ \end{itemize}
+ \begin{lstlisting}
+ $ tail -f /var/log/dmesg
+ \end{lstlisting} % $
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{cut}}
+ \begin{itemize}
+ \item Allows you to view only certain sections of lines
+ \item Let's take \texttt{/etc/passwd} as our example
+ \end{itemize}
+ \begin{lstlisting}
+ root:x:0:0:root:/root:/bin/bash
+ \end{lstlisting}
+ \begin{itemize}
+ \item View only user names of all the users (first column)
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d : -f 1 /etc/passwd
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-d} specifies delimiter between fields (default TAB)
+ \item \texttt{-f} specifies the field number
+ \item Multiple fields by separating field numbers with comma
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d : -f 1,5,7 /etc/passwd
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{cut}}
+ \begin{itemize}
+ \item Allows choosing on the basis of characters or bytes
+ \item Example below gets first 4 characters of \texttt{/etc/passwd}
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -c 1-4 /etc/passwd
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item One of the limits of the range can be dropped
+ \item Sensible defaults are assumed in such cases
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -c -4 /etc/passwd
+ $ cut -c 10- /etc/passwd
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{paste}}
+ \begin{itemize}
+ \item Joins corresponding lines from two different files
+ \begin{center}
+ \begin{tabular}{l|l}
+ \verb~students.txt~ & \verb~marks.txt~ \\
+ Hussain & 89 92 85 \\
+ Dilbert & 98 47 67 \\
+ Anne & 67 82 76 \\
+ Raul & 78 97 60 \\
+ Sven & 67 68 69 \\
+ \end{tabular}
+ \end{center}
+ \end{itemize}
+ \begin{lstlisting}
+ $ paste students.txt marks.txt
+ $ paste -s students.txt marks.txt
+ \end{lstlisting}
+ \begin{itemize}
+ \item \texttt{-s} prints content, one below the other
+ \item If first column of marks file had roll numbers? How do we get
+ a combined file with the same output as above (i.e. without roll
+ numbers). We need to use \texttt{cut} \& \texttt{paste} together.
+ But how?
+ \end{itemize}
+\end{frame}
+
+\section{The Command Shell}
+
+\begin{frame}[fragile]
+ \frametitle{Redirection and Piping}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ > /tmp/m_tmp.txt
+ $ paste -d " " students.txt m_tmp.txt
+ \end{lstlisting} % $
+
+ or
+
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -
+ \end{lstlisting} % $
+
+ \begin{itemize}
+ \item The first solution used Redirection
+ \item The second solution uses Piping
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Redirection}
+
+ \begin{itemize}
+ \item The standard output (stdout) stream goes to the display
+ \item Not always, what we need
+ \item First solution, redirects output to a file
+ \item \texttt{>} states that output is redirected; It is
+ followed by location to redirect
+ \end{itemize}
+ \begin{lstlisting}
+ $ command > file1
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{>} creates a new file at specified location
+ \item \texttt{>>} appends to a file at specified location
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Redirection \ldots}
+ \begin{itemize}
+ \item Similarly, the standard input (stdin) can be redirected
+ \end{itemize}
+ \begin{lstlisting}
+ $ command < file1
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item input and the output redirection could be combined
+ \end{itemize}
+ \begin{lstlisting}
+ $ command < infile > outfile
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Standard error (stderr) is the third standard stream
+ \item All error messages come through this stream
+ \item \texttt{stderr} can also be redirected
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Redirection \ldots}
+ \begin{itemize}
+ \item Following example shows \texttt{stderr} redirection
+ \item Error is printed out in the first case
+ \item Error message is redirected, in the second case
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -c 2- marks1.txt \
+ > /tmp/m_tmp.txt
+
+ $ cut -d " " -f 2- marks1.txt 1> \
+ /tmp/m_tmp.txt 2> /tmp/m_err.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{1>} redirects \texttt{stdout}; \texttt{2>} redirects
+ \texttt{stderr}
+ \end{itemize}
+ \begin{lstlisting}
+ $ paste -d " " students.txt m_tmp.txt
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Piping}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-} instead of FILE asks \texttt{paste} to read from
+ \texttt{stdin}
+ \item \texttt{cut} command is a normal command
+ \item the \texttt{|} seems to be joining the two commands
+ \item Redirects output of first command to \texttt{stdin}, which
+ becomes input to the second command
+ \item This is called piping; \texttt{|} is called a pipe
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Piping}
+ \begin{itemize}
+ \item Roughly same as -- 2 redirects and a temporary file
+ \end{itemize}
+ \begin{lstlisting}
+ $ command1 > tempfile
+ $ command2 < tempfile
+ $ rm tempfile
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Any number of commands can be piped together
+ \end{itemize}
+\end{frame}
+
+\subsection{Features of the Shell}
+
+\begin{frame}[fragile]
+ \frametitle{Tab-completion}
+ \begin{itemize}
+ \item Hit tab to complete an incompletely typed word
+ \item Tab twice to list all possibilities when ambiguous completion
+ \item Bash provides tab completion for the following.
+ \begin{enumerate}
+ \item File Names
+ \item Directory Names
+ \item Executable Names
+ \item User Names (when they are prefixed with a \~{})
+ \item Host Names (when they are prefixed with a @)
+ \item Variable Names (when they are prefixed with a \$)
+ \end{enumerate}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{History}
+ \begin{itemize}
+ \item Bash saves history of commands typed
+ \item Up and down arrow keys allow to navigate history
+ \item \texttt{Ctrl-r} searches for commands used
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Shell Meta Characters}
+ \begin{itemize}
+ \item ``meta characters'' are special command directives
+ \item File-names shouldn't have meta-characters
+ \item \verb+/<>!$%^&*|{}[]"'`~;+
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls file.*
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Lists \texttt{file.ext} files, where \texttt{ext} can be
+ anything
+ \end{itemize}
+ \begin{lstlisting}
+ $ ls file.?
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Lists \texttt{file.ext} files, where \texttt{ext} is only one
+ character
+ \end{itemize}
+\end{frame}
+
+\section{More text processing}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{sort}}
+ \begin{itemize}
+ \item \texttt{sort} can be used to get sorted content
+ \item Command below prints student marks, sorted by name
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt - \
+ | sort
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item The default is sort based on the whole line
+ \item \texttt{sort} can sort based on a particular field
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{sort} \ldots}
+ \begin{itemize}
+ \item The command below sorts based on marks in first subject
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -\
+ | sort -t " " -k 2 -rn
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-t} specifies the delimiter between fields
+ \item \texttt{-k} specifies the field to use for sorting
+ \item \texttt{-n} to choose numerical sorting
+ \item \texttt{-r} for sorting in the reverse order
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{grep}}
+ \begin{itemize}
+ \item \texttt{grep} is a command line text search utility
+ \item Command below searches \& shows the marks of Anne alone
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -
+ | grep Anne
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{grep} is case-sensitive by default
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{grep} \ldots}
+ \begin{itemize}
+ \item \texttt{-i} for case-insensitive searches
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -
+ | grep -i Anne
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-v} inverts the search
+ \item To see everyone's marks except Anne's
+ \end{itemize}
+ \begin{lstlisting}
+ $ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt -
+ | grep -iv Anne
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{tr}}
+ \begin{itemize}
+ \item \texttt{tr} translates or deletes characters
+ \item Reads from \texttt{stdin} and outputs to \texttt{stdout}
+ \item Given, two sets of characters, replaces one with other
+ \item The following, replaces all lower-case with upper-case
+ \end{itemize}
+ \begin{lstlisting}
+ $ cat students.txt | tr a-z A-Z
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-s} compresses sequences of identical adjacent
+ characters in the output to a single one
+ \item Following command removes empty newlines
+ \end{itemize}
+ \begin{lstlisting}
+ $ tr -s '\n' '\n'
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{tr} \ldots}
+ \begin{itemize}
+ \item \texttt{-d} deletes all specified characters
+ \item Only a single character set argument is required
+ \item The following command removes carriage return characters
+ (converting file in DOS/Windows format to the Unix format)
+ \end{itemize}
+ \begin{lstlisting}
+ $ cat foo.txt | tr -d '\r' > bar.txt
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{-c} complements the first set of characters
+ \item The following command removes all non-alphanumeric characters
+ \end{itemize}
+ \begin{lstlisting}
+ $ tr -cd '[:alnum:]'
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{uniq}}
+ \begin{itemize}
+ \item \texttt{uniq} command removes duplicates from \alert{sorted} input
+ \end{itemize}
+ \begin{lstlisting}
+ $ sort items.txt | uniq
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{uniq -u} gives lines which do not have any duplicates
+ \item \texttt{uniq -d} outputs only those lines which have duplicates
+ \item \texttt{-c} displays the number of times each line occurs
+ \end{itemize}
+ \begin{lstlisting}
+ $ sort items.txt | uniq -u
+ $ sort items.txt | uniq -dc
+ \end{lstlisting} % $
+\end{frame}
+
+\section{Simple Shell Scripts}
+
+\begin{frame}[fragile]
+ \frametitle{Shell scripts}
+ \begin{itemize}
+ \item Simply a sequence of shell commands in a file
+ \item To save results of students in \texttt{results.txt} in
+ \texttt{marks} dir
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ mkdir ~/marks
+ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt - \
+ | sort > ~/marks/results.txt
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Shell scripts \ldots}
+ \begin{itemize}
+ \item Save the script as \texttt{results.sh}
+ \item Make file executable and then run
+ \end{itemize}
+ \begin{lstlisting}
+ $ chmod u+x results.sh
+ $ ./results.sh
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item What does the first line in the script do?
+ \item Specify the interpreter or shell which should be used to
+ execute the script; in this case \texttt{bash}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Variables \& Comments}
+ \begin{lstlisting}
+ $ name=FOSSEE
+ $ count=`wc -l wonderland.txt`
+ $ echo $count # Shows the value of count
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item It is possible to create variables in shell scripts
+ \item Variables can be assigned with the output of commands
+ \item \alert{NOTE:} There is no space around the \texttt{=} sign
+ \item All text following the \texttt{\#} is considered a comment
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{echo}}
+ \begin{itemize}
+ \item \texttt{echo} command prints out messages
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ mkdir ~/marks
+ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt - \
+ | sort > ~/marks/results.txt
+ echo "Results generated."
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Command line arguments}
+ \begin{itemize}
+ \item Shell scripts can be given command line arguments
+ \item Following code allows to specify the results file
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ mkdir ~/marks
+ cut -d " " -f 2- marks1.txt \
+ | paste -d " " students.txt - \
+ | sort > ~/marks/$1
+ echo "Results generated."
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{\$1} corresponds to first command line argument
+ \item \texttt{\$n} corresponds to $n{th}$ command line argument
+ \item It can be run as shown below
+ \end{itemize}
+ \begin{lstlisting}
+ $ ./results.sh grades.txt
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{PATH}}
+ \begin{itemize}
+ \item The shell searches in a set of locations, for the command
+ \item Locations are saved in ``environment'' variable called PATH
+ \item \texttt{echo} can show the value of variables
+ \end{itemize}
+ \begin{lstlisting}
+ $ echo $PATH
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Put \texttt{results.sh} in one of these locations
+ \item It can then be run without \texttt{./}
+ \end{itemize}
+\end{frame}
+
+\section{Control structures and Operators}
+\begin{frame}[fragile]
+ \frametitle{Control Structures}
+ \begin{itemize}
+ \item \texttt{if-else}
+ \item \texttt{for} loops
+ \item \texttt{while} loops
+ \end{itemize}
+ \begin{itemize}
+ \item \texttt{test} command to test for conditions
+ \item A whole range of tests that can be performed
+ \begin{itemize}
+ \item \texttt{STRING1 = STRING2} -- string equality
+ \item \texttt{INTEGER1 -eq INTEGER2} -- integer equality
+ \item \texttt{-e FILE} -- existence of FILE
+ \end{itemize}
+ \item \texttt{man} page of \texttt{test} gives list of various tests
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{if}}
+ \begin{itemize}
+ \item Print message if directory exists in \texttt{pwd}
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ if test -d $1
+ then
+ echo "Yes, the directory" \
+ $1 "is present"
+ fi
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{if}-\texttt{else}}
+ \begin{itemize}
+ \item Checks whether argument is negative or not
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ if test $1 -lt 0
+ then
+ echo "number is negative"
+ else
+ echo "number is non-negative"
+ fi
+ \end{lstlisting} % $
+ \begin{lstlisting}
+ $ ./sign.sh -11
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{[ ]} - alias for \texttt{test}}
+ \begin{itemize}
+ \item Square brackets (\texttt{[]}) can be used instead of
+ \texttt{test}
+ \item
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/bash
+ if [ $1 -lt 0 ]
+ then
+ echo "number is negative"
+ else
+ echo "number is non-negative"
+ fi
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \alert{spacing is important, when using the square brackets}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{if}-\texttt{else}}
+ \begin{itemize}
+ \item An example script to greet the user, based on the time
+ \end{itemize}
+ \begin{lstlisting}
+ #!/bin/sh
+ # Script to greet the user
+ # according to time of day
+ hour=`date | cut -c12-13`
+ now=`date +"%A, %d of %B, %Y (%r)"`
+ if [ $hour -lt 12 ]
+ then
+ mess="Good Morning \
+ $LOGNAME, Have a nice day!"
+ fi
+ \end{lstlisting} %$
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{if}-\texttt{else} \ldots}
+ \begin{lstlisting}
+ if [ $hour -gt 12 -a $hour -le 16 ]
+ then
+ mess="Good Afternoon $LOGNAME"
+ fi
+ if [ $hour -gt 16 -a $hour -le 18 ]
+ then
+ mess="Good Evening $LOGNAME"
+ fi
+ echo -e "$mess\nIt is $now"
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item \texttt{\$LOGNAME} has login name (env. variable)
+ \item backquotes store commands outputs into variables
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{for}}
+ \begin{block}{Problem}
+ Given a set of \texttt{.mp3} files, that have names beginning with
+ numbers followed by their names --- \texttt{08 - Society.mp3} ---
+ rename the files to have just the names. Also replace any spaces
+ in the name with hyphens.
+ \end{block}
+ \begin{itemize}
+ \item Loop over the list of files
+ \item Process the names, to get new names
+ \item Rename the files
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{for}}
+ \begin{itemize}
+ \item A simple example of the \texttt{for} loop
+ \end{itemize}
+ \begin{lstlisting}
+ for animal in rat cat dog man
+ do
+ echo $animal
+ done
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item List of animals, each animal's name separated by a space
+ \item Loop over the list; \texttt{animal} is a dummy variable
+ \item Echo value of \texttt{animal} --- each name in list
+ \end{itemize}
+ \begin{lstlisting}
+ for i in {10..20}
+ do
+ echo $i
+ done
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{for}}
+ \begin{itemize}
+ \item Let's start with echoing the names of the files
+ \end{itemize}
+ \begin{lstlisting}
+ for i in `ls *.mp3`
+ do
+ echo "$i"
+ done
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Spaces in names cause trouble!
+ \item The following works better
+ \end{itemize}
+ \begin{lstlisting}
+ for i in *.mp3
+ do
+ echo "$i"
+ done
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{tr} \& \texttt{cut}}
+ \begin{itemize}
+ \item Replace all spaces with hyphens using \texttt{tr -s}
+ \item Use cut \& keep only the text after the first hyphen
+ \end{itemize}
+ \begin{lstlisting}
+ for i in *.mp3
+ do
+ echo $i|tr -s " " "-"|cut -d - -f 2-
+ done
+ \end{lstlisting} % $
+ Now \texttt{mv}, instead of just echoing
+ \begin{lstlisting}
+ for i in *.mp3
+ do
+ mv $i `echo $i|tr -s " " "-"\
+ |cut -d - -f 2-`
+ done
+ \end{lstlisting} % $
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{while}}
+ \begin{itemize}
+ \item Continuously execute a block of commands until condition
+ becomes false
+ \end{itemize}
+
+ \begin{itemize}
+ \item program that takes user input and prints it back, until the
+ input is \texttt{quit}
+ \end{itemize}
+
+ \begin{lstlisting}
+ while [ "$variable" != "quit" ]
+ do
+ read variable
+ echo "Input - $variable"
+ done
+ exit 0
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Environment Variables}
+ \begin{itemize}
+ \item Pass information from shell to programs running in it
+ \item Behavior of programs can change based on values of variables
+ \item Environment variables vs. Shell variables
+ \item Shell variables -- only current instance of the shell
+ \item Environment variables -- valid for the whole session
+ \item Convention -- environment variables are UPPER CASE
+ \end{itemize}
+ \begin{lstlisting}
+ $ echo $OSTYPE
+ linux-gnu
+ $ echo $HOME
+ /home/user
+ \end{lstlisting} % $
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Environment Variables \ldots}
+ \begin{itemize}
+ \item The following commands show values of all the environment
+ variables
+ \end{itemize}
+ \begin{lstlisting}
+ $ printenv | less
+ $ env
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item Use \texttt{export} to change Environment variables
+ \item The new value is available to all programs started from the shell
+ \end{itemize}
+ \begin{lstlisting}
+ $ export PATH=$PATH:$HOME/bin
+ \end{lstlisting} % $
+\end{frame}
+
+\section{Miscellaneous Tools}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{find}}
+ \begin{itemize}
+ \item Find files in a directory hierarchy
+ \item Offers a very complex feature set
+ \item Look at the \texttt{man} page!
+ \end{itemize}
+ \begin{itemize}
+ \item Find all \texttt{.pdf} files, in current dir and sub-dirs
+ \begin{lstlisting}
+ $ find . -name ``*.pdf''
+ \end{lstlisting} % $
+ \item List all the directory and sub-directory names
+ \begin{lstlisting}
+ $ find . -type d
+ \end{lstlisting} % $
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{cmp}}
+ \begin{itemize}
+ \item Compare two files
+ \end{itemize}
+ \begin{lstlisting}
+ $ find . -name quick.c
+ ./Desktop/programs/quick.c
+ ./c-folder/quick.c
+ $ cmp Desktop/programs/quick.c \
+ c-folder/quick.c
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item No output when the files are exactly the same
+ \item Else, gives location where the first difference occurs
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\texttt{diff}}
+ \begin{itemize}
+ \item We know the files are different, but want exact differences
+ \end{itemize}
+ \begin{lstlisting}
+ $ diff Desktop/programs/quick.c \
+ c-folder/quick.c
+ \end{lstlisting} % $
+ \begin{itemize}
+ \item line by line difference between files
+ \item \texttt{>} indicates content only in second file
+ \item \texttt{<} indicates content only in first file
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{tar}}
+\begin{itemize}
+\item \emph{tarball} -- essentially a collection of files
+\item May or may not be compressed
+\item Eases the job of storing, backing-up \& transporting files
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Extracting an archive}
+
+\begin{lstlisting}
+$ mkdir extract
+$ cp allfiles.tar extract/
+$ cd extract
+$ tar -xvf allfiles.tar
+\end{lstlisting} %$
+
+\begin{itemize}
+\item \texttt{-x} --- Extract files within the archive
+\item \texttt{-f} --- Specify the archive file
+\item \texttt{-v} --- Be verbose
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Creating an archive}
+\begin{lstlisting}
+$ tar -cvf newarchive.tar *.txt
+\end{lstlisting} % $
+\begin{itemize}
+\item \texttt{-c} --- Create archive
+\item Last argument is list of files to be added to archive
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Compressed archives}
+ \begin{itemize}
+ \item \texttt{tar} can create and extract compressed archives
+ \item Supports compressions like gzip, bzip2, lzma, etc.
+ \item Additional option to handle compressed archives
+ \begin{center}
+ \begin{tabular}{ll}
+ Compression & Option \\
+ gzip & \texttt{-z} \\
+ bzip2 & \texttt{-j} \\
+ lzma & \texttt{-{}-lzma} \\
+ \end{tabular}
+ \end{center}
+ \end{itemize}
+ \begin{lstlisting}
+ $ tar -cvzf newarchive.tar.gz *.txt
+ \end{lstlisting} % $
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Customizing your shell}
+\begin{itemize}
+\item Bash reads \texttt{/etc/profile},
+ \texttt{\textasciitilde{}/.bash\_profile},
+ \texttt{\textasciitilde{}/.bash\_login}, and
+ \texttt{\textasciitilde{}/.profile} in that order, when starting
+ up as a login shell.
+\item \texttt{\textasciitilde{}/.bashrc} is read, when not a login
+ shell
+\item Put any commands that you want to run when bash starts, in this
+ file.
+\end{itemize}
+\end{frame}
+
+%% THE DOCUMENT ENDS HERE
+\end{document}
+%%%%%%%%%%%%%%%%%%%%
+
+\section{Basic editing and editors}
+\begin{frame}[fragile]
+\frametitle{vim}
+
+
+Vim is a very powerful editor. It has a lot of commands, and all of them
+cannot be explained here. We shall try and look at a few, so that you
+can find your way around in vim.
+
+To open a file in vim, we pass the filename as a parameter to the \texttt{vim}
+command. If a file with that filename does not exist, a new file is
+created.
+
+\begin{lstlisting}
+$ vim first.txt
+\end{lstlisting} % $
+
+To start inserting text into the new file that we have opened, we need
+to press the \texttt{i} key. This will take us into the \emph{insert} mode from the
+\emph{command} mode. Hitting the \texttt{esc} key, will bring us back to the
+\emph{command} mode. There is also another mode of vim, called the \emph{visual}
+mode which will be discussed later in the course.
+
+In general, it is good to spend as little time as possible in the insert
+mode and extensively use the command mode to achieve various tasks.
+
+To save the file, use \texttt{:w} in the command mode. From here on, it is
+understood that we are in the command mode, whenever we are issuing any
+command to vim.
+
+To save a file and continue editing, use \texttt{:w FILENAME} The file name is
+optional. If you do not specify a filename, it is saved in the same file
+that you opened. If a file name different from the one you opened is
+specified, the text is saved with the new name, but you continue editing
+the file that you opened. The next time you save it without specifying a
+name, it gets saved with the name of the file that you initially opened.
+
+To save file with a new name and continue editing the new file, use
+\texttt{:saveas FILENAME}
+
+To save and quit, use \texttt{:wq}
+
+To quit, use \texttt{:q}
+
+To quit without saving, use \texttt{:q!}
+\begin{itemize}
+
+\item Moving around\\
+While you are typing in a file, it is in-convenient to keep moving your
+fingers from the standard position for typing to the arrow keys. Vim,
+therefore, provides alternate keys for moving in the document. Note
+again that, you should be in the command mode, when issuing any commands
+to vim.
+
+The basic cursor movement can be achieved using the keys, \texttt{h} (left),
+\texttt{l} (right), \texttt{k} (up) and \texttt{j} (down).
+
+\begin{lstlisting}
+^
+k
+\end{lstlisting} % $
+
+\begin{quote}
+
+\begin{description}
+\item[< h l >] j v
+\end{description}
+
+\end{quote}
+
+Note: Most commands can be prefixed with a number, to repeat the
+command. For instance, \texttt{10j} will move the cursor down 10 lines.
+
+
+\item Moving within a line\\
+\begin{center}
+\begin{tabular}{ll}
+ Cursor Movement & Command \\
+\hline
+ Beginning of line & \texttt{0} \\
+ First non-space character of line & \texttt{\textasciicircum{}} \\
+ End of line & \texttt{\$} \\
+ Last non-space character of line & \texttt{g\_} \\
+\end{tabular}
+\end{center}
+
+
+
+
+\item Moving by words and sentences\\
+\begin{center}
+\begin{tabular}{ll}
+ Cursor Movement & Command \\
+\hline
+ Forward, word beginning & \texttt{w} \\
+ Backward, word beginning & \texttt{b} \\
+ Forward, word end & \texttt{e} \\
+ Backward, word end & \texttt{ge} \\
+ Forward, sentence beginning & \texttt{)} \\
+ Backward, sentence beginning & \texttt{(} \\
+ Forward, paragraph beginning & \texttt{\}} \\
+ Backward, paragraph beginning & \texttt{\{} \\
+\end{tabular}
+\end{center}
+
+
+
+
+\item More movement commands\\
+\begin{center}
+\begin{tabular}{ll}
+ Cursor Movement & Command \\
+\hline
+ Forward by a screenful of text & \texttt{C-f} \\
+ Backward by a screenful of text & \texttt{C-b} \\
+ Beginning of the screen & \texttt{H} \\
+ Middle of the screen & \texttt{M} \\
+ End of the screen & \texttt{L} \\
+ End of file & \texttt{G} \\
+ Line number \texttt{num} & \texttt{[num]G} \\
+ Beginning of file & \texttt{gg} \\
+ Next occurrence of the text under the cursor & \texttt{*} \\
+ Previous occurrence of the text under the cursor & \texttt{\#} \\
+\end{tabular}
+\end{center}
+
+
+
+Note: \texttt{C-x} is \texttt{Ctrl} + \texttt{x}
+
+
+\item The visual mode\\
+The visual mode is a special mode that is not present in the original vi
+editor. It allows us to highlight text and perform actions on it. All
+the movement commands that have been discussed till now work in the
+visual mode also. The editing commands that will be discussed in the
+future work on the visual blocks selected, too.
+
+
+\item Editing commands\\
+The editing commands usually take the movements as arguments. A movement
+is equivalent to a selection in the visual mode. The cursor is assumed
+to have moved over the text in between the initial and the final points
+of the movement. The motion or the visual block that's been highlighted
+can be passed as arguments to the editing commands.
+
+
+\begin{center}
+\begin{tabular}{ll}
+ Editing effect & Command \\
+\hline
+ Cutting text & \texttt{d} \\
+ Copying/Yanking text & \texttt{y} \\
+ Pasting copied/cut text & \texttt{p} \\
+\end{tabular}
+\end{center}
+
+
+
+The cut and copy commands take the motions or visual blocks as arguments
+and act on them. For instance, if you wish to delete the text from the
+current text position to the beginning of the next word, type \texttt{dw}. If
+you wish to copy the text from the current position to the end of this
+sentence, type \texttt{y)}.
+
+Apart from the above commands, that take any motion or visual block as
+an argument, there are additional special commands.
+
+
+\begin{center}
+\begin{tabular}{ll}
+ Editing effect & Command \\
+\hline
+ Cut the character under the cursor & \texttt{x} \\
+ Replace the character under the cursor with \texttt{a} & \texttt{ra} \\
+ Cut an entire line & \texttt{dd} \\
+ Copy/yank an entire line & \texttt{yy} \\
+\end{tabular}
+\end{center}
+
+
+
+Note: You can prefix numbers to any of the commands, to repeat them.
+
+
+\item Undo and Redo\\
+You can undo almost anything using \texttt{u}.
+
+To undo the undo command type \texttt{C-r}
+
+
+\item Searching and Replacing\\
+\begin{center}
+\begin{tabular}{ll}
+ Finding & Command \\
+\hline
+ Next occurrence of \texttt{text}, forward & \texttt{\textbackslash{}text} \\
+ Next occurrence of \texttt{text}, backward & \texttt{?text} \\
+ Search again in the same direction & \texttt{n} \\
+ Search again in the opposite direction & \texttt{N} \\
+ Next occurrence of \texttt{x} in the line & \texttt{fx} \\
+ Previous occurrence of \texttt{x} in the line & \texttt{Fx} \\
+\end{tabular}
+\end{center}
+
+
+
+
+\begin{center}
+\begin{tabular}{ll}
+ Finding and Replacing & Command \\
+\hline
+ Replace the first instance of \texttt{old} with \texttt{new} in the current line. & \texttt{:s/old/new} \\
+ Replace all instances of \texttt{old} with \texttt{new} in the current line. & \texttt{:s/old/new/g} \\
+ Replace all instances of \texttt{old} with \texttt{new} in the current line, but ask for confirmation each time. & \texttt{:s/old/new/gc} \\
+ Replace the first instance of \texttt{old} with \texttt{new} in the entire file. & \texttt{:\%s/old/new} \\
+ Replace all instances of \texttt{old} with \texttt{new} in the entire file. & \texttt{:\%s/old/new/g} \\
+ Replace all instances of \texttt{old} with \texttt{new} in the entire file but ask for confirmation each time. & \texttt{:\%s/old/new/gc} \\
+\end{tabular}
+\end{center}
+
+
+
+\end{itemize} % ends low level
+\end{frame}
+\begin{frame}
+\frametitle{SciTE}
+
+
+SciTE is a \emph{source code} editor, that has a feel similar to the commonly
+used GUI text editors. It has a wide range of features that are
+extremely useful for a programmer, editing code. Also it aims to keep
+configuration simple, and the user needs to edit a text file to
+configure SciTE to his/her liking.
+
+Opening, Saving, Editing files with SciTE is extremely simple and
+trivial. Knowledge of using a text editor will suffice.
+
+SciTE can syntax highlight code in various languages. It also has
+auto-indentation, code-folding and other such features which are useful
+when editing code.
+
+SciTE also gives you the option to (compile and) run your code, from
+within the editor.
+\end{frame}
+
+
+