Skip to main content

Advanced

Some advanced things

Pipes & direction

| is called pipe symbol.

ls | less: take output from ls and send it to input of less. So that you can easily browse through file list.

grep string file: search for string in file and print only those lines.

Some examples

Let say I have a csv file that includes details of films that nominated Oscars:

  1. I want extract all the films that are in 1978 in order.
  • First I find all the lines that has "1978": grep 1978 oscars.tsv
  • Then I continue to sort: grep 1978 oscars.tsv | sort
  • Then I want to save it to another file: grap 1978 oscars.tsv | sort > 1978films.txt
  1. I want to know how many films received 4 Oscars. Suppose 3rd column is number of Oscar film received.
  • Cut the 3rd column of every line and print it: cut -f 3 oscars.tsv
  • Find 4: cut -f 3 oscars.tsv | grep 4
  • Count how many of them: cut -f 3 oscars.tsv | grep 4 | wc -l (wc means word count, -l is for line)

Wildcards

Wildcards is the star or asterisk that bash will replace with the name of all files in the current directory.

For example:

  • ls a*: list all files start with "a".
  • ls *a: list all files end with "a".
  • ls *ab*: list all files contain "ab".
  • grep ab *: search "ab" in all files.
  • echo *: (echo is just simply echo what you type), bash will replace "*" with all the files in the directory.
  • mv *txt textFolder: move all txt file to textFolder

Superuser do

Some command that not allowed to run. To run it add sudo at the beginning.

Customization

There are many files is used for customization. All these files should be placed at home directory.

Bash:

  • .profile read on login -> should use for config variable
  • .bashrc read for interactive shells -> should use for running commands, aliases

Zsh:

  • .zshenv read always
  • .zshrc read fir interactive shells

Variables

export SOMEVAR=some_value

Usually to not set this everytime you start shell, you should put it in a .zshenv file. For bash, it is .profile.

$ nano .zshenv
$ export EDITOR=nano

PATH is a path variable indicate where to look for the commands. If it doesn't exist, shell will tell the command cannot be found.

To see the value, use echo and $.

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

This means that when you use command like grep for e.g., the shell will go to /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin: to find that command to execute.

Let's say we have helloworld program in bin folder. Using like this won't work:

$ helloworld
zsh: command not found: helloworld

$ bin/helloworld # path from the home directory to the executable file
# executes the file
Hello, World!

To make it easier, you can add bin to the PATH variable.

$ export PATH=$PATH:~/bin # extend the $PATH variable with bin, colon as separator

# now you can use helloworld from everywhere
$ helloworld
Hello, World!

Aliases

In macOS, the ls list does not show any colors. To do it, you have to use ls -G.

Or you can simply put alias:

$ alias ls="ls -G"
$ ls
# show files in colors

Community

Check out the documentations of bash and zsh.

Check out ohmyz.sh.