Bash gives many essential built-in instructions, like ls, cd, and mv, in addition to common instruments equivalent to grep, awk, and sed. However, it’s equally essential to know the punctuation marks — the glue within the form of dots, commas, brackets. and quotes — that assist you to remodel and push information from one place to a different. Take angle brackets (< >), for instance.
If you’re accustomed to different programming and scripting languages, you might have used < and > as logical operators to verify in a situation whether or not one worth is bigger or smaller than one other. In case you have ever written HTML, you could have used angle brackets to surround tags.
In shell scripting, you too can use brackets to push information from place to position, for instance, to a file:
ls > dir_content.txt
On this instance, as a substitute of exhibiting the contents of the listing on the command line, > tells the shell to repeat it right into a file referred to as dir_content.txt. If dir_content.txt does not exist, Bash will create it for you, but when dir_content.txt already exists and isn’t empty, you’ll overwrite no matter it contained, so watch out!
You’ll be able to keep away from overwriting current content material by tacking the brand new stuff onto the top of the previous stuff. For that you simply use >> (as a substitute of >):
ls $HOME > dir_content.txt; wc -l dir_content.txt >> dir_content.txt
This line shops the record of contents of your house listing into dir_content.txt. You then rely the variety of strains in dir_content.txt (which provides you the variety of gadgets within the listing) with wc -l and also you tack that worth onto the top of the file.
After operating the command line on my machine, that is what my dir_content.txt file seems to be like:
The mnemonic right here is to take a look at > and >> as arrows. In truth, the arrows can level the opposite method, too. Say you could have a file referred to as CBActors containing some names of actors and the variety of movies by the Coen brothers they’ve been in. One thing like this:
John Goodman 5
John Turturro three
George Clooney 2
Frances McDormand 6
Steve Buscemi 5
Jon Polito four
Tony Shalhoub three
James Gandolfini 1
One thing like
kind < CBActors # Do that Frances McDormand 6 # And also you get this George Clooney 2 James Gandolfini 1 John Goodman 5 John Turturro three Jon Polito four Steve Buscemi 5 Tony Shalhoub three
Will kind the record alphabetically. However then once more, you do not want < right here since kind already expects a file anyway, so kind CBActors will work simply as properly.
Nevertheless, if you might want to see who’s the Coens’ favourite actor, you possibly can verify with :
whereas learn identify surname movies; do echo $movies $identify $surname > filmsfirst.txt; achieved < CBActors
Or, to make that a bit extra readable:
whereas learn identify surname movies;
echo $movies $identify $surname >> filmsfirst;
achieved < CBActors
Let’s break this down, we could?
the whereas …; do … achieved construction is a loop. The directions between do and achieved are repeatedly executed whereas a situation is met, on this case…
… the learn instruction has strains to learn. learn reads from the usual enter and can proceed studying till there’s nothing extra to learn…
… And as normal enter is fed in through < and comes from CBActors, that means the while loop will loop until the last line of CBActors is piped into the loop. Getting back to read for a sec, the tool is clever enough to see that there are three distinct fields separated by spaces on each line of the file. That allows you to put the first field from each line in the name variable, the second in surname and the third in films. This comes in handy later, on the line that says echo $films $name $surname >> filmsfirst;, permitting you to reorder the fields and push them right into a file referred to as filmsfirst.
On the finish of all that, you could have a file referred to as filmsfirst that appears like this:
5 John Goodman
three John Turturro
2 George Clooney
6 Frances McDormand
5 Steve Buscemi
four Jon Polito
three Tony Shalhoub
1 James Gandolfini
which now you can use with kind:
kind -r filmsfirst
to see who’s the Coens’ favourite actor. Sure, it’s Frances McDormand. (The -r choice reverses the type, so McDormand finally ends up on high).
We’ll take a look at extra angles on this matter subsequent time!