CSC231 Bash Tutorial 2
--D. Thiebaut (talk) 09:06, 9 February 2017 (EST)
Contents
Your History
The Bash shell keeps track of all the commands you type, at least the most recent ones. This list of commands is kept in a file, and when you login to your Linux account, the commands that you typed the last time you were connected are still in this file, available to you.
Let's figure out how to use your history to reduce your typing.
- If you do not have a working hello.asm program, get a copy of my version:
getcopy hello.asm
- Assemble, link, and run your program
nasm -f elf hello.asm ld -melf_i386 hello.o -o hello ./hello
- You should see the message printed.
Up and Down your History
- Edit hello.asm and modify the message, so that the program will print something different. It doesn't matter what.
emacs hello.asm
- You now have to assemble, link, and run your program again to see the result of the modification. Instead of typing the commands again...
- just press the UP arrow key on your keyboard a few times until your last nasm command. Press Enter when you have the command at the prompt.
- then press UP arrow again a few times and get the last ld command. Enter
- then press UP arrow again, and get ./hello
- You get the idea!
Fewer Keystrokes with !
- Go ahead and make another edit to change the message of your hello.asm program.
- Instead of using the arrow keys, you can be even more succinct: You know that the command you want to execute, nasm, again starts with na, so, at the prompt, type
!na
- this will ask Bash to locate the most recent command starting with the characters 'n' 'a', and to run it. Try it!
- Then try
!ld
- and you now have assembled and linked your program another time.
- You should have figured out a way to run it again:
!./
You do not need to use the first two characters. You could use just one. But if you do so, you may get the wrong command. For example, ls and ld start with the same letter "ell" so you would use two characters to specify that you want to repeat ld and not ls.
Finding the "type" of a File
In our computers we have many different file types: text files (created with an editor, such as emacs), doc files created by word processors (such as Microsoft Word), program files (java, python, assembly), object files, executable files, and more.
Usually the file extension will tell us what type of file we have: .asm, .txt, .doc, .o, .java, .py, etc.
Sometimes not.
So we can ask Linux to tell us.
- Type the following commands, one after the other:
file hello file hello.asm file hello.o file *
- With Linux (and Mac and Windows) the star character * matches any sequence of characters. So when you type file * you ask the file command to process all the file whose name matches *. So you get all the files in your current directory. If you wanted to get the type of just the files that start with "hello" you would type:
file hello*
Note that your executable files are reported by the file command as:
- ELF 32-bit LSB executable, Intel 80386
This indicates that the file can be run directly by an Intel processor of the 80386 family (to which the Pentium belongs), using 32-bit registers (eax, ebx, ecx, etc.). The Pentium also supports 64-bit registers, but the assembly language for using them is totally different. In this class we will use only 32-bit assembly.
Displaying the Contents of Text Files
Sometimes we want to quickly check the contents of a text file without necessarily wanting to edit it. We could use emacs, but it is a bit slow and cumbersome. Instead we can just ask Linux to display the file on the screen.
Let's get a long text file to play with:
getcopy snowPoems.txt
Less
The first command you can use is less:
less snowPoems.txt
- The less command shows only one page of text at a time; one screen-full page.
- You can go down the pages with spacebar
- You can go up with b (for back one page)
- You can go up and down one line with the UP and DOWN arrow keys.
- You exit the less command by typing q (for quit).
- Go ahead and try these commands.
If you want to search for a particular word in the file, use less, and type / followed by the word you are looking for. This will take you to the first occurrence of the word. You can go to the next occurrence with n.
less snowPoems.txt /Buddha n n n q
Challenge #1: |
Get a copy of James Joyce's Ulysses. as follows:
getcopy Ulysses.txt
Using the less command, navigate through the lines of the book that contain the name of the main character: "Mulligan"
Cat
Less is a page-by-page explorer. Cat displays the whole file and returns to the bash prompt.
cat snowPoems.txt
Sometimes cat is a quick way that allows one to get a quick idea of what is inside a text file. Cat will also be useful later when we use pipes.
- Use cat to display the contents of your assembly programs, i.e. the files with a .asm extension.
cat prog1.asm cat hello.asm
- cat can also display two files one after the other. While this is a strange thing one might want to do, this will come in handy when we use pipes and redirection later on this semester.
cat prog1.asm prog2.asm
- Play with cat and display various text files.
- For fun, try to cat an executable, and see what you get. Why?
Head
If you want to just see the first few lines of a file, you can use the head command:
head snowPoems.txt head prog1.asm head hello.asm
If you want to see the first, say, 5 lines of a file, you can tell 'head with a switch:
head -n 5 snowPoems.txt head -n 5 prog1.asm head -n 5 hello.asm
Of course, if you want to see just the first line, you could use head -1 filename
Multiple Files
Head can also handle multiple files. If, for some reason, you wanted to list the first 5 lines of all your assembly programs, you would do this:
head -n 5 *.asm
Tail
Similarly, you can get the last 10 (default) or n lines of a text file with tail:
tail snowPoems.txt tail prog1.asm tail hello.asm tail -n 2 snowPoems.txt tail -n 3 prog1.asm tail -n 5 hello.asm
Searching Text Files with grep
Grep is one of the Linux commands one uses often. It's very efficient at finding strings inside text files.
Get 4 more assembly programs into your account, to make sure the examples below work well:
getcopy prog1.asm getcopy prog2.asm getcopy prog3.asm getcopy prog4.asm
- Assume we want to find the assembly program that contains the string "hello." You know you wrote one at some point, but forgot the program's name:
grep hello *.asm
Grep will list all the lines that contain hello, in all the .asm files in your directory. The file name is listed first, then the line containing the pattern.
- Use grep to find all the files that contain the word "world"
- Use grep to find all the files that contain the word World (note the uppercase W)
If you wanted to search for both world and World, you could do it with just one grep command, by using the "-i" switch to indicate that grep should be ignoring lower- or upper-case differences.
grep -i world *.asm
Escaping Special Characters
Bash uses the " and ' characters to delimit strings. You will have noticed earlier that searching for hello brought many lines that may not have been of interest to us. If you wanted to search for programs that contain the string "hello..." you may have wanted to try "hello as the search term, but this would have confused grep, because it thinks the double quote is the beginning of a string you are typing, and you never close the string with another double quote.
The solution is to escape the double quote with a \ character:
grep -i \"hello *.asm
This time grep understands that it has to look for a string starting with ", then h, then e, etc in all the assembly program.
Try this, and see how you can fine-tune your search!
Numbering Lines
You can ask grep to add line numbers in its output:
grep -n Mulligan Ulysses.txt
will display and number all the lines in Ulysses that contain the string "Mulligan."
Challenge #2: |
What is the number of the line on which the name Roland appear, in Ulysses.txt?
Challenge #3: |
Find a quick and efficient way to figure out the line number for the first line and last line of the file snowPoems.txt that contain the words "snow" or "Snow".
References