Difference between revisions of "Tutorial: A bit of Bash"

From dftwiki3
Jump to: navigation, search
(File System)
(Challenge 2)
Line 85: Line 85:
 
[[Image:QuestionMark2.jpg|right|120px]]  
 
[[Image:QuestionMark2.jpg|right|120px]]  
 
<br />  
 
<br />  
* Use the man pages for '''wc''' and figure out how to make it tell you the length (in character) of the longest line in the file.  (to get the man page for a command, use '''man wc''' at the prompt.
+
* Use the man pages for '''wc''' and figure out how to make it tell you the length (in character) of the longest line in the file.  (To get the man page for a command, use '''man wc''' at the prompt.)
 
<br />
 
<br />
 
<br />
 
<br />

Revision as of 11:09, 13 September 2015

--D. Thiebaut (talk) 11:03, 26 November 2013 (EST)


A quick review of some useful Bash commands that can be used on the command line, or that can be included in bash scripts





Exploration


A good reference on using a shell can be found here: http://linuxcommand.org/.

Here's a recommended path through this on-line tutorial; just click on each link, read the description, and try it out on the linux server (aurora.smith.edu very likely) that you are connected to.




Challenge 1

QuestionMark1.jpg


  • Create three files in your Linux account.
  • The first one should be called file1.txt and reside in the path ~/labs/lab1/. Its permissions should be "rwx------". It should contain the text "Mary had a little lamb."
  • The second one should be called hello.asm and reside in ~/hws/hw1/. Its permissions should be "rw-rw-rw-". It should contain the "hello world" program we saw in class.
  • The third should be the executable version of hello.asm, and reside in the ~/ directory.







wc and grep


  • Get a copy of James Joyce's Ulysses book by running this command:
 wget https://www.gutenberg.org/files/4300/4300.txt
  • Verify that you have a file called 4300.txt in your directory.
  • Rename the file ulysses.txt, which is a more appropriate name.
  • Let's view just the top 30 lines of the file:
 head -30 ulysses.txt

  • and the last 30 lines:
 tail -30 ulysses.txt

  • How about the 15th to the 20th line? Think about how you would do that...
 head -20 ulysses.txt | tail -5

  • Let's get some statistics on the text file:
 wc ulysses.txt
  • you will observe that the file contains over 30,000 lines, over 250,000 words, and over 1.5 million characters.
  • If you had wanted just the number of lines, you could have typed
 wc -l ulysses.txt



Challenge 2

QuestionMark2.jpg


  • Use the man pages for wc and figure out how to make it tell you the length (in character) of the longest line in the file. (To get the man page for a command, use man wc at the prompt.)













  • Let's find all the lines in the book that contains the name of the main protagonist, Muliligan:"
 grep Mulligan ulysses.txt
  • Let's count the number of lines that contain "Mulligan":
 grep Mulligan ulysses.txt | wc -l
  • Let's count how many "Buck Mulligan" appear together:
grep "Buck Mulligan" ulysses.txt | wc -l

Note that we use double-quotes to indicate that the string "Buck Mulligan" should be treated as a block.




Challenge 3

QuestionMark3.jpg
  • How many lines contain "Buck" but not "Mulligan"?
  • How many lines contain "Mulligan" but not "Buck"?








File System



Challenge 4

QuestionMark4.jpg


  • Create 3 text files in your account.
  • The first one should be called file1.txt and reside in the path ~/labs/lab1/. Its permissions should be "rwx------". It should contain the text "Mary had a little lamb."
  • The second one should be called file2.txt, and be a copy of the previous file1.txt, and it should reside in your home directory, and have privileges "rw-rw-rw-"
  • The third one should be called .file3.txt and reside in ~/hws/hw1/. Its permissions should be "rw-------". It should contain the string "I am a hidden file!"




Challenge 5

QuestionMark5.jpg


  • Create 3 text files in your account.
  • The first one should be called file1.txt and reside in the path ~/labs/lab1/. Its permissions should be "rwx------". It should contain the text "Mary had a little lamb."
  • The second one should be called hello.asm and reside in ~/hws/hw1/. Its permissions should be "rw-rw-rw-". It should contain the "hello world" program we saw in class.
  • The third should be the executable version of hello.asm, and reside in the ~/ directory.






Creating a bash script

  • first line should contain name of bash shell
#! /bin/bash
  • make the script executable
chmod +x scriptname


Variables

  • Declaration
file="hello.txt"
file=`ls -1 *.txt | head -1`     # get the first .txt file in the directory
  • In expressions: put a $ in front of it!
URL="http://cs.smith.edu/dftwiki/images/"
file="toto.png"
pathFile=$URL$file
file="alpha"
pathFile=$URL${file}.png      # add braces if string needs to be concatenated to variable

Script Parameters

  • assume doit.sh is a script and it is called as follows:
 doit.sh 8 2000 50
  • To get the arguments inside the script:
NP=$1    # will get 8
N=$2     # will get 2000
M=$3     # will get 50
  • To test if the number of parameters is 3 inside the script:
if [ "$#" -ne 3 ]; then
    echo "syntax: doit.sh NP N M"
    exit
fi

Displaying strings and various quantities

Getting the length of a string variable

name="toto.txt"
echo "length of $name = ${#name}"      #will output 8

Getting extension and name (without extension) of a file

fullPath="/usr/local/bin/toto.txt"
fileName="${fullPath##*/}"
echo "file name with extension = $fileName"

extension="${fullPath##*.}"
fileName="${fileName%.*}"

echo "fullPath = $fullPath"
echo "fileName without extension = $fileName"
echo "extension = $extension"

For Loops

  • loop from 1 to 10
for i in 1 2 3 4 5 6 7 8 9 10 ; do 
    echo $i
done
or
for i in {1..10} ; do 
    echo $i 
done
or
for i in {1..10} ; do echo $i; done
  • loop through strings
for file in toto.txt tata.txt tutu.txt titi.txt ; do
     echo $file
done
  • loop through all the files in a directory
dir="/enwiki/0/00"
for file in $dir/* ; do
    echo "$file"
done
or
dir="/enwiki/0/00"
for file in `ls -1 $dir` ; do
    echo $file
done

Sort lists

Alphabetically

  • to generate a sorted list of the files on the Desktop:
ls Desktop | sort

Numerically

  • to sort a list of numbers.
for i in 10 1 3 5 6 2 4 7 9 ; do echo $i ; done | sort -n
  • to remove replicated numbers
for i in 10 1 10 3 3 5 6 3 2 4 7 9 6 6 6 5 ; do echo $i ; done | sort -n | uniq