From 43f1aa5fab202b70ea091022088a70f2d042726c Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 26 Oct 2016 13:08:52 +0530 Subject: [PATCH 01/76] single column to multiple column examples for pr --- Text_Processing.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Text_Processing.md b/Text_Processing.md index 831fa2e..1ade3bd 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -757,3 +757,34 @@ Adding a line of text at end of file * Options include converting text files for printing with header, footer, page numbers, double space a file, combine multiple files column wise, etc * More examples [here](http://docstore.mik.ua/orelly/unix3/upt/ch21_15.htm) + +```bash +$ # single column to multiple column, split vertically +$ # for example, in command below, output of seq is split into two +$ seq 5 | pr -2t +1 4 +2 5 +3 + +$ # different output delimiter can be used by passing string to -s option +$ seq 5 | pr -2ts' ' +1 4 +2 5 +3 + +$ # use -a option to split across +$ seq 5 | pr -2ats' : ' +1 : 2 +3 : 4 +5 + +$ # use $ to expand characters denoted by escape characters like \t for tab +$ seq 5 | pr -3ts$'\t' +1 3 5 +2 4 + +$ # or leave the argument to -s empty as tab is default +$ seq 5 | pr -3ts +1 3 5 +2 4 +``` From 163717e3e78118b13148f6c2e800f1ff97e34749 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 26 Oct 2016 14:27:13 +0530 Subject: [PATCH 02/76] some more examples for paste and pr --- Text_Processing.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Text_Processing.md b/Text_Processing.md index 1ade3bd..2049651 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -717,6 +717,29 @@ For columns operations with well defined delimiters, `cut` command is handy * `paste -d':' list1.txt list2.txt list3.txt > combined_list.txt` the entries are separated by : character instead of TAB * [paste Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/paste?sort=votes&pageSize=15) +```bash +$ # one column to multiple column, denoted by number of - +$ seq 5 | paste - - +1 2 +3 4 +5 + +$ # specifying different output delimiter, default is tab +$ seq 5 | paste -d, - - +1,2 +3,4 +5, + +$ # if number of columns to specify is large, use the printf trick +$ seq 5 | paste $(printf -- "- %.s" {1..3}) +1 2 3 +4 5 + +$ # paste is quite useful to combine all input lines into single line +$ seq 10 | paste -sd, +1,2,3,4,5,6,7,8,9,10 +``` +
### column @@ -788,3 +811,28 @@ $ seq 5 | pr -3ts 1 3 5 2 4 ``` + +
+We can use a combination of different commands for complicated operations. For example, transposing a table + +```bash +$ tr ' ' '\n' < dishes.txt | pr -$(wc -l < dishes.txt)t +North South West East +alootikki appam dhokla handoguri +baati bisibelebath khakhra litti +khichdi dosa modak momo +makkiroti koottu shiro rosgulla +poha sevai vadapav shondesh +``` + +Notice how `pr` neatly arranges the columns. If spacing is too much, we can use `column` + +```bash +$ tr ' ' '\n' < dishes.txt | pr -$(wc -l < dishes.txt)ts | column -t +North South West East +alootikki appam dhokla handoguri +baati bisibelebath khakhra litti +khichdi dosa modak momo +makkiroti koottu shiro rosgulla +poha sevai vadapav shondesh +``` From 2297f3be94cecd6530885b33501a7831ced46c07 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 27 Oct 2016 09:55:36 +0530 Subject: [PATCH 03/76] column wise sort example with different delimiter --- Text_Processing.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Text_Processing.md b/Text_Processing.md index 2049651..6e2963a 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -33,6 +33,7 @@ As the name implies, this command is used to sort files. How about alphabetic so * `-k` sort via key * `-u` sort uniquely * `-b` ignore leading white-spaces of a line while sorting +* `-t` use SEP instead of non-blank to blank transition **Examples** @@ -42,6 +43,37 @@ As the name implies, this command is used to sort files. How about alphabetic so * `shuf crypto_keys.txt -o crypto_keys_random.txt` can also be used * `du -sh * | sort -h` sort file/directory sizes in current directory in human readable format +
+```bash +$ cat ip.txt +6.2 : 897 : bar +3.1 : 32 : foo +2.3 : 012 : bar +1.2 : 123 : xyz + +$ # -k3,3 means from 3rd column onwards to 3rd column +$ # for ex: to sort from 2nd column till end, use -k2 +$ sort -t: -k3,3 ip.txt +2.3 : 012 : bar +6.2 : 897 : bar +3.1 : 32 : foo +1.2 : 123 : xyz + +$ # -n option for numeric sort, check out what happens when -n is not used +$ sort -t: -k2,2n ip.txt +2.3 : 012 : bar +3.1 : 32 : foo +1.2 : 123 : xyz +6.2 : 897 : bar + +$ # more than one rule can be specified to resolve same values +$ sort -t: -k3,3 -k1,1rn ip.txt +6.2 : 897 : bar +2.3 : 012 : bar +3.1 : 32 : foo +1.2 : 123 : xyz +``` + **Further Reading** * [sort like a master](http://www.skorks.com/2010/05/sort-files-like-a-master-with-the-linux-sort-command-bash/) From 24e1b52dbd34b55474eefbb6b347f23ea9bc9a0b Mon Sep 17 00:00:00 2001 From: learnbyexample Date: Thu, 15 Dec 2016 10:38:43 +0530 Subject: [PATCH 04/76] formatting, added command options, improved descriptions --- Command_Line_Introduction.md | 39 ++++++----- Files_and_Directories.md | 13 +++- Linux_Introduction.md | 2 +- README.md | 2 +- Shell.md | 37 +++++++---- Shell_Customization.md | 7 +- Shell_Scripting.md | 16 ++--- Text_Processing.md | 8 +-- Working_with_Files_and_Directories.md | 95 ++++++++++++++++++++------- 9 files changed, 145 insertions(+), 74 deletions(-) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index d4c6f9c..4f0c4c4 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -10,10 +10,14 @@ For any thing that is repetitive or programmable, there likely is a relevant com Starting trouble with command line (for those accustomed to GUI) is the sudden trouble of interacting with the computer using just text commands. After using for a week or so, things will seem very systematic and GUI feels ill suited for frequent tasks. With continuous use, recalling various commands becomes easier. Short-cuts, history, aliases and tab-completion help in the process +If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into tiny screen and plethora of multi-purpose buttons. Commands and short-cuts pack much more punch than that on a terminal. + * Commands presented here are GNU/Linux specific and generally behave similarly across distros * Commands in GNU/Linux usually have a few different options and syntax than [POSIX](http://en.wikipedia.org/wiki/POSIX) specification - * check the `man` page of a command to see if it supports POSIX options + * `man` and `info` pages of commands come in handy * If any command is not found in a particular distro, either it has to be manually installed or not available for that distro +* The **bash** shell version 4+ is used throughout this material + * [rough overview of changes to Bash over time](http://wiki.bash-hackers.org/scripting/bashchanges)
### File System @@ -51,7 +55,7 @@ Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_ ### Command Line Interface Command Line Interface (CLI) allows us interact with computer using text commands -For example, opening a Terminal, typing `ls` and pressing **Enter** key - the `ls` command lists the contents of a directory. To do the same thing in GUI, you double-click on the directory to view its content +For example: opening a Terminal, typing `ls` and pressing **Enter** key - the `ls` command lists the contents of a directory. To do the same thing in GUI, you double-click on the directory to view its content Shell and Terminal are sometimes interchangeably used to mean the same thing - a prompt where user enters and executes commands. They are [quite different](https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con) @@ -59,14 +63,13 @@ Shell and Terminal are sometimes interchangeably used to mean the same thing - a * **Terminal** text input/output environment * `cat /etc/shells` to know which shells are available * `echo "$SHELL"` to know which is your login-shell -* The **bash** shell is used throughout this material, which is usually the default shell on most distros
### Command Help * `man man` get help about manual pages * usually displayed using `less` command, press `q` key to quit the man page and `h` key to get help - * for GNU/Linux commands, use the `info` command to get more detailed manual + * for GNU/Linux commands, the `info` command has more detailed documentation * `man bash` manual page for `bash` * `gvim <(man bash)` open the manual page in text editor instead of displaying in terminal * `man -k printf` search manual pages for `printf` @@ -75,7 +78,7 @@ Shell and Terminal are sometimes interchangeably used to mean the same thing - a * `type cd` cd is a shell builtin * `type sed` sed is /bin/sed * `type ls` ls is aliased to `ls --color=auto` -* Use `help` for builtin commands instead of `man` +* Use `help` for builtin commands * `help help` help page on `help` command * `help -m cd` display usage in pseudo-manpage format for `cd` command * `help -d compgen` use -d option to output short description for each topic @@ -85,10 +88,14 @@ Shell and Terminal are sometimes interchangeably used to mean the same thing - a * `whereis` locate the binary, source, and manual page files for a command * `whereis awk` awk: /usr/bin/awk /usr/bin/X11/awk /usr/share/awk /usr/share/man/man1/awk.1.gz * `history` Display or manipulate the history list -* [explainshell](http://explainshell.com/) write down a command-line to see the help text that matches each argument - * example: [find . -type f -print0](http://explainshell.com/explain?cmd=find%20.%20-type%20f%20-print0) -Excellent resource: [How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) +**Further Reading** + +* Excellent resource: [How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) +* [explainshell](http://explainshell.com/) write down a command line to see the help text that matches each argument + * example: [find . -type f -print0](http://explainshell.com/explain?cmd=find%20.%20-type%20f%20-print0) + * [ch](https://github.com/learnbyexample/command_help) similar functionality from command line, doesn't have all features of explainshell though +* [which, whatis, whereis examples](http://www.thegeekstuff.com/2013/04/linux-which-whatis-whereis/)
### Do one thing and do it well @@ -134,7 +141,7 @@ single quotes vs double quotes Example: -``` +```bash $ echo '$SHELL' $SHELL $ echo "$SHELL" @@ -148,8 +155,8 @@ Redirecting output of a command * to another command * `du -sh * | sort -h` calculate size of files/folders, display size in human-readable format which is then sorted * to a file (instead of displaying on terminal) - * `ls *.txt > text_files.list` writes/overwrites to file - * `ls *.txt >> text_files.list` appends to file + * `grep -i 'pass' *.log > pass_list.txt` writes/overwrites to file + * `grep -i 'error' *.log >> errors.txt` appends to file Redirecting input @@ -167,17 +174,17 @@ Combining output of several commands * `(head -5 ~/.vimrc ; tail -5 ~/.vimrc) > vimrc_snippet.txt` multiple commands can be grouped in `()` and redirected as if single command output -Substituting output of command in a string +Command substitution -* `sed -i -r "s/(.*)/$(basename $PWD)\/\1/" dir_list.txt` add current directory name and forward-slash character at the start of every line +* `sed -i "s|^|$(basename $PWD)/|" dir_list.txt` add current directory path and forward-slash character at the start of every line * Note the use of double quotes -More detailed discussion in [Shell](./Shell.md) chapter - -**stdin, stdout and stderr** +stdin, stdout and stderr * `<` or `0<` is stdin filehandle * `>` or `1>` is stdout filehandle * `2>` is stderr filehandle * [read more](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) +More detailed discussion in [Shell](./Shell.md) chapter + diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 637bdc4..f5befce 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -41,6 +41,7 @@ Apart from knowing your current working directory, often used to copy the absolu **Options** * `-a` list hidden files also +* `-A` like `-a` but excluding `.` and `..` * `-1` list in single column (number one, not lowercase of letter L) * `-l` list contents with extra details about the files (lowercase of letter L, not number one) * `-h` display file sizes in human readable format @@ -50,6 +51,7 @@ Apart from knowing your current working directory, often used to copy the absolu * `-S` sort by file size * directory is treated as file and doesn’t display actual size used by directory, use `du` command if directory size is also needed * `-d` list directory entries instead of contents +* `-q` prints ? instead of non-graphic characters like `\n` (Linux file names can use any character other than `/` and null character) * `-F` Append a character to each file name indicating the file type (other than regular files) * `/` for directories * `*` for executable files @@ -68,13 +70,15 @@ Apart from knowing your current working directory, often used to copy the absolu * `ls -ltr` list files of current directory with details sorted such that latest created/modified file is displayed last * [ls Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ls?sort=votes&pageSize=15) * [ls Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ls?sort=votes&pageSize=15) +* [avoid parsing output of ls](http://mywiki.wooledge.org/ParsingLs) +* [why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls)
### cd >Change the shell working directory -``` +```bash $ whatis cd cd: nothing appropriate. $ type cd @@ -157,6 +161,7 @@ The destination path is always specified as the last argument. More than one sou * `-r` copy recursively, used for copying directories * `-i` prompt before overwriting +* `-u` copy files only if newer than existing file in destination location or if file doesn't exist in destination **Examples** @@ -199,10 +204,12 @@ The destination path is always specified as the last argument. More than one sou >renames multiple files +Note: The `perl` based `rename` is presented here and different from [util-linux-ng version](https://linux.die.net/man/1/rename). Check `man rename` for details + **Options** * `-f` overwrite existing files -* `-n` show matching input files without actually renaming them +* `-n` dry run without actually renaming files **Examples** @@ -215,7 +222,7 @@ The destination path is always specified as the last argument. More than one sou >make links between files -Create hard or soft link of file or folder. Soft link is similar to short-cuts created in Windows. Hard link is like same file with different name, same timestamp and permissions of original file. Hard links can be moved to another directory after creation, will still have content even when original file is deleted. On the other hand, soft links have their own timestamps and permissions, it cannot be moved to another folder unless the link creation was done using full path and of course becomes a dead link when original file is deleted. More differences [here](http://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) +Create hard or soft link of file or folder. Soft link is similar to short-cuts created in Windows. Hard link is like same file with different name, same timestamp and permissions of original file. Hard links can be moved to another directory after creation, will still have content even when original file is deleted. On the other hand, soft links have their own timestamps and permissions, it cannot be moved to another folder unless the link creation was done using full path and of course becomes a dead link when original file is deleted. More differences [here](https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) **Examples** diff --git a/Linux_Introduction.md b/Linux_Introduction.md index 3cc665b..28dce2f 100644 --- a/Linux_Introduction.md +++ b/Linux_Introduction.md @@ -11,7 +11,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) -> Linux is a Unix-like and mostly POSIX-compliant computer operating system (OS) assembled under the model of free and open-source software development and distribution. The defining component of Linux is the Linux kernel an operating system kernel first released on 5 October 1991 by Linus Torvalds. The Free Software Foundation uses the name GNU/Linux to describe the operating system +> Linux is a Unix-like and mostly POSIX-compliant computer operating system (OS) assembled under the model of free and open-source software development and distribution. The defining component of Linux is the Linux kernel an operating system kernel first released on 5 October 1991 by Linus Torvalds. The Free Software Foundation uses the name **GNU/Linux** to describe the operating system
### Why use Linux? diff --git a/README.md b/README.md index c56e105..6c18c80 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Introduction to Linux commands and Shell scripting * [Files and Directories](./Files_and_Directories.md) * pwd, clear, ls, cd, mkdir, touch, rm, cp, mv, rename, ln, tar and gzip * [Working with Files and Directories](./Working_with_Files_and_Directories.md) - * cat, less, tail, head, Text Editors, grep, find, locate, wc, du, df, touch, file, identify, basename, chmod + * cat, less, tail, head, Text Editors, grep, find, locate, wc, du, df, touch, file, identify, basename, dirname, chmod * [Text Processing](./Text_Processing.md) * sort, uniq, comm, cmp, diff, tr, sed, awk, perl, cut, paste, column, pr * [Shell](./Shell.md) diff --git a/Shell.md b/Shell.md index be49bb9..88a7317 100644 --- a/Shell.md +++ b/Shell.md @@ -116,14 +116,14 @@ By default all results of a command are displayed on the terminal, which is the **Redirecting output of a command to another command** -* `ls -l | grep '^d'` the 'pipe' operator redirects standard output of `ls` command to `grep` command as standard input +* `ls -q | wc -l` the 'pipe' operator redirects stdout of `ls` command to `wc` command as stdin * `du -sh * | sort -h` calculate size of files/folders, display size in human-readable format which is then sorted * `./script.sh | tee output.log` the `tee` command displays standard output on terminal as well as writes to file **Combining output of several commands** * `(head -5 ~/.vimrc ; tail -5 ~/.vimrc) > vimrc_snippet.txt` multiple commands can be grouped in `()` and redirected as if single command output - * commands grouped in () gets executed in a subshell environment + * commands grouped in `()` gets executed in a subshell environment * `{ head -5 ~/.vimrc ; tail -5 ~/.vimrc ; } > vimrc_snippet.txt` gets executed in current shell context * [Command grouping](http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping) @@ -148,22 +148,28 @@ By default all results of a command are displayed on the terminal, which is the **Combining stdout and stderr** -* `grep 'test' report.log test_list.txt &> grep_test.txt` redirect both stdout and stderr to a file -* `./script.sh &> /dev/null` discard output and error messages -* `grep 'test' report.log test_list.txt &>> grep_test.txt` append both stdout and stderr to a file -* [redirect a stream to another file descriptor using >&](https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean) - * `1>&2` redirect stdout to stderr - * `2>&1` redirect stderr to stdout -* [difference between 2>&1 >foo and >foo 2>&1](http://mywiki.wooledge.org/BashFAQ/055) -* [redirect and append both stdout and stderr to a file](https://stackoverflow.com/questions/876239/how-can-i-redirect-and-append-both-stdout-and-stderr-to-a-file-with-bash) +Assume that the file 'report.log' exists containing the text 'test' and non-existing file 'xyz.txt' + +Bash version 4+: + +* `grep 'test' report.log xyz.txt &> cmb_out.txt` redirect both stdout and stderr to a file +* `grep 'test' report.log xyz.txt &>> cmb_out.txt` append both stdout and stderr to a file +* `ls report.log xyz.txt |& grep '[st]'` redirect both stdout and stderr as stdin + +Earlier versions: + +* `grep 'test' report.log xyz.txt > cmb_out.txt 2>&1` redirect both stdout and stderr to a file +* `grep 'test' report.log xyz.txt 2> cmb_out.txt 1>&2` redirect both stdout and stderr to a file +* `grep 'test' report.log xyz.txt >> cmb_out.txt 2>&1` append both stdout and stderr to a file +* `ls report.log xyz.txt 2>&1 | grep '[st]'` redirect both stdout and stderr as stdin **Redirecting input** -* `tr a-z A-Z < test_list.txt` convert lowercase to uppercase, `tr` command only reads from `stdin` and doesn't have the ability to read from a file directly - * `cat test_list.txt | tr a-z A-Z` can also be used -* `wc < report.log` fancy way to avoid filename in `wc` output +* `tr a-z A-Z < test_list.txt` convert lowercase to uppercase, `tr` command only reads from stdin and doesn't have the ability to read from a file directly +* `wc < report.log` useful to avoid filename in `wc` output +* `< report.log grep 'test'` useful to easily modify previous command for different command options, search patterns, etc * `grep 'test' report.log | diff - test_list.txt` output of `grep` as one of the input file for `diff` command -* [difference between << , <<< and < <](http://askubuntu.com/questions/678915/whats-the-difference-between-and-in-bash) +* [difference between << , <<< and < <](https://askubuntu.com/questions/678915/whats-the-difference-between-and-in-bash) **Using xargs to redirect output of command as input to another command** @@ -178,6 +184,9 @@ By default all results of a command are displayed on the terminal, which is the * [stdin, stdout and stderr](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) * [Illustrated Redirection Tutorial](http://wiki.bash-hackers.org/howto/redirection_tutorial) * [short introduction](http://mywiki.wooledge.org/BashGuide/InputAndOutput#Redirection) +* [redirect a stream to another file descriptor using >&](https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean) +* [difference between 2>&1 >foo and >foo 2>&1](http://mywiki.wooledge.org/BashFAQ/055) +* [redirect and append both stdout and stderr to a file](https://stackoverflow.com/questions/876239/how-can-i-redirect-and-append-both-stdout-and-stderr-to-a-file-with-bash) * [Redirections explained](http://www.catonmat.net/blog/bash-one-liners-explained-part-three/)
diff --git a/Shell_Customization.md b/Shell_Customization.md index 78eed09..2a7b0e6 100644 --- a/Shell_Customization.md +++ b/Shell_Customization.md @@ -22,6 +22,7 @@ Some example Variables: * `HOME` The home directory of the current user; the default argument for the `cd` builtin command. The value of this variable is also used when performing tilde expansion * `SHELL` The full pathname to the shell is kept in this environment variable. If it is not set when the shell starts, bash assigns to it the full pathname of the current user's login shell * `PATH` The search path for commands. It is a colon-separated list of directories in which the shell looks for commands. A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin` +* `PWD` and `OLDPWD` full path of current working directory and previous working directory * `HISTFILESIZE,HISTSIZE,HISTCONTROL,HISTFILE` command history related variables * `PS1` The value of this parameter is expanded and used as the primary prompt string. The default value is `\s-\v\$ ` * `printenv` command to display names and values of Environment variables @@ -33,7 +34,7 @@ Some example Variables: User can define variables as well - for temporary use, in shell script, etc. Using lowercase is preferred to avoid potential conflict with shell or environment variables -``` +```bash $ #array of 8-bit binary numbers in ascending order $ dec2bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) $ echo "${dec2bin[2]}" @@ -141,8 +142,8 @@ Before creating an alias or function, use `type alias_name` to check if an exist * `ch() { man $1 | sed -n "/^\s*$2/,/^$/p" ; }` simple command help (ch) function to get information on a command option * for example: `ch ls -F` , `ch grep -o` , etc * `ch() { whatis $1; man $1 | sed -n "/^\s*$2/,/^$/p" ; }` also prints description of command - * [explain](http://www.tecmint.com/explain-shell-commands-in-the-linux-shell/) command does a much better job - * [explainshell](http://explainshell.com/) does similarly online + * [ch](https://github.com/learnbyexample/command_help) does a much better job with capability to handle multiple options, multiple arguments, builtin commands, etc + * [explainshell](http://explainshell.com/) does even better * `o() { gnome-open "$@" &> /dev/null ; }` open files with their default applications, discards output and error messages * for example: `o bashguide.pdf` * `$1` first positional argument diff --git a/Shell_Scripting.md b/Shell_Scripting.md index 8a255ad..08e16b5 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -66,7 +66,7 @@ Single quotes vs Double quotes * `-E` explicitly suppress interpretation of backslash escapes * [echo Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/echo?sort=votes&pageSize=15) -``` +```bash $ chmod +x hello_script.sh $ ./hello_world.sh Hello learnbyexample @@ -94,7 +94,7 @@ echo "No of lines in '$2' is $(wc -l < "$2")" * [why does my shell script choke on whitespace or other special characters?](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters) * [bash special parameters reference](https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables/5163260#5163260) -``` +```bash $ ./command_line_arguments.sh hello_script.sh test\ file.txt No of lines in 'hello_script.sh' is 9 No of lines in 'test file.txt' is 5 @@ -145,7 +145,7 @@ echo 'Thank you for using the script, Have a nice day :)' * `-s` do not echo input coming from a terminal * [More examples with read and getting input from stdin](http://ryanstutorials.net/bash-scripting-tutorial/bash-input.php) -``` +```bash $ ./user_input.sh Hi there! This script returns the sum of two numbers Enter two numbers separated by spaces: 7 42 @@ -189,7 +189,7 @@ fi * [Control Operators && and ||](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators_.28.26.26_and_.7C.7C.29) * [More examples for if conditional block](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29) -``` +```bash $ ./if_then_else.sh Error!! Please provide two file names $ echo $? @@ -243,7 +243,7 @@ echo "Total Number of lines = $total_lines" * This form of `for` loop is useful if we need only element of an array, without having to iterate over length of an array and using an index for each iteration to get array elements * In this example we use the control operator `||` to stop the script if `wc` fails i.e 'exit status' other than `0` -``` +```bash $ ./for_loop.sh Error!! Please provide atleast one file name $ echo $? @@ -297,7 +297,7 @@ done * Use `while` when you need to execute commands according to a specified condition -``` +```bash $ ./while_loop.sh 5 4 @@ -313,7 +313,7 @@ $ ./while_loop.sh * `-v` verbose option, print shell input lines as they are read * `set -xv` use this command to enable debugging from within script itself -``` +```bash $ bash -x hello_script.sh + echo 'Hello learnbyexample' Hello learnbyexample @@ -324,7 +324,7 @@ Today is Friday Have a nice day ``` -``` +```bash $ bash -xv hello_script.sh #!/bin/bash diff --git a/Text_Processing.md b/Text_Processing.md index 6e2963a..a0c7c7e 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -133,11 +133,9 @@ Useful to compare binary files. If the two files are same, no output is displaye If there is a difference, it prints the first difference - line number and byte location (exit status 1) Option `-s` allows to suppress the output, useful in scripts -``` +```bash $ cmp /bin/grep /bin/fgrep /bin/grep /bin/fgrep differ: byte 25, line 1 - -$ # note: some distros might have same binary for grep/egrep/fgrep ``` * More examples [here](http://www.sanfoundry.com/5-cmp-command-usage-examples-linux/) @@ -777,7 +775,7 @@ $ seq 10 | paste -sd, >columnate lists -``` +```bash $ cat dishes.txt North alootikki baati khichdi makkiroti poha South appam bisibelebath dosa koottu sevai @@ -798,7 +796,7 @@ East handoguri litti momo rosgulla shondesh >convert text files for printing -``` +```bash $ pr sample.txt diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index cb4b5f0..282c707 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -15,6 +15,7 @@ * [file](#file) * [identify](#identify) * [basename](#basename) +* [dirname](#dirname) * [chmod](#chmod) In this chapter, we will see how to display contents of a file, search within files, search for files, get file properties and information, what are the permissions for files/directories and how to change them to our requirements @@ -28,6 +29,8 @@ In this chapter, we will see how to display contents of a file, search within fi * `-n` number output lines * `-s` squeeze repeated empty lines into single empty line +* `-e` show non-printing characters and end of line +* `-A` in addition to `-e`, also shows tab characters **Examples** @@ -39,7 +42,7 @@ In this chapter, we will see how to display contents of a file, search within fi * [cat Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cat?sort=votes&pageSize=15) * [cat Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cat?sort=votes&pageSize=15) -``` +```bash $ cat > sample.txt This is an example of adding text to a new file using cat command. Press Ctrl+d on a newline to save and quit. @@ -68,9 +71,10 @@ This is an example of adding text to a new file using cat command. * `g` go to start of file * `G` go to end of file * `q` quit -* `/pattern` search for the given pattern -* `n` go to next pattern in forward direction -* `N` go to next pattern in backward direction +* `/pattern` search for the given pattern in forward direction +* `?pattern` search for the given pattern in backward direction +* `n` go to next pattern +* `N` go to previous pattern * `h` help **Example and Further Reading** @@ -133,37 +137,45 @@ Powerful text editors >print lines matching a pattern -`grep` stands for **Global Regular Expression Print**. Used to search for a pattern in given files - whether a particular word or pattern is present (or not present), name of files containing the pattern, etc. By default, matching is performed any part of a line, options and regular expressions can be used to match only the desired part +`grep` stands for **Global Regular Expression Print**. Used to search for a pattern in given files - whether a particular word or pattern is present (or not present), name of files containing the pattern, etc. By default, matching is performed in any part of a line, options and regular expressions can be used to match only the desired part **Options** -* `--color=auto` display the matched pattern, file names, line numbers etc with color +* `--color=auto` display the matched pattern, file names, line numbers etc with color distinction * `-i` ignore case while matching * `-v` print non-matching lines, i.e it inverts the selection -* `-r` recursively search all files in specified folders * `-n` print also line numbers of matched pattern * `-c` display only the count of number of lines matching the pattern * `-l` print only the filenames with matching pattern * `-L` print filenames NOT matching the pattern * `-w` match pattern against whole word * `-x` match pattern against whole line +* `-F` interpret pattern to search as fixed string (i.e not a regular expression). Faster as well * `-o` print only matching parts * `-A number` print matching line and 'number' of lines after the matched line * `-B number` print matching line and 'number' of lines before the matched line * `-C number` print matching line and 'number' of lines before and after the matched line * `-m number` restrict printing to upper limit of matched lines specified by 'number' +* `-q` no standard output, quit immediately if match found. Useful in scripts to check if a file contains search pattern or not +* `-s` suppress error messages if file doesn't exist or not readable. Again, more useful in scripts +* `-r` recursively search all files in specified folders +* `-h` do not prefix filename for matching lines (default behavior for single file search) +* `-H` prefix filename for matching lines (default behavior for multiple file search) **Examples** * `grep 'area' report.log` will print all lines containing the word area in report.log * `grep 'adder power' report.log` will print lines containing adder power * `man grep | grep -i -A 5 'exit status'` will print matched line and 5 lines after containing the words 'exit status' independent of case + * See **Context Line Control** topic in `info grep` for related options like `--no-group-separator` * `grep -m 5 'error' report.log` will print maximum of 5 lines containing the word error * `grep "$HOME" /etc/passwd` will print lines matching the value of environment variable HOME * Note the use of double quotes for variable substitution * `grep -w 'or' story.txt` match whole word or, not part of word like for, thorn etc * `grep -x 'power' test_list.txt` match whole line containing the pattern power +*Note:* All of the above examples would be suited for `-F` option as these do not use regular expressions and will be faster with `-F` option + **Regular Expressions** Regular Expressions help in defining precise patterns, like extracting only alphabets or numbers, matching at start of line, end of line, character sequence, etc @@ -216,18 +228,19 @@ Paraphrasing from `info grep` **Examples** -* `grep -i '[a-z]' report.log` will print all lines having atleast one alphabet +* `grep -i '[a-z]' report.log` will print all lines having atleast one alphabet character * `grep '[0-9]' report.log` will print all lines having atleast one number * `grep 'area\|power' report.log` will match lines containing area or power * `grep -E 'area|power' report.log` will match lines containing area or power * `grep -E 'hand(y|ful)' short_story.txt` match handy or handful -* `grep -E '(Th|)is' short_story.txt` match This or is -* `grep -iE '([a-z])\1' short_story.txt` match same alphabet appearing consecutively like 'aa', 'oo', 'EE' etc +* `grep -E '(Th)?is' short_story.txt` match This or is +* `grep -iE '([a-z])\1' short_story.txt` match same alphabet appearing consecutively like 'aa', 'FF', 'Ee' etc **Perl Compatible Regular Expression** * `grep -P '\d' report.log` will print all lines having atleast one number -* `grep -P '(Th|)is' short_story.txt` match This or is +* `grep -P '(Th)?is' short_story.txt` match This or is +* `grep -oP 'file\K\d+' report.log` print only digits that are preceded by the string 'file' * `man pcrepattern` syntax and semantics of the regular expressions that are supported by PCRE * [look-around assertions example](https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match) @@ -264,10 +277,21 @@ Filtering based on file type * `find /home/guest1/proj -type d` print path of all directories found in specified directory * `find /home/guest1/proj -type f -name '.*'` print path of all hidden files +Filtering based on depth + +The relative path `.` is considered as depth 0 directory, files and folders immediately contained in a directory are at depth 1 and so on + +* `find -maxdepth 1 -type f` all regular files (including hidden ones) from current directory (without going to sub-directories) +* `find -maxdepth 1 -type f -name '[!.]*'` all regular files (but not hidden ones) from current directory (without going to sub-directories) + * `-not -name '.*'` can be also used +* `find -mindepth 1 -maxdepth 1 -type d` all directories (including hidden ones) in current directory (without going to sub-directories) + Filtering based on file properties * `find -mtime -2` print files that were modified within last two days in current directory + * Note that day here means 24 hours * `find -mtime +7` print files that were modified more than seven days back in current directory +* `find -daystart -type f -mtime -1` files that were modified from beginning of day (not past 24 hours) * `find -size +10k` print files with size greater than 10 kilobytes in current directory * `find -size -1M` print files with size less than 1 megabytes in current directory * `find -size 2G` print files of size 2 gigabytes in current directory @@ -280,22 +304,27 @@ Passing filtered files as input to other commands * `find report -name '*log*' -delete` delete all filenames containing log in report folder and its sub-folders * `find -name '*.txt' -exec wc {} +` list of files ending with txt are all passed together as argument to `wc` command instead of executing wc command for every file * no need to use escape the `+` character in this case -* `find -name '*.log' -exec mv {} ../log/ \;` move files ending with .log to log directory present in one hierarchy above + * also note that number of invocations of command specified is not necessarily once if number of files found is too large +* `find -name '*.log' -exec mv {} ../log/ \;` move files ending with .log to log directory present in one hierarchy above. `mv` is executed once per each filtered file +* `find -name '*.log' -exec mv -t ../log/ {} +` the `-t` option allows to specify target directory and then provide multiple files to be moved as argument + * Similarly, one can use `-t` for `cp` command **Further Reading** * [using find](http://mywiki.wooledge.org/UsingFind) +* [find examples on SO](https://stackoverflow.com/documentation/bash/566/find#t=201612140534548263961) * [Collection of find examples](http://alvinalexander.com/unix/edu/examples/find.shtml) * [find Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/find?sort=votes&pageSize=15) * [find and tar example](https://unix.stackexchange.com/questions/282762/find-mtime-1-print-xargs-tar-archives-all-files-from-directory-ignoring-t/282885#282885) * [find Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/find?sort=votes&pageSize=15) +* [Why is looping over find's output bad practice?](https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-output-bad-practice)
### locate >find files by name -Faster alternative to `find` command when searching for a file by its name. It is based on a database (usually by `updatedb(8)`), which gets updated by a `cron` job. So, newer files may be not present in results. Use this command if it is available in your distro and you remember some part of filename created a day or more ago. Very useful if one has to search entire filesystem in which case `find` command might take a very long time compared to `locate` +Faster alternative to `find` command when searching for a file by its name. It is based on a database, which gets updated by a `cron` job. So, newer files may be not present in results. Use this command if it is available in your distro and you remember some part of filename. Very useful if one has to search entire filesystem in which case `find` command might take a very long time compared to `locate` **Examples** @@ -329,7 +358,7 @@ Faster alternative to `find` command when searching for a file by its name. It i >estimate file space usage -* du command is useful for small folders, not for large ones or file systems. +* du command is useful to get size of files and folders, not for file systems **Examples** @@ -368,7 +397,11 @@ Used to change file time stamps. But if file doesn't exist, the command will cre **Examples** * `touch new_file.txt` create an empty file if it doesn't exist in current directory + * use `-c` if new file shouldn't be created + * use `-a` option to change only access time and `-m` to change only modification time * `touch report.log` change the time stamp of report.log to current time (assuming report.log already exists in current directory) +* `touch -r power.log report.log` use time stamp of power.log instead of current time to change that of report.log + * use `-d` to provide time stamp from a string instead of file * [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15)
@@ -378,7 +411,7 @@ Used to change file time stamps. But if file doesn't exist, the command will cre **Examples** -``` +```bash $ file sample.txt sample.txt: ASCII text @@ -400,7 +433,7 @@ perl.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced Although file command can also give information like pixel dimensions and image type, identify is more reliable command for images and gives complete format information -``` +```bash $ identify sunset.jpg sunset.jpg JPEG 740x740 740x740+0+0 8-bit DirectClass 110KB 0.000u 0:00.030 @@ -413,7 +446,7 @@ perl.png PNG 32x32 32x32+0+0 8-bit DirectClass 838B 0.000u 0:00.000 >strip directory and suffix from filenames -``` +```bash $ pwd /home/learnbyexample @@ -428,12 +461,28 @@ $ basename -s '.log' '/home/learnbyexample/proj_adder/power.log' power ``` +
+### dirname + +>strip last component from file name + +```bash +$ pwd +/home/learnbyexample + +$ dirname $PWD +/home + +$ dirname '/home/learnbyexample/proj_adder/power.log' +/home/learnbyexample/proj_adder +``` +
### chmod >change file mode bits -``` +```bash $ ls -l sample.txt -rw-rw-r-- 1 learnbyexample learnbyexample 111 May 25 14:47 sample.txt ``` @@ -466,7 +515,7 @@ We'll be seeing only `rwx` file properties in this section, for other types of p **File Permissions** -``` +```bash $ pwd /home/learnbyexample/linux_tutorial $ ls -lF @@ -515,7 +564,7 @@ bash: sample.txt: Permission denied **Directory Permissions** -``` +```bash $ ls -ld linux_tutorial/ drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ @@ -555,7 +604,7 @@ hello_world.pl new_file.txt sample.txt **Changing multiple permissions at once** -``` +```bash $ # r(4) + w(2) + 0 = 6 $ # r(4) + 0 + 0 = 4 $ chmod 664 sample.txt @@ -575,7 +624,7 @@ drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 14:01 report/ **Changing single permission selectively** -``` +```bash $ chmod o-r sample.txt $ ls -lF sample.txt -rw-rw---- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt @@ -591,7 +640,7 @@ $ ls -lF hello_world.pl **Recursively changing permission for directory** -``` +```bash $ ls -lR linux_tutorial/ linux_tutorial/: total 12 From 8cabbb734788b9983a9882cbea4b04be7bea4983 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 22 Dec 2016 20:00:37 +0530 Subject: [PATCH 05/76] better examples --- Shell.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Shell.md b/Shell.md index 88a7317..9070168 100644 --- a/Shell.md +++ b/Shell.md @@ -109,8 +109,8 @@ By default all results of a command are displayed on the terminal, which is the **Redirecting output of a command to a file** -* `grep -i error report/*.log > error.log` create new file, overwrite if file already exists -* `grep -i fail test_results_20mar2015.log >> all_fail_tests.log` creates new file if file doesn’t exist, otherwise append the result to existing file +* `grep -i 'error' report/*.log > error.log` create new file, overwrite if file already exists +* `grep -i 'fail' test_results_20mar2015.log >> all_fail_tests.log` creates new file if file doesn’t exist, otherwise append the result to existing file * `./script.sh > /dev/null` redirect output to a special file `/dev/null` that just discards everything written to it, whatever may be the size * [explicitly override the setting of noclobber with the >| redirection operator](https://unix.stackexchange.com/questions/45201/bash-what-does-do/45203#45203) @@ -127,15 +127,14 @@ By default all results of a command are displayed on the terminal, which is the * `{ head -5 ~/.vimrc ; tail -5 ~/.vimrc ; } > vimrc_snippet.txt` gets executed in current shell context * [Command grouping](http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping) -**Substituting output of command** +**Command substitution** -* `sed -i -r "s/(.*)/$(basename $PWD)\/\1/" dir_list.txt` add current directory name and forward-slash character at the start of every line +* `sed -i "s|^|$(basename $PWD)/|" dir_list.txt` add current directory path and forward-slash character at the start of every line * Note the use of double quotes to perform command substitution -* `rm -r $(cat remove_files.txt)` remove all files/folders mentioned in remove_files.txt * `gvim "$(ls -t *.txt | head -1)"` open the latest modified file ending with txt in current directory * [Command Substitution](http://mywiki.wooledge.org/CommandSubstitution) -**Process Substitution - redirecting output of command as file** +**Process Substitution** * `comm -23 <(sort file1.txt) <(sort file2.txt)` allows to create named pipes, effectively avoiding need to create temporary files * [Process Substitution](http://wiki.bash-hackers.org/syntax/expansion/proc_subst) @@ -173,8 +172,8 @@ Earlier versions: **Using xargs to redirect output of command as input to another command** -* `cat dir_list.txt | xargs mkdir` create directories listed in dir_list.txt file - * enclose directory name in single quotes if it contains special characters like space +* `grep -rlZ 'pattern' | xargs -0 sed -i 's/pattern/replace/'` search and replace only those files matching the required pattern (Note: search pattern could be different for `grep` and `sed` as per requirement) + * the `-Z` option would print filename separated by **ASCII NUL character** which is in turn understood by `xargs` via the `-0` option. This ensures the command won't break on filenames containing characters like spaces, newlines, etc * [When to use xargs](https://unix.stackexchange.com/questions/24954/when-is-xargs-needed) * has a good example for [parallel processing jobs with xargs](https://unix.stackexchange.com/questions/24954/when-is-xargs-needed/24979#24979) From 8b6f7b9060a7f25c0c9d9ab00170c0c2ee0109ca Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 4 Jan 2017 11:53:42 +0530 Subject: [PATCH 06/76] more examples for pr and paste --- Text_Processing.md | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/Text_Processing.md b/Text_Processing.md index a0c7c7e..1197f84 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -748,7 +748,24 @@ For columns operations with well defined delimiters, `cut` command is handy * [paste Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/paste?sort=votes&pageSize=15) ```bash -$ # one column to multiple column, denoted by number of - +$ # joining multiple files +$ paste -d, <(seq 5) <(seq 6 10) +1,6 +2,7 +3,8 +4,9 +5,10 + +$ paste -d, <(seq 3) <(seq 4 6) <(seq 7 10) +1,4,7 +2,5,8 +3,6,9 +,,10 +``` + +* Single column to multiple columns + +```bash $ seq 5 | paste - - 1 2 3 4 @@ -764,10 +781,17 @@ $ # if number of columns to specify is large, use the printf trick $ seq 5 | paste $(printf -- "- %.s" {1..3}) 1 2 3 4 5 +``` + +* Combine all lines to single line -$ # paste is quite useful to combine all input lines into single line +```bash $ seq 10 | paste -sd, 1,2,3,4,5,6,7,8,9,10 + +$ # for multiple character delimiter, perl can be used +$ seq 10 | perl -pe 's/\n/ : / if(!eof)' +1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 ```
@@ -825,12 +849,22 @@ $ seq 5 | pr -2ts' ' 2 5 3 +$ seq 15 | pr -5ts, +1,4,7,10,13 +2,5,8,11,14 +3,6,9,12,15 + $ # use -a option to split across $ seq 5 | pr -2ats' : ' 1 : 2 3 : 4 5 +$ seq 15 | pr -5ats, +1,2,3,4,5 +6,7,8,9,10 +11,12,13,14,15 + $ # use $ to expand characters denoted by escape characters like \t for tab $ seq 5 | pr -3ts$'\t' 1 3 5 @@ -842,6 +876,31 @@ $ seq 5 | pr -3ts 2 4 ``` +* The default PAGE_WIDTH is 72 +* The formula `(col-1)*len(delimiter) + col` seems to work in determining minimum PAGE_WIDTH required for multiple column output +* The `-J` option will help in turning off line truncation + +```bash +$ seq 74 | pr -36ats, +1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36 +37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72 +73,74 +$ seq 74 | pr -37ats, +pr: page width too narrow + +$ # (37-1)*1 + 37 = 73 +$ seq 74 | pr -Jw 73 -37ats, +1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37 +38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74 + +$ # (3-1)*4 + 3 = 11 +$ seq 6 | pr -Jw 10 -3ats'::::' +pr: page width too narrow +$ seq 6 | pr -Jw 11 -3ats'::::' +1::::2::::3 +4::::5::::6 +``` +
We can use a combination of different commands for complicated operations. For example, transposing a table From 8b2c524891f2e4c33b7924a212a5954e2a8acfa2 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 4 Jan 2017 12:13:09 +0530 Subject: [PATCH 07/76] formatting and example for pr -m --- Text_Processing.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Text_Processing.md b/Text_Processing.md index 1197f84..c28f092 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -745,6 +745,7 @@ For columns operations with well defined delimiters, `cut` command is handy * `paste list1.txt list2.txt list3.txt > combined_list.txt` combines the three files column-wise into single file, the entries separated by TAB character * `paste -d':' list1.txt list2.txt list3.txt > combined_list.txt` the entries are separated by : character instead of TAB + * See [pr](#pr) command for multiple character delimiter * [paste Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/paste?sort=votes&pageSize=15) ```bash @@ -853,8 +854,11 @@ $ seq 15 | pr -5ts, 1,4,7,10,13 2,5,8,11,14 3,6,9,12,15 +``` + +* Use `-a` option to split across -$ # use -a option to split across +```bash $ seq 5 | pr -2ats' : ' 1 : 2 3 : 4 @@ -901,6 +905,15 @@ $ seq 6 | pr -Jw 11 -3ats'::::' 4::::5::::6 ``` +* Use `-m` option to combine multiple files in parallel + +```bash +$ pr -mts', ' <(seq 3) <(seq 4 6) <(seq 7 9) +1, 4, 7 +2, 5, 8 +3, 6, 9 +``` +
We can use a combination of different commands for complicated operations. For example, transposing a table From f201f637a65dc730652f3a0207e813e61bb7577f Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 10 Jan 2017 13:24:30 +0530 Subject: [PATCH 08/76] Acknowledgements section --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c18c80..69b501e 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,9 @@ Introduction to Linux commands and Shell scripting * Download ebook for offline reading - [link](https://www.gitbook.com/book/learnbyexample/linux-command-line/details)
-# Credits +# Acknowledgements +* [unix.stackexchange](http://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions * [Devs and Hackers](http://slack.devup.in/) - helpful slack group * [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique From f448cbcda8d6c8c7e29618a9823af7bdbbf5884f Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 10 Jan 2017 15:55:35 +0530 Subject: [PATCH 09/76] formatting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69b501e..3aee635 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Introduction to Linux commands and Shell scripting
# Acknowledgements -* [unix.stackexchange](http://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions +* [unix.stackexchange](https://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions * [Devs and Hackers](http://slack.devup.in/) - helpful slack group * [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique From ee1e95fca4ebdae3022ca046f63f6d612537fee1 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 24 Jan 2017 16:42:50 +0530 Subject: [PATCH 10/76] illustrated sed examples, sort -V option --- Text_Processing.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/Text_Processing.md b/Text_Processing.md index c28f092..d308161 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -29,6 +29,7 @@ As the name implies, this command is used to sort files. How about alphabetic so * `-r` reverse the sort order * `-o` redirect sorted result to specified filename, very useful to sort a file inplace * `-n` sort numerically +* `-V` version sort, aware of numbers within text * `-h` sort human readable numbers like 4K, 3M, etc * `-k` sort via key * `-u` sort uniquely @@ -275,6 +276,81 @@ By default, `sed` acts on all of input contents. This can be refined to specific * Any character other than backslash or newline can be used as delimiter, for example `| # ^` [see this link for more info](https://stackoverflow.com/questions/33914360/what-delimiters-can-you-use-in-sed) * `\0` back-reference contains entire matched string +
+**Example input file** + +```bash +$ cat mem_test.txt +mreg2 = 1200 # starting address +mreg4 = 2180 # ending address + +dreg5 = get(mreg2) + get(mreg4) +print dreg5 +``` + +* replace all **reg** with **register** + +```bash +$ sed 's/reg/register/g' mem_test.txt +mregister2 = 1200 # starting address +mregister4 = 2180 # ending address + +dregister5 = get(mregister2) + get(mregister4) +print dregister5 +``` + +* change start and end address + +```bash +$ sed 's/1200/1530/; s/2180/1870/' mem_test.txt +mreg2 = 1530 # starting address +mreg4 = 1870 # ending address + +dreg5 = get(mreg2) + get(mreg4) +print dreg5 + +$ # to make changes only on mreg initializations, use +$ # sed '/mreg[0-9] *=/ s/1200/1530/; s/2180/1870/' mem_test.txt +``` + +* Using `bash` variables + +```bash +$ s_add='1760'; e_add='2500' +$ sed "s/1200/$s_add/; s/2180/$e_add/" mem_test.txt +mreg2 = 1760 # starting address +mreg4 = 2500 # ending address + +dreg5 = get(mreg2) + get(mreg4) +print dreg5 +``` + +* split inline commented code to comment + code + +```bash +$ sed -E 's/^([^#]+)(#.*)/\2\n\1/' mem_test.txt +# starting address +mreg2 = 1200 +# ending address +mreg4 = 2180 + +dreg5 = get(mreg2) + get(mreg4) +print dreg5 +``` + +* range of lines matching pattern + +```bash +$ seq 20 | sed -n '/3/,/5/p' +3 +4 +5 +13 +14 +15 + +``` + **Further Reading** * [sed basics](http://code.snipcademy.com/tutorials/shell-scripting/sed/introduction) From 66b81e6b601e8f47ea6e3c61917e0317d70df0a1 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 25 Jan 2017 11:57:53 +0530 Subject: [PATCH 11/76] illustrated awk, sed examples, spell fix --- Text_Processing.md | 264 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 256 insertions(+), 8 deletions(-) diff --git a/Text_Processing.md b/Text_Processing.md index d308161..07e2580 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -198,7 +198,7 @@ If there is a difference, it prints all the differences, which might not be desi **Options** * `-n` suppress automatic printing of pattern space -* `-i` edit files in place (makes backup if SUFFIX supplied) +* `-i` edit files inplace (makes backup if SUFFIX supplied) * `-r` use extended regular expressions * `-e` add the script to the commands to be executed * `-f` add the contents of script-file to the commands to be executed @@ -240,7 +240,7 @@ By default, `sed` acts on all of input contents. This can be refined to specific * `sed '/cat/!d' story.txt` delete every line NOT containing cat * `sed '$d' story.txt` delete last line of the file * `sed '2,5d' story.txt` delete lines 2,3,4,5 of the file -* `sed '1,/test/d' dir_list.txt` delete all lines from beginning of file to first occurence of line containing test (the matched line is also deleted) +* `sed '1,/test/d' dir_list.txt` delete all lines from beginning of file to first occurrence of line containing test (the matched line is also deleted) * `sed '/test/,$d' dir_list.txt` delete all lines from line containing test to end of file **Examples for selective printing(p)** @@ -258,14 +258,14 @@ By default, `sed` acts on all of input contents. This can be refined to specific **Examples for search and replace(s)** -* `sed -i 's/cat/dog/g' story.txt` search and replace every occurence of cat with dog in story.txt +* `sed -i 's/cat/dog/g' story.txt` search and replace every occurrence of cat with dog in story.txt * `sed -i.bkp 's/cat/dog/g' story.txt` in addition to inplace file editing, create backup file story.txt.bkp, so that if a mistake happens, original file can be restored * `sed -i.bkp 's/cat/dog/g' *.txt` to perform operation on all files ending with .txt in current directory -* `sed -i '5,10s/cat/dog/gI' story.txt` search and replace every occurence of cat (case insensitive due to modifier I) with dog in story.txt only in line numbers 5 to 10 +* `sed -i '5,10s/cat/dog/gI' story.txt` search and replace every occurrence of cat (case insensitive due to modifier I) with dog in story.txt only in line numbers 5 to 10 * `sed '/cat/ s/animal/mammal/g' story.txt` replace animal with mammal in all lines containing cat * Since `-i` option is not used, output is displayed on standard output and story.txt is not changed * spacing between range and command is optional, `sed '/cat/s/animal/mammal/g' story.txt` can also be used -* `sed -i -e 's/cat/dog/g' -e 's/lion/tiger/g' story.txt` search and replace every occurence of cat with dog and lion with tiger +* `sed -i -e 's/cat/dog/g' -e 's/lion/tiger/g' story.txt` search and replace every occurrence of cat with dog and lion with tiger * any number of `-e` option can be used * `sed -i 's/cat/dog/g ; s/lion/tiger/g' story.txt` alternative syntax, spacing around ; is optional * `sed -r 's/(.*)/abc: \1 :xyz/' list.txt` add prefix 'abc: ' and suffix ' :xyz' to every line of list.txt @@ -351,6 +351,21 @@ $ seq 20 | sed -n '/3/,/5/p' ``` +* inplace editing + +```bash +$ sed -i -E 's/([md]r)eg/\1/g' mem_test.txt +$ cat mem_test.txt +mr2 = 1200 # starting address +mr4 = 2180 # ending address + +dr5 = get(mr2) + get(mr4) +print dr5 + +$ # more than one input files can be given +$ # use glob pattern if files share commonality, ex: *.txt +``` + **Further Reading** * [sed basics](http://code.snipcademy.com/tutorials/shell-scripting/sed/introduction) @@ -372,9 +387,9 @@ $ seq 20 | sed -n '/3/,/5/p' **syntax** -* `awk 'BEGIN {initialize} /pattern1/ {stmts} /pattern2/ {stmts}... END {finish}'` +* `awk 'BEGIN {initialize} condition1 {stmts} condition2 {stmts}... END {finish}'` * `BEGIN {initialize}` used to initialize variables (could be user defined or awk variables or both), executed once - optional block - * `/pattern1/ {stmts} /pattern2/ {stmts}...` action performed for every line of input, pattern is optional, more than one block {} can be used with/without pattern + * `condition1 {stmts} condition2 {stmts}...` action performed for every line of input, condition is optional, more than one block {} can be used with/without condition * `END {finish}` perform action once at end of program - optional block * commands can be written in a file and passed using the `-f` option instead of writing it all on command line * for examples and details, refer to links given below @@ -401,6 +416,239 @@ $ seq 20 | sed -n '/3/,/5/p' * for every line, number in column 5 gets added to total * after processing all the lines, the statement in END block is executed, in this case prints value of total variable +
+**Example input file** + +```bash +$ cat test.txt +abc : 123 : xyz +3 : 32 : foo +-2.3 : bar : bar +``` + +* Just printing something, no input + +```bash +$ awk 'BEGIN{print "Hello!\nTesting awk one-liner"}' +Hello! +Testing awk one-liner +``` + +* search and replace +* when the `{stmts}` portion of `condition {stmts}` is not specified, by default `{print $0}` is executed if the `condition` evaluates to true + * `1` is a generally used `awk` idiom to print contents of `$0` after performing some processing + * `print` statement without argument will print the content of `$0` + +```bash +$ # sub will replace only first occurrence +$ # third argument to sub specifies variable to change, defaults to $0 +$ awk '{sub("3", "%")} 1' test.txt +abc : 12% : xyz +% : 32 : foo +-2.% : bar : bar + +$ # gsub will replace all occurrences +$ awk '{gsub("3", "%")} 1' test.txt +abc : 12% : xyz +% : %2 : foo +-2.% : bar : bar + +$ # add a condition to restrict processing only to those records +$ awk '/foo/{gsub("3", "%")} 1' test.txt +abc : 123 : xyz +% : %2 : foo +-2.3 : bar : bar + +$ # using shell variables +$ r="@" +$ awk -v r_str="$r" '{sub("3", r_str)} 1' test.txt +abc : 12@ : xyz +@ : 32 : foo +-2.@ : bar : bar + +$ # bash environment variables like PWD, HOME is also accessible via ENVIRON +$ s="%" awk '{sub("3", ENVIRON["s"])} 1' test.txt +abc : 12% : xyz +% : 32 : foo +-2.% : bar : bar +``` + +* filtering content + +```bash +$ # regex pattern, by default tested against $0 +$ awk '/a/' test.txt +abc : 123 : xyz +-2.3 : bar : bar + +$ # use ! to invert condition +$ awk '!/abc/' test.txt +3 : 32 : foo +-2.3 : bar : bar + +$ seq 30 | awk 'END{print}' +30 + +$ # generic, length(var) - default is $0 +$ seq 8 13 | awk 'length==1' +8 +9 +``` + +* selecting based on line numbers +* `NR` is record number + +```bash +$ seq 123 135 | awk 'NR==7' +129 + +$ seq 123 135 | awk 'NR>=3 && NR<=5' +125 +126 +127 + +$ seq 5 | awk 'NR>=3' +3 +4 +5 + +$ # for large input, use exit to avoid unnecessary record processing +$ seq 14323 14563435 | awk 'NR==234{print; exit}' +14556 +``` + +* selecting based on start and end condition +* for following examples + * numbers 1 to 20 is input + * regex pattern `/4/` is start condition + * regex pattern `/6/` is end condition +* `f` is idiomatically used to represent a flag variable + +```bash +$ # records between start and end +$ seq 20 | awk '/4/{f=1; next} /6/{f=0} f' +5 +15 + +$ # records between start and end and also includes start +$ seq 20 | awk '/4/{f=1} /6/{f=0} f' +4 +5 +14 +15 + +$ # records between start and end and also includes end +$ seq 20 | awk '/4/{f=1; next} f; /6/{f=0}' +5 +6 +15 +16 + +$ # records from start to end +$ seq 20 | awk '/4/{f=1} f{print} /6/{f=0}' +4 +5 +6 +14 +15 +16 + +$ # records excluding start to end +$ seq 10 | awk '/4/{f=1} !f; /6/{f=0}' +1 +2 +3 +7 +8 +9 +10 +``` + +* column manipulations +* by default, one or more consecutive spaces/tabs are considered as field separators + +```bash +$ echo -e "1 3 4\na b c" +1 3 4 +a b c + +$ # second column +$ echo -e "1 3 4\na b c" | awk '{print $2}' +3 +b + +$ # last column +$ echo -e "1 3 4\na b c" | awk '{print $NF}' +4 +c + +$ # default output field separator is single space character +$ echo -e "1 3 4\na b c" | awk '{print $1, $3}' +1 4 +a c + +$ # condition for specific field +$ echo -e "1 3 4\na b c" | awk '$2 ~ /[0-9]/' +1 3 4 +``` + +* specifying a different input/output field separator +* can be string alone or regex, multiple separators can be specified using `|` in regex pattern + +```bash +$ awk -F' *: *' '$1 == "3"' test.txt +3 : 32 : foo + +$ awk -F' *: *' '{print $1 "," $2}' test.txt +abc,123 +3,32 +-2.3,bar + +$ awk -F' *: *' -v OFS="::" '{print $1, $2}' test.txt +abc::123 +3::32 +-2.3::bar + +$ awk -F: -v OFS="\t" '{print $1 OFS $2}' test.txt +abc 123 +3 32 +-2.3 bar +``` + +* dealing with duplicates, line/field wise + +```bash +$ cat duplicates.txt +abc 123 ijk +foo 567 xyz +abc 123 ijk +bar 090 pqr +tst 567 zzz + +$ # whole line +$ awk '!seen[$0]++' duplicates.txt +abc 123 ijk +foo 567 xyz +bar 090 pqr +tst 567 zzz + +$ # particular column +$ awk '!seen[$2]++' duplicates.txt +abc 123 ijk +foo 567 xyz +bar 090 pqr +``` + +* inplace editing + +```bash +$ awk -i inplace '{print NR ") " $0}' test.txt +$ cat test.txt +1) abc : 123 : xyz +2) 3 : 32 : foo +3) -2.3 : bar : bar +``` + **Further Reading** * [awk basics](http://code.snipcademy.com/tutorials/shell-scripting/awk/introduction) @@ -435,7 +683,7 @@ Descriptions adapted from [perldoc - command switches](http://perldoc.perl.org/p | -l | chomp input line, $\ gets value of $/ if no argument given | | -a | autosplit input lines on space, implicitly sets -n for Perl version 5.20.0 and above | | -F | specifies the pattern to split input lines, implicitly sets -a and -n for Perl version 5.20.0 and above | -| -i | edit files in place, if extension provided make a backup copy | +| -i | edit files inplace, if extension provided make a backup copy | | -0777 | slurp entire file as single string, not advisable for large input files |
From 086be458716a7c98dd86043d4cb854355fb3a34d Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 25 Jan 2017 13:54:31 +0530 Subject: [PATCH 12/76] illustrated grep examples --- Working_with_Files_and_Directories.md | 78 +++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 282c707..d951661 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -244,6 +244,84 @@ Paraphrasing from `info grep` * `man pcrepattern` syntax and semantics of the regular expressions that are supported by PCRE * [look-around assertions example](https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match) +**Example input files** +```bash +$ cat ip.txt +Roses are red, +Violets are blue, +Sugar is sweet, +And so are you. + +$ echo -e 'Red\nGreen\nBlue\nBlack\nWhite' > colors.txt +$ cat colors.txt +Red +Green +Blue +Black +White +``` + +* string search, use `-F` for faster results + +```bash +$ grep -F 'are' ip.txt +Roses are red, +Violets are blue, +And so are you. + +$ grep -Fv 'are' ip.txt +Sugar is sweet, + +$ grep -Fc 'are' ip.txt +3 + +$ grep -F -m2 'are' ip.txt +Roses are red, +Violets are blue, + +$ grep -F 'rose' ip.txt +$ grep -Fi 'rose' ip.txt +Roses are red, +``` + +* regular expression, cannot use `-F` + +```bash +$ # lines with words starting with s or S +$ grep -iE '\bs' ip.txt +Sugar is sweet, +And so are you. + +$ # get only the words starting with s or S +$ grep -ioE '\bs[a-z]+' ip.txt +Sugar +sweet +so +``` + +* using file input to specify search terms + +```bash +$ grep -Fif colors.txt ip.txt +Roses are red, +Violets are blue, + +$ echo -e 'Brown\nRed\nGreen\nBlue\nYellow\nBlack\nWhite' > more_colors.txt + +$ # get common lines between two files +$ grep -Fxf colors.txt more_colors.txt +Red +Green +Blue +Black +White + +$ # get lines present in more_colors.txt but not colors.txt +$ grep -Fxvf colors.txt more_colors.txt +Brown +Yellow +``` + **Further Reading** * [how grep command was born](https://medium.com/@rualthanzauva/grep-was-a-private-command-of-mine-for-quite-a-while-before-i-made-it-public-ken-thompson-a40e24a5ef48) From 7b792224c198e730b5b6735a2e9248eb3a9f1150 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 25 Jan 2017 15:50:35 +0530 Subject: [PATCH 13/76] illustrated examples for uniq, comm and formatting --- Text_Processing.md | 95 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 8 deletions(-) diff --git a/Text_Processing.md b/Text_Processing.md index 07e2580..ee738c3 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -104,6 +104,37 @@ This command is more specific to recognizing duplicates. Usually requires a sort * `uniq -u sorted_list.txt` print only unique lines, repeated lines are ignored * [uniq Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/uniq?sort=votes&pageSize=15) +```bash +$ echo -e 'Blue\nRed\nGreen\nBlue\nRed\nBlack\nRed' > colors.txt +$ uniq colors.txt +Blue +Red +Green +Blue +Red +Black +Red + +$ echo -e 'Blue\nRed\nGreen\nBlue\nRed\nBlack\nRed' | sort > sorted_colors.txt +$ uniq sorted_colors.txt +Black +Blue +Green +Red + +$ uniq -d sorted_colors.txt +Blue +Red + +$ uniq -cd sorted_colors.txt + 2 Blue + 3 Red + +$ uniq -u sorted_colors.txt +Black +Green +``` +
### comm @@ -125,6 +156,54 @@ Without any options, it prints output in three columns - lines unique to file1, * `comm -12 sorted_file1.txt sorted_file2.txt` print lines common to both files * [comm Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/comm?sort=votes&pageSize=15) +```bash +$ echo -e 'Brown\nRed\nPurple\nBlue\nTeal\nYellow' | sort > colors_1.txt +$ echo -e 'Red\nGreen\nBlue\nBlack\nWhite' | sort > colors_2.txt + +$ # the input files viewed side by side +$ paste colors_1.txt colors_2.txt +Blue Black +Brown Blue +Purple Green +Red Red +Teal White +Yellow +``` + +* examples + +```bash +$ # 3 column output - unique to file1, file2 and common +$ comm colors_1.txt colors_2.txt + Black + Blue +Brown + Green +Purple + Red +Teal + White +Yellow  + +$ # suppress 1 and 2 column, gives only common lines +$ comm -12 colors_1.txt colors_2.txt +Blue +Red + +$ # suppress 1 and 3 column, gives lines unique to file2 +$ comm -13 colors_1.txt colors_2.txt +Black +Green +White + +$ # suppress 2 and 3 column, gives lines unique to file1 +$ comm -23 colors_1.txt colors_2.txt +Brown +Purple +Teal +Yellow +``` +
### cmp @@ -146,8 +225,8 @@ $ cmp /bin/grep /bin/fgrep >compare files line by line -Useful to compare text files. If the two files are same, no output is displayed (exit status 0) -If there is a difference, it prints all the differences, which might not be desirable if files are too long +Useful to compare old and new versions of text files +All the differences are printed, which might not be desirable if files are too long **Options** @@ -1243,12 +1322,12 @@ We can use a combination of different commands for complicated operations. For e ```bash $ tr ' ' '\n' < dishes.txt | pr -$(wc -l < dishes.txt)t -North South West East -alootikki appam dhokla handoguri -baati bisibelebath khakhra litti -khichdi dosa modak momo -makkiroti koottu shiro rosgulla -poha sevai vadapav shondesh +North South West East +alootikki appam dhokla handoguri +baati bisibelebath khakhra litti +khichdi dosa modak momo +makkiroti koottu shiro rosgulla +poha sevai vadapav shondesh ``` Notice how `pr` neatly arranges the columns. If spacing is too much, we can use `column` From 6e19e8a5cbbe2b293c976f189bc5df712f5de073 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sun, 12 Feb 2017 09:05:02 +0530 Subject: [PATCH 14/76] removed non-illustrated awk examples --- Text_Processing.md | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/Text_Processing.md b/Text_Processing.md index ee738c3..7cbabeb 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -473,28 +473,6 @@ $ # use glob pattern if files share commonality, ex: *.txt * commands can be written in a file and passed using the `-f` option instead of writing it all on command line * for examples and details, refer to links given below -
-**Examples** - -* `ls -l | awk '{print $1}'` print first column of results of `ls -l` command - * `$1`, `$2` etc refer to 1st, 2nd field, etc - * `$0` contains entire line -* `ls -l | awk '{print $1" "$NF}'` print first and last column of results of `ls -l` command separated by space character - * `$NF` pre-defined variable holds last field -* `ls -l | awk 'NF > 2 {print $1" "$NF}'` print file permission and filename in two columns separated by space, provided a line has more than 2 fields (to exclude the first line of `ls -l` which has only two fields) -* `awk -F":" '{print $1}' /etc/passwd` prints first column of /etc/passwd file - * `-F` option is used to specify the field separator, by default white-space is separator -* `awk 'BEGIN {FS = ":"} {print $1}' /etc/passwd` prints first column of /etc/passwd file - * `FS` is field separator variable, by default white-space is separator -* `awk '{print "abc: " $0 " :xyz"}' list.txt` add prefix 'abc: ' and suffix ' :xyz' to every line of list.txt -* `awk '{print FNR ": " $0}' dir_list.txt` prefix line number and ': ' to all lines of file dir_list.txt - * `FNR` pre-defined variable contains input record number in the current input file -* `ls -l | awk '/^d/ {print $0}'` filter output of `ls -l` for directories -* `awk '{total += $5} END {print total}' table.txt` print sum of all numbers in column 5 of file table.txt - * by default, initial value of variable is 0, so at start total=0 - * for every line, number in column 5 gets added to total - * after processing all the lines, the statement in END block is executed, in this case prints value of total variable -
**Example input file** From f0acf39baeb06efe06c8b3f31e1328d10a74f295 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 13 Feb 2017 16:03:01 +0530 Subject: [PATCH 15/76] changed dead link --- Working_with_Files_and_Directories.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index d951661..92b87c9 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -771,7 +771,7 @@ rm: cannot remove ‘linux_tutorial/report/power.log’: Permission denied **Further Reading** -* [permissions primer](http://www.catchlinux.com/permissions-primer/) - comprehensive tutorial, includes discussion on `/etc/passwd` , group permissions and more -* [Linux File Permissions](https://danielmiessler.com/study/unixlinux_permissions/) +* [Linux File Permissions](https://www.linux.com/learn/getting-know-linux-file-permissions) +* [Linux Permissions Primer](https://danielmiessler.com/study/unixlinux_permissions/) * [chmod Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/chmod?sort=votes&pageSize=15) * [chmod Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/chmod?sort=votes&pageSize=15) From 8be01deaf51918f4b0e66a7496528b7f27e205f7 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 13 Feb 2017 16:04:56 +0530 Subject: [PATCH 16/76] replaced dead link --- Files_and_Directories.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index f5befce..b2096eb 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -176,7 +176,7 @@ The destination path is always specified as the last argument. More than one sou Also check out * `rsync` a fast, versatile, remote (and local) file-copying tool -* [rsync examples](http://ubtutorials.com/tutorial/1136/ubuntu-15-examples-backup-using-rsync-command) +* [rsync examples](http://www.tutorialspoint.com/articles/rsync-command-examples-on-linux) * [rsync Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rsync?sort=votes&pageSize=15) * [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15) From 783878f600213b8dc08177e5a444e38dae7957bc Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 16 Feb 2017 11:26:44 +0530 Subject: [PATCH 17/76] globstar and extglob examples --- Shell.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/Shell.md b/Shell.md index 9070168..25d8690 100644 --- a/Shell.md +++ b/Shell.md @@ -53,9 +53,7 @@ Like any indispensible software, Shell has undergone transformation from the day
### Wildcards -It is easy to specify complete filenames as command arguments when they are few in number. But suppose, one has to delete hundreds of log files, spread across different sub-directories? Wildcards, or also known as globbing patterns help in such cases, provided the filenames have a commonality to exploit. We have already seen regular expressions used in commands like `grep` and `sed`. Shell wildcards are similar - -**wildcards** +It is easy to specify complete filenames as command arguments when they are few in number. But suppose, one has to delete hundreds of log files, spread across different sub-directories? Wildcards, or also known as globbing patterns help in such cases, provided the filenames have a commonality to exploit. We have already seen regular expressions used in commands like `grep` and `sed`. Shell wildcards are similar but has fundamental and syntactical differences * `*` match any character, 0 or more times * as a special case, `*` won't match the starting `.` of hidden files and has to be explicity specified @@ -91,6 +89,66 @@ It is easy to specify complete filenames as command arguments when they are few * `rm file{1..4}.txt` same as `rm file1.txt file2.txt file3.txt file4.txt` * `echo story.txt{,.bkp}` displays the expanded version 'story.txt story.txt.bkp' , useful to dry run before executing actual command +**Extended globs** + +From `info bash`, where `pattern-list` is a list of one or more patterns separated by a `|` + +* `?(pattern-list)` Matches zero or one occurrence of the given patterns +* `*(pattern-list)` Matches zero or more occurrences of the given patterns +* `+(pattern-list)` Matches one or more occurrences of the given patterns +* `@(pattern-list)` Matches one of the given patterns +* `!(pattern-list)` Matches anything except one of the given patterns + +To check if `extglob` is enabled or to enable/disable: + +```bash +$ shopt extglob +extglob on + +$ # unset extglob +$ shopt -u extglob +$ shopt extglob +extglob off + +$ # set extglob +$ shopt -s extglob +$ shopt extglob +extglob on +``` + +Examples + +```bash +$ ls +123.txt main.c math.h power.log + +$ echo +([0-9]).txt +123.txt + +$ ls @(*.c|*.h) +main.c math.h + +$ ls !(*.txt) +main.c math.h power.log +$ ls !(*.c|*.h) +123.txt power.log +``` + +**Recursively search current directory and its sub-folders** + +Set `globstar` and prefix pattern with `**/` to search recursively + +```bash +$ find -name '*.txt' +./song_list.txt +./bar/f1.txt +./bar/baz/f2.txt + +$ shopt -s globstar +$ ls **/*.txt +bar/baz/f2.txt bar/f1.txt song_list.txt +``` + **Further Reading** * [Glob](http://mywiki.wooledge.org/glob) From f1d69fc8f5c95a2867cb48b57e87d91b9c521a98 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 16 Feb 2017 17:25:21 +0530 Subject: [PATCH 18/76] example changed/modified --- Shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Shell.md b/Shell.md index 25d8690..4711669 100644 --- a/Shell.md +++ b/Shell.md @@ -189,7 +189,7 @@ By default all results of a command are displayed on the terminal, which is the * `sed -i "s|^|$(basename $PWD)/|" dir_list.txt` add current directory path and forward-slash character at the start of every line * Note the use of double quotes to perform command substitution -* `gvim "$(ls -t *.txt | head -1)"` open the latest modified file ending with txt in current directory +* `file_count=$(ls -q | wc -l)` save command output to a variable * [Command Substitution](http://mywiki.wooledge.org/CommandSubstitution) **Process Substitution** @@ -223,7 +223,7 @@ Earlier versions: **Redirecting input** * `tr a-z A-Z < test_list.txt` convert lowercase to uppercase, `tr` command only reads from stdin and doesn't have the ability to read from a file directly -* `wc < report.log` useful to avoid filename in `wc` output +* `wc -l < report.log` useful to avoid filename in `wc` output * `< report.log grep 'test'` useful to easily modify previous command for different command options, search patterns, etc * `grep 'test' report.log | diff - test_list.txt` output of `grep` as one of the input file for `diff` command * [difference between << , <<< and < <](https://askubuntu.com/questions/678915/whats-the-difference-between-and-in-bash) From 2fa6e4eadd55915cd68c202fa7655fd7d69873c3 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 17 Feb 2017 16:36:45 +0530 Subject: [PATCH 19/76] example for if stmt with command success status --- Shell_Scripting.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index 08e16b5..64cc713 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -186,6 +186,7 @@ fi * Default `exit` value is `0` , so need not be explicitly written for successful script completion * Use `elif` if you need to test more conditions after `if` * The operator `&&` is used to execute a command only when the preceding one successfully finishes +* To redirect error message to stderr, use `echo "Error!! Please provide two file names" 1>&2` and so on * [Control Operators && and ||](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators_.28.26.26_and_.7C.7C.29) * [More examples for if conditional block](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29) @@ -213,6 +214,45 @@ $ echo $? 0 ``` +**Combining if with exit status of command executed** + +Sometimes one needs to know if intended command operation was successful or not and then take action depending on outcome. Exit status of `0` is considered as successful condition when used with `if` statement. When avaiable, use appropriate options to suppress stdout/stderr of command being used, otherwise redirection might be needed to avoid cluttering output on terminal + +```bash +$ grep 'echo' hello_script.sh +echo "Hello $USER" +echo "Today is $(date -u +%A)" +echo 'Have a nice day' + +$ # do not write anything to standard output +$ grep -q 'echo' hello_script.sh +$ echo $? +0 + +$ grep -q 'echo' xyz.txt +grep: xyz.txt: No such file or directory +$ echo $? +2 +$ # Suppress error messages about nonexistent or unreadable files +$ grep -qs 'echo' xyz.txt +$ echo $? +2 +``` + +Example + +```bash +#!/bin/bash + +if grep -q 'echo' hello_script.sh ; then + # do something + echo "string found" +else + # do something else + echo "string not found" +fi +``` +
### for loop From a396f979c522462019be6658e561cbcb02835adf Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 17 Feb 2017 19:33:25 +0530 Subject: [PATCH 20/76] examples for iterating over array and files --- Shell_Scripting.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index 64cc713..09d83a2 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -318,6 +318,29 @@ do done ``` +**Iterating over used defined array** + +```bash +$ files=('report.log' 'pass_list.txt') +$ for f in "${files[@]}"; do echo "$f"; done +report.log +pass_list.txt +``` + +**Files specified by glob pattern** + +A common mistake is to use output of `ls` command which is error prone and needless. Instead, the arguments can be directly used. + +```bash +$ ls +pass_list.txt power.log report.txt + +$ for f in power.log *.txt; do echo "$f"; done +power.log +pass_list.txt +report.txt +``` + * [more examples and use of continue/break](http://ryanstutorials.net/bash-scripting-tutorial/bash-loops.php)
From 2001299b659c0b6ec95a606f24d3879b19417f9a Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 18 Feb 2017 12:21:27 +0530 Subject: [PATCH 21/76] examples for reading file --- Shell_Scripting.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index 09d83a2..c037b34 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -8,6 +8,7 @@ * [if then else](#if-then-else) * [for loop](#for-loop) * [while loop](#while-loop) +* [Reading a file](#reading-file) * [Debugging](#debugging) * [Resource lists](#resource-lists) @@ -369,6 +370,77 @@ $ ./while_loop.sh 1 ``` +
+### Reading a file + +Reading line by line + +```bash +#!/bin/bash + +while IFS= read -r line; do + # do something with each line + echo "$line" +done < 'files.txt' +``` + +* `IFS` is used to specify field separator which is by default whitespace. `IFS=` will clear the default value and prevent stripping of leading and trailing whitespace of lines +* The `-r` option for `read` will prevent interpreting `\` escapes +* Last line from input won't be read if not properly terminated by newline character + +```bash +$ cat files.txt +hello_script.sh +if_then_else.sh +$ ./while_read_file.sh +hello_script.sh +if_then_else.sh +``` + +Reading line as different fields + +* By default, whitespace is delimiter +* Specify a different one by setting `IFS` + +```bash +$ cat read_file_field.sh +#!/bin/bash + +while IFS=: read -r genre name; do + echo -e "$genre\t:: $name" +done < 'books.txt' +$ cat books.txt +fantasy:Harry Potter +sci-fi:The Martian +mystery:Sherlock Holmes + +$ ./read_file_field.sh +fantasy :: Harry Potter +sci-fi :: The Martian +mystery :: Sherlock Holmes +``` + +Reading 'n' characters at a time + +```bash +$ while read -n1 char; do echo "Character read is: $char"; done <<< "\word" +Character read is: w +Character read is: o +Character read is: r +Character read is: d +Character read is: + +$ # if ending newline character is not desirable +$ while read -n1 char; do echo "Character read is: $char"; done < <(echo -n "hi") +Character read is: h +Character read is: i + +$ while read -r -n2 chars; do echo "Characters read: $chars"; done <<< "\word" +Characters read: \w +Characters read: or +Characters read: d +``` +
### Debugging @@ -428,6 +500,7 @@ The material in this chapter is only a basic introduction * [using source command to execute bash script](https://askubuntu.com/questions/661577/difference-between-and-for-running-a-script-application) * [functions](http://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php) +* [Reading file](http://mywiki.wooledge.org/BashFAQ/001) * [arrays](http://mywiki.wooledge.org/BashGuide/Arrays) * [nameref](https://unix.stackexchange.com/questions/288886/bash-array-values-like-variables-inside-loop/288894#288894) * also see this [FAQ](http://mywiki.wooledge.org/BashFAQ/006) From b29357357622a792c5c3b6018a869612c2485440 Mon Sep 17 00:00:00 2001 From: learnbyexample Date: Sat, 18 Mar 2017 11:51:12 +0530 Subject: [PATCH 22/76] markdown formatting --- Command_Line_Introduction.md | 4 ++++ Files_and_Directories.md | 12 ++++++++++++ Linux_Introduction.md | 5 +++++ README.md | 5 +++++ Shell.md | 7 +++++++ Shell_Customization.md | 3 +++ Shell_Scripting.md | 11 +++++++++++ Text_Processing.md | 17 +++++++++++++++++ Working_with_Files_and_Directories.md | 17 +++++++++++++++++ 9 files changed, 81 insertions(+) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 4f0c4c4..6475d63 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -20,6 +20,7 @@ If you've used a scientific calculator, you'd know that it is handy with too man * [rough overview of changes to Bash over time](http://wiki.bash-hackers.org/scripting/bashchanges)
+ ### File System Before we dive into ocean of commands, lets get a brief on Linux file system. If you've used Windows, you would be familiar with `C:` `D:` etc. @@ -52,6 +53,7 @@ Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_ * [Overview of file system](http://tldp.org/LDP/intro-linux/html/sect_03_01.html)
+ ### Command Line Interface Command Line Interface (CLI) allows us interact with computer using text commands @@ -65,6 +67,7 @@ Shell and Terminal are sometimes interchangeably used to mean the same thing - a * `echo "$SHELL"` to know which is your login-shell
+ ### Command Help * `man man` get help about manual pages @@ -98,6 +101,7 @@ Shell and Terminal are sometimes interchangeably used to mean the same thing - a * [which, whatis, whereis examples](http://www.thegeekstuff.com/2013/04/linux-which-whatis-whereis/)
+ ### Do one thing and do it well [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index b2096eb..176cb2a 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -20,6 +20,7 @@ Make it a habit to use `man` command to read about a new command - for example ` Short descriptions shown for a command are taken from `whatis` or `help -d`
+ ### pwd >print name of current/working directory @@ -27,6 +28,7 @@ Short descriptions shown for a command are taken from `whatis` or `help -d` Apart from knowing your current working directory, often used to copy the absolute path to be pasted elsewhere, like in a script
+ ### clear >clear the terminal screen @@ -34,6 +36,7 @@ Apart from knowing your current working directory, often used to copy the absolu * Use `Ctrl+l` to clear the terminal screen and retain already typed text (if any) on command prompt
+ ### ls >list directory contents @@ -74,6 +77,7 @@ Apart from knowing your current working directory, often used to copy the absolu * [why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls)
+ ### cd >Change the shell working directory @@ -99,6 +103,7 @@ cd - Change the shell working directory. * [cd Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cd?sort=votes&pageSize=15)
+ ### mkdir >make directories @@ -114,6 +119,7 @@ cd - Change the shell working directory. * [mkdir Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mkdir?sort=votes&pageSize=15)
+ ### touch >change file timestamps @@ -125,6 +131,7 @@ More info on this command is covered in a later chapter * [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15)
+ ### rm >remove files and directories @@ -151,6 +158,7 @@ More info on this command is covered in a later chapter * [rm Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rm?sort=votes&pageSize=15)
+ ### cp >copy files and directories @@ -181,6 +189,7 @@ Also check out * [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15)
+ ### mv >move (rename) files @@ -200,6 +209,7 @@ The destination path is always specified as the last argument. More than one sou * [mv Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mv?sort=votes&pageSize=15)
+ ### rename >renames multiple files @@ -218,6 +228,7 @@ Note: The `perl` based `rename` is presented here and different from [util-linux * [rename Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rename?sort=votes&pageSize=15)
+ ### ln >make links between files @@ -234,6 +245,7 @@ Create hard or soft link of file or folder. Soft link is similar to short-cuts c * [ln Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ln?sort=votes&pageSize=15)
+ ### tar and gzip `tar` is archiving utility. The archived file is same size as combined sizes of archived files diff --git a/Linux_Introduction.md b/Linux_Introduction.md index 28dce2f..31b4ab4 100644 --- a/Linux_Introduction.md +++ b/Linux_Introduction.md @@ -7,6 +7,7 @@ * [Linux resource lists](#linux-resource-lists)
+ ### What is Linux? Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) @@ -14,6 +15,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) > Linux is a Unix-like and mostly POSIX-compliant computer operating system (OS) assembled under the model of free and open-source software development and distribution. The defining component of Linux is the Linux kernel an operating system kernel first released on 5 October 1991 by Linus Torvalds. The Free Software Foundation uses the name **GNU/Linux** to describe the operating system
+ ### Why use Linux? * Speed, Security, Stability @@ -24,6 +26,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) * Read more on using Linux and does it fit your computing needs on [computefreely](http://computefreely.org/)
+ ### Where is Linux deployed? * Servers @@ -38,6 +41,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) * [Usage Share of Operating Systems](http://en.wikipedia.org/wiki/Usage_share_of_operating_systems)
+ ### Linux Distros Like how numerous programming languages exist, there are various Linux flavors called 'distribution' (distros for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case @@ -57,6 +61,7 @@ Usually, you'll find installation instructions from respective website of the di * [Try out Linux on Virtual Machine](http://www.storagecraft.com/blog/the-dead-simple-guide-to-installing-a-linux-virtual-machine-on-windows/)
+ ### Linux resource lists * [Linux curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Linux_curated_resources.md) diff --git a/README.md b/README.md index 3aee635..4c2e58d 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Introduction to Linux commands and Shell scripting * For more related resources, visit [scripting course](https://github.com/learnbyexample/scripting_course)
+ # Chapters * [Linux Introduction](./Linux_Introduction.md) @@ -26,12 +27,14 @@ Introduction to Linux commands and Shell scripting * Need for scripting, Hello script, Command Line Arguments, Variables and Comparisons, Accepting User Input interactively, if then else, for loop, while loop, Debugging, Resource lists
+ # ebook * Read as ebook on [gitbook](https://learnbyexample.gitbooks.io/linux-command-line/content/index.html) * Download ebook for offline reading - [link](https://www.gitbook.com/book/learnbyexample/linux-command-line/details)
+ # Acknowledgements * [unix.stackexchange](https://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions @@ -39,5 +42,7 @@ Introduction to Linux commands and Shell scripting * [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique
+ # License + This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) diff --git a/Shell.md b/Shell.md index 4711669..b42ae9d 100644 --- a/Shell.md +++ b/Shell.md @@ -8,6 +8,7 @@ * [Running jobs in background](#running-jobs-in-background)
+ ### What is Shell? Quoting from [wikipedia](https://en.wikipedia.org/wiki/Unix_shell) @@ -23,6 +24,7 @@ Quoting from [wikipedia](https://en.wikipedia.org/wiki/Unix_shell) * [Difference between shell, tty and console](https://www.reddit.com/r/programming/comments/41u5hw/what_is_the_exact_difference_between_a_terminal_a/)
+ ### Popular Shells Like any indispensible software, Shell has undergone transformation from the days of basic `sh` shell that was used in 1970s Unix. While `bash` is default shell in most distros and most commonly used, powerful and feature rich shells are still being developed and released @@ -51,6 +53,7 @@ Like any indispensible software, Shell has undergone transformation from the day * [Shell, choosing shell and changing default shells](https://wiki.ubuntu.com/ChangingShells)
+ ### Wildcards It is easy to specify complete filenames as command arguments when they are few in number. But suppose, one has to delete hundreds of log files, spread across different sub-directories? Wildcards, or also known as globbing patterns help in such cases, provided the filenames have a commonality to exploit. We have already seen regular expressions used in commands like `grep` and `sed`. Shell wildcards are similar but has fundamental and syntactical differences @@ -157,6 +160,7 @@ bar/baz/f2.txt bar/f1.txt song_list.txt * [when to use brace expansion](https://unix.stackexchange.com/questions/6035/when-do-you-use-brace-expansion)
+ ### Redirection By default all results of a command are displayed on the terminal, which is the default destination for **standard output**. But often, one might want to save or discard them or send as input to another command. Similarly, inputs to a command can be given from files or from another command. Errors are special outputs generated on a wrong usage of command or command name @@ -247,6 +251,7 @@ Earlier versions: * [Redirections explained](http://www.catonmat.net/blog/bash-one-liners-explained-part-three/)
+ ### Process Control * `Process` is any running program @@ -304,6 +309,7 @@ Earlier versions: * `pgrep -nl chrom` most recently started process matching chrom
+ **Further Reading** * [Process Management](http://ryanstutorials.net/linuxtutorial/processes.php) @@ -314,6 +320,7 @@ Earlier versions: * [Useful examples for top command](http://www.thegeekstuff.com/2010/01/15-practical-unix-linux-top-command-examples/#more-2515)
+ ### Running jobs in background Often commands and scripts can take more than few minutes to complete, but user might still need to continue using the shell. Opening a new shell might not serve the purpose if local shell variable settings are needed too. Shell provides the `&` operator to push the commad (or script) execution to background and return the command prompt to the user. However, the standard outputs and errors would still get displayed on the terminal unless appropriately redirected diff --git a/Shell_Customization.md b/Shell_Customization.md index 2a7b0e6..d6ddf4a 100644 --- a/Shell_Customization.md +++ b/Shell_Customization.md @@ -5,6 +5,7 @@ * [Emac mode Readline shortcuts](#emac-mode-readline-shortcuts)
+ ### Variables Quoting from [article on BASH Environment & Shell Variables](http://www.tricksofthetrades.net/2015/06/14/notes-bash-env-variables/) @@ -55,6 +56,7 @@ $ echo "${dec2bin[255]}" * [Parameter expansion](http://wiki.bash-hackers.org/syntax/pe#simple_usage) - from simple ways to get Variable values to complicated manipulations
+ ### Config files Through use of aliases, functions, shell variables, etc one can customize the shell as per their needs @@ -161,6 +163,7 @@ Before creating an alias or function, use `type alias_name` to check if an exist * [what does rc in bashrc stand for](https://unix.stackexchange.com/questions/3467/what-does-rc-in-bashrc-stand-for)
+ ### Emac mode Readline shortcuts * `Ctrl+c` sends SIGINT signal, requesting the current running process to terminate diff --git a/Shell_Scripting.md b/Shell_Scripting.md index c037b34..94db18b 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -13,6 +13,7 @@ * [Resource lists](#resource-lists)
+ ### Need for scripting * Automate repetitive manual tasks @@ -25,6 +26,7 @@ Note: * Material presented here is for `GNU bash, version 4.3.11(1)-release`
+ ### Hello script ```bash @@ -76,6 +78,7 @@ Have a nice day ```
+ ### Command Line Arguments ```bash @@ -102,6 +105,7 @@ No of lines in 'test file.txt' is 5 ```
+ ### Variables and Comparisons * `dir_path=/home/guest` space has special meaning in bash, cannot be used around = in variables @@ -127,6 +131,7 @@ No of lines in 'test file.txt' is 5 * [Parameter expansion](http://mywiki.wooledge.org/BashFAQ/073) - substitute a variable or special parameter for its value
+ ### Accepting User Input interactively ```bash @@ -156,6 +161,7 @@ Thank you for using the script, Have a nice day :) ```
+ ### if then else ```bash @@ -255,6 +261,7 @@ fi ```
+ ### for loop ```bash @@ -345,6 +352,7 @@ report.txt * [more examples and use of continue/break](http://ryanstutorials.net/bash-scripting-tutorial/bash-loops.php)
+ ### while loop ```bash @@ -371,6 +379,7 @@ $ ./while_loop.sh ```
+ ### Reading a file Reading line by line @@ -442,6 +451,7 @@ Characters read: d ```
+ ### Debugging * `-x` Print commands and their arguments as they are executed @@ -481,6 +491,7 @@ Have a nice day ```
+ ### Resource lists The material in this chapter is only a basic introduction diff --git a/Text_Processing.md b/Text_Processing.md index 7cbabeb..093a289 100644 --- a/Text_Processing.md +++ b/Text_Processing.md @@ -17,6 +17,7 @@ The rich set of text processing commands is comprehensive and time saving. Knowing even their existence is enough to avoid the need of writing yet another script (which takes time and effort plus debugging) – a trap which many beginners fall into. An extensive list of text processing commands and examples can be found [here](http://tldp.org/LDP/abs/html/textproc.html)
+ ### sort >sort lines of text files @@ -45,6 +46,7 @@ As the name implies, this command is used to sort files. How about alphabetic so * `du -sh * | sort -h` sort file/directory sizes in current directory in human readable format
+ ```bash $ cat ip.txt 6.2 : 897 : bar @@ -82,6 +84,7 @@ $ sort -t: -k3,3 -k1,1rn ip.txt * [sort on multiple columns using -k option](https://unix.stackexchange.com/questions/249452/unix-multiple-column-sort-issue)
+ ### uniq >report or omit repeated lines @@ -136,6 +139,7 @@ Green ```
+ ### comm >compare two sorted files line by line @@ -205,6 +209,7 @@ Yellow ```
+ ### cmp >compare two files byte by byte @@ -221,6 +226,7 @@ $ cmp /bin/grep /bin/fgrep * More examples [here](http://www.sanfoundry.com/5-cmp-command-usage-examples-linux/)
+ ### diff >compare files line by line @@ -252,6 +258,7 @@ All the differences are printed, which might not be desirable if files are too l * [GUI diff and merge tools](http://askubuntu.com/questions/2946/what-are-some-good-gui-diff-and-merge-applications-available-for-ubuntu)
+ ### tr >translate or delete characters @@ -270,6 +277,7 @@ All the differences are printed, which might not be desirable if files are too l * [tr Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/tr?sort=votes&pageSize=15)
+ ### sed >stream editor for filtering and transforming text @@ -356,6 +364,7 @@ By default, `sed` acts on all of input contents. This can be refined to specific * `\0` back-reference contains entire matched string
+ **Example input file** ```bash @@ -458,6 +467,7 @@ $ # use glob pattern if files share commonality, ex: *.txt * [sed Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/sed?sort=votes&pageSize=15)
+ ### awk >pattern scanning and text processing language @@ -474,6 +484,7 @@ $ # use glob pattern if files share commonality, ex: *.txt * for examples and details, refer to links given below
+ **Example input file** ```bash @@ -720,6 +731,7 @@ $ cat test.txt * [awk Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/awk?sort=votes&pageSize=15)
+ ### perl >The Perl 5 language interpreter @@ -1101,6 +1113,7 @@ abc : *** : xyz * [Env](http://perldoc.perl.org/Env.html)
+ ### cut >remove sections from each line of files @@ -1118,6 +1131,7 @@ For columns operations with well defined delimiters, `cut` command is handy * [cut Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cut?sort=votes&pageSize=15)
+ ### paste >merge lines of files @@ -1177,6 +1191,7 @@ $ seq 10 | perl -pe 's/\n/ : / if(!eof)' ```
+ ### column >columnate lists @@ -1198,6 +1213,7 @@ East handoguri litti momo rosgulla shondesh * More examples [here](http://www.commandlinefu.com/commands/using/column/sort-by-votes)
+ ### pr >convert text files for printing @@ -1296,6 +1312,7 @@ $ pr -mts', ' <(seq 3) <(seq 4 6) <(seq 7 9) ```
+ We can use a combination of different commands for complicated operations. For example, transposing a table ```bash diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 92b87c9..c223795 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -21,6 +21,7 @@ In this chapter, we will see how to display contents of a file, search within files, search for files, get file properties and information, what are the permissions for files/directories and how to change them to our requirements
+ ### cat >concatenate files and print on the standard output @@ -60,6 +61,7 @@ This is an example of adding text to a new file using cat command. ```
+ ### less >opposite of more @@ -85,6 +87,7 @@ This is an example of adding text to a new file using cat command. * [less Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/less?sort=votes&pageSize=15)
+ ### tail >output the last part of files @@ -101,6 +104,7 @@ This is an example of adding text to a new file using cat command. * [tail Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/tail?sort=votes&pageSize=15)
+ ### head >output the first part of files @@ -114,6 +118,7 @@ This is an example of adding text to a new file using cat command. * [head Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/head?sort=votes&pageSize=15)
+ ### Text Editors For editing text files, the following applications can be used. Of these, `gedit`, `nano`, `vi` and/or `vim` are available in most distros by default @@ -133,6 +138,7 @@ Powerful text editors * [sublime](https://www.sublimetext.com/)
+ ### grep >print lines matching a pattern @@ -335,6 +341,7 @@ Yellow
+ ### find >search for files in a directory hierarchy @@ -398,6 +405,7 @@ Passing filtered files as input to other commands * [Why is looping over find's output bad practice?](https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-output-bad-practice)
+ ### locate >find files by name @@ -416,6 +424,7 @@ Faster alternative to `find` command when searching for a file by its name. It i * [find vs locate - pros and cons](https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-each-other)
+ ### wc >print newline, word, and byte counts for each file @@ -432,6 +441,7 @@ Faster alternative to `find` command when searching for a file by its name. It i * [wc Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/wc?sort=votes&pageSize=15)
+ ### du >estimate file space usage @@ -452,6 +462,7 @@ Faster alternative to `find` command when searching for a file by its name. It i * [du Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/du?sort=votes&pageSize=15)
+ ### df >report file system disk space usage @@ -463,6 +474,7 @@ Faster alternative to `find` command when searching for a file by its name. It i * [df Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/df?sort=votes&pageSize=15)
+ ### touch >change file timestamps @@ -483,6 +495,7 @@ Used to change file time stamps. But if file doesn't exist, the command will cre * [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15)
+ ### file >determine file type @@ -505,6 +518,7 @@ perl.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced ```
+ ### identify >describes the format and characteristics of one or more image files @@ -520,6 +534,7 @@ perl.png PNG 32x32 32x32+0+0 8-bit DirectClass 838B 0.000u 0:00.000 ```
+ ### basename >strip directory and suffix from filenames @@ -540,6 +555,7 @@ power ```
+ ### dirname >strip last component from file name @@ -556,6 +572,7 @@ $ dirname '/home/learnbyexample/proj_adder/power.log' ```
+ ### chmod >change file mode bits From b2fa0732bfb82c8b16499fae0ab84dd682fdd14e Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 30 Mar 2017 10:20:57 +0530 Subject: [PATCH 23/76] more links on reading file and getopts --- Shell_Scripting.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index 94db18b..a90c8fa 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -511,11 +511,16 @@ The material in this chapter is only a basic introduction * [using source command to execute bash script](https://askubuntu.com/questions/661577/difference-between-and-for-running-a-script-application) * [functions](http://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php) -* [Reading file](http://mywiki.wooledge.org/BashFAQ/001) +* Reading file(s) + * [Reading file](http://mywiki.wooledge.org/BashFAQ/001) + * [Loop through the lines of two files in parallel](https://unix.stackexchange.com/questions/82541/loop-through-the-lines-of-two-files-in-parallel) * [arrays](http://mywiki.wooledge.org/BashGuide/Arrays) * [nameref](https://unix.stackexchange.com/questions/288886/bash-array-values-like-variables-inside-loop/288894#288894) * also see this [FAQ](http://mywiki.wooledge.org/BashFAQ/006) -* [getopts example](https://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash) +* getopts + * [getopts tutorial](http://wiki.bash-hackers.org/howto/getopts_tutorial) + * [wooledge - handle command-line arguments](http://mywiki.wooledge.org/BashFAQ/035) + * [stackoverflow - getopts example](https://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash) **Handy tools, tips and reference** From 15d23e82c7c11ecb700ffcc5ba79302bbfd772d8 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 1 Apr 2017 12:21:18 +0530 Subject: [PATCH 24/76] sourcing script example --- Shell_Scripting.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index a90c8fa..f13224f 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -2,6 +2,7 @@ * [Need for scripting](#need-for-scripting) * [Hello script](#hello-script) +* [Sourcing script](#sourcing-script) * [Command Line Arguments](#command-line-arguments) * [Variables and Comparisons](#variables-and-comparisons) * [Accepting User Input interactively](#accepting-user-input-interactively) @@ -79,6 +80,37 @@ Have a nice day
+### Sourcing script + +```bash +$ help -d source +source - Execute commands from a file in the current shell. +``` + +* If script should be executed in current shell environment instead of sub-shell, use the `.` or `source` command + * For example, after editing `~/.bashrc` one can use `source ~/.bashrc` for changes to be immeditely effective + +```bash +$ # contents of prev_cmd.sh +prev=$(fc -ln -2 | sed 's/^[ \t]*//;q') +echo "$prev" +``` + +* For example, to access history of current interactive shell from within script + +```bash +$ printf 'hi there\n' +hi there +$ bash prev_cmd.sh + +$ printf 'hi there\n' +hi there +$ source prev_cmd.sh +printf 'hi there\n' +``` + +
+ ### Command Line Arguments ```bash From 0e46baf80da676cc63415ef6a525250354ec0da1 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 3 Apr 2017 20:53:09 +0530 Subject: [PATCH 25/76] real world use case for bash script --- Shell_Scripting.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index f13224f..c2421dc 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -11,6 +11,7 @@ * [while loop](#while-loop) * [Reading a file](#reading-file) * [Debugging](#debugging) +* [Real world use case](#real-world-use-case) * [Resource lists](#resource-lists)
@@ -524,6 +525,99 @@ Have a nice day
+### Real world use case + +With so much copy-paste of commands and their output involved in creating these chapters, mistakes do happen. So a script to check correctness comes in handy. Consider the below markdown file + + ## Some heading + + Some explanation + + ```bash + $ seq 3 + 1 + 2 + 3 + + $ printf 'hi there!\n' + hi there! + ``` + + ## Another heading + + More explanations + + ```bash + $ help -d readarray + readarray - Read lines from a file into an array variable. + + $ a=5 + $ printf "$a\n" + 5 + ``` + +* The whole file is read into an array so that index of next line to be read can be controlled dynamically +* Once a command is identified to be tested + * the expected output is collected into a variable. Multiple lines are concatenated. Some commands do not have stdout to compare against + * accordingly the index of next iteration is corrected +* Note that this is a sample script to demonstrate use of shell script. It is not fool-proof, doesn't have proactive check for possible errors, etc +* Be sure `eval` is being used for known commands like is the case here +* See [Parameter Expansion](http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion) for examples and explanations on string processing constructs + +```bash +#!/bin/bash + +cb_start=0 +readarray -t lines < 'sample.md' + +for ((i = 0; i < ${#lines[@]}; i++)); do + # mark start/end of command block + # Line starting with $ to be verified only between ```bash and ``` + [[ ${lines[$i]:0:7} == '```bash' ]] && ((cb_start=1)) && continue + [[ ${lines[$i]:0:3} == '```' ]] && ((cb_start=0)) && continue + + if [[ $cb_start == 1 && ${lines[$i]:0:2} == '$ ' ]]; then + cmd="${lines[$i]:2}" + + # collect command output lines until line starting with $ or ``` + cmp_str='' + j=1 + while [[ ${lines[$i+$j]:0:2} != '$ ' && ${lines[$i+$j]:0:3} != '```' ]]; do + cmp_str+="${lines[$i+$j]}" + ((j++)) + done + ((i+=j-1)) + + cmd_op=$(eval "$cmd") + if [[ "${cmd_op//$'\n'}" == "${cmp_str//$'\n'}" ]]; then + echo "Pass: $cmd" + else + echo "Fail: $cmd" + fi + fi +done +``` + +* Note how sourcing the script is helpful to take into consideration commands dependent on previous commands + +```bash +$ ./verify_cmds.sh +Pass: seq 3 +Pass: printf 'hi there!\n' +Pass: help -d readarray +Pass: a=5 +Fail: printf "$a\n" + +$ source verify_cmds.sh +Pass: seq 3 +Pass: printf 'hi there!\n' +Pass: help -d readarray +Pass: a=5 +Pass: printf "$a\n" +``` + +
+ ### Resource lists The material in this chapter is only a basic introduction From fabeeaa1a8c7bccb0dd53aa6f94559be830b36d2 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 10 Apr 2017 13:08:21 +0530 Subject: [PATCH 26/76] formatting for gitbook --- Shell_Scripting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Shell_Scripting.md b/Shell_Scripting.md index c2421dc..4a0b915 100644 --- a/Shell_Scripting.md +++ b/Shell_Scripting.md @@ -572,14 +572,14 @@ readarray -t lines < 'sample.md' for ((i = 0; i < ${#lines[@]}; i++)); do # mark start/end of command block - # Line starting with $ to be verified only between ```bash and ``` + # Line starting with $ to be verified only between ```bash and ``` block end [[ ${lines[$i]:0:7} == '```bash' ]] && ((cb_start=1)) && continue [[ ${lines[$i]:0:3} == '```' ]] && ((cb_start=0)) && continue if [[ $cb_start == 1 && ${lines[$i]:0:2} == '$ ' ]]; then cmd="${lines[$i]:2}" - # collect command output lines until line starting with $ or ``` + # collect command output lines until line starting with $ or ``` block end cmp_str='' j=1 while [[ ${lines[$i+$j]:0:2} != '$ ' && ${lines[$i+$j]:0:3} != '```' ]]; do From f526829711399301c50d6b00f681c6e591a5caa3 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 1 Jul 2017 14:30:49 +0530 Subject: [PATCH 27/76] link correction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c2e58d..bbb6d15 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Introduction to Linux commands and Shell scripting # Acknowledgements * [unix.stackexchange](https://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions -* [Devs and Hackers](http://slack.devup.in/) - helpful slack group +* [Devs and Hackers](http://devup.in/) - helpful slack group * [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique
From 31ff5be86c8f36c6d2bf25dcb5b4cc240af2e82a Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 11 Jul 2017 10:08:28 +0530 Subject: [PATCH 28/76] link to gitter chat --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bbb6d15..810751b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +Use [![Join the chat at https://gitter.im/learnbyexample/scripting_course](https://badges.gitter.im/learnbyexample/scripting_course.svg)](https://gitter.im/learnbyexample/scripting_course) if you need help, have suggestions, etc + +
+ # Linux Command Line Introduction to Linux commands and Shell scripting From 326ddac504cf070f1ad352d424a1d720e6c23a56 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 17 Jul 2017 17:59:16 +0530 Subject: [PATCH 29/76] modified examples for cat, tail, head --- Working_with_Files_and_Directories.md | 177 +++++++++++++++++++++----- 1 file changed, 147 insertions(+), 30 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index c223795..09a99dc 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -35,31 +35,59 @@ In this chapter, we will see how to display contents of a file, search within fi **Examples** -* `cat > sample.txt` create a new file for writing, use `Ctrl+d` on a newline to save the file and quit - * [difference between Ctrl+c and Ctrl+d to signal end of stdin input in bash](https://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input-in-bash) -* `cat sample.txt` display the contents of file sample.txt -* `cat power.log timing.log area.log > report.log` concatenate the contents of all three files and save to report.log -* `tac sample.txt` display the lines of file sample.txt in reversed order -* [cat Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cat?sort=votes&pageSize=15) -* [cat Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cat?sort=votes&pageSize=15) +* One or more files can be given as input and hence a lot of times, `cat` is used to quickly see contents of small single file on terminal + * But not needed to simply pass file content as stdin to other commands. See [Useless Use of Cat Award](http://porkmail.org/era/unix/award.html) +* To save the output of concatenation, just redirect stdout ```bash -$ cat > sample.txt -This is an example of adding text to a new file using cat command. -Press Ctrl+d on a newline to save and quit. +$ ls +marks_2015.txt marks_2016.txt marks_2017.txt + +$ cat marks_201* +Name Maths Science +foo 67 78 +bar 87 85 +Name Maths Science +foo 70 75 +bar 85 88 +Name Maths Science +foo 68 76 +bar 90 90 + +$ # save stdout to a file +$ cat marks_201* > all_marks.txt +``` -$ cat sample.txt -This is an example of adding text to a new file using cat command. -Press Ctrl+d on a newline to save and quit. +* often used option is `-A` to see various non-printing characters and end of line -$ wc sample.txt - 2 23 111 sample.txt +```bash +$ printf 'foo\0bar\tbaz \r\n' +foobar baz -$ tac sample.txt -Press Ctrl+d on a newline to save and quit. -This is an example of adding text to a new file using cat command. +$ printf 'foo\0bar\tbaz \r\n' | cat -A +foo^@bar^Ibaz ^M$ ``` +* use `tac` to reverse input line wise + +```bash +$ tac marks_2015.txt +bar 87 85 +foo 67 78 +Name Maths Science + +$ seq 3 | tac +3 +2 +1 +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [cat from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#cat) +* [cat Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cat?sort=votes&pageSize=15) +* [cat Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cat?sort=votes&pageSize=15) +
### less @@ -68,7 +96,7 @@ This is an example of adding text to a new file using cat command. `cat` command is not suitable for viewing contents of large files on the Terminal. `less` displays contents of a file, automatically fits to size of Terminal, allows scrolling in either direction and other options for effective viewing. Usually, `man` command uses `less` command to display the help page. The navigation options are similar to `vi` editor -**Navigation options** +Commonly used commands are given below, press `h` for summary of options * `g` go to start of file * `G` go to end of file @@ -77,11 +105,11 @@ This is an example of adding text to a new file using cat command. * `?pattern` search for the given pattern in backward direction * `n` go to next pattern * `N` go to previous pattern -* `h` help **Example and Further Reading** * `less -s large_filename` display contents of file large_filename using less command, consecutive blank lines are squeezed as single blank line + * Use `-N` option to prefix line number * `less` command is an [improved version](https://unix.stackexchange.com/questions/604/isnt-less-just-more) of `more` command * [differences between most, more and less](https://unix.stackexchange.com/questions/81129/what-are-the-differences-between-most-more-and-less) * [less Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/less?sort=votes&pageSize=15) @@ -94,12 +122,52 @@ This is an example of adding text to a new file using cat command. **Examples** -* `tail report.log` by default display last 10 lines -* `tail -20 report.log` display last 20 lines -* `tail -5 report.log` display last 5 lines -* `tail power.log timing.log` display last 10 lines of both files preceded by filename header -* `tail -q power.log timing.log > result.log` save last 10 lines of both files without filename header to result.log -* `tail -n +3 report.log` display all lines starting from third line (i.e all lines except first two lines) +* By default, `tail` displays last 10 lines +* Use `-n` option to change how many lines are needed + +```bash +$ # last two lines +$ tail -n2 report.log +Error: something seriously went wrong +blah blah blah + +$ # all lines starting from 3rd line i.e all lines except first two lines +$ seq 13 17 | tail -n +3 +15 +16 +17 +``` + +* multiple file input + +```bash +$ # use -q option to avoid filename in output +$ tail -n2 report.log sample.txt +==> report.log <== +Error: something seriously went wrong +blah blah blah + +==> sample.txt <== +He he he +Adios amigo +``` + +* characterwise extraction + * Note that this works byte wise and not suitable for multi-byte character encodings + +```bash +$ # last three characters including the newline character +$ echo 'Hi there!' | tail -c3 +e! + +$ # excluding the first character +$ echo 'Hi there!' | tail -c +2 +i there! +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [tail from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#tail) * [tail Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/tail?sort=votes&pageSize=15) * [tail Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/tail?sort=votes&pageSize=15) @@ -111,10 +179,59 @@ This is an example of adding text to a new file using cat command. **Examples** -* `head report.log` display first 10 lines -* `head -20 report.log | tail report.log` display lines 11 to 20 -* `tail -30 report.log | head -5 report.log` display 5 lines prior to last 25 lines of file -* `head -n -2 report.log` display all but last 2 lines +* By default, `head` displays first 10 lines +* Use `-n` option to change how many lines are needed + +```bash +$ head -n3 report.log +blah blah +Warning: something went wrong +more blah + +$ # tail gives last 10 lines, head then gives first 2 from tail output +$ tail sample.txt | head -n2 +Just do-it +Believe it + +$ # except last 2 lines +$ seq 13 17 | head -n -2 +13 +14 +15 +``` + +* multiple file input + +```bash +$ # use -q option to avoid filename in output +$ head -n3 report.log sample.txt +==> report.log <== +blah blah +Warning: something went wrong +more blah + +==> sample.txt <== +Hello World! + +Good day +``` + +* characterwise extraction + * Note that this works byte wise and not suitable for multi-byte character encodings + +```bash +$ # first two characters +$ echo 'Hi there!' | head -c2 +Hi + +$ # excluding last four characters +$ echo 'Hi there!' | head -c -4 +Hi the +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [head from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#head) * [head Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/head?sort=votes&pageSize=15)
From a1862c2f33f37712ec7e951df697d29ee188ec6c Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 25 Jul 2017 16:03:56 +0530 Subject: [PATCH 30/76] modified examples for wc and du --- Working_with_Files_and_Directories.md | 113 ++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 16 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 09a99dc..78422f3 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -548,12 +548,57 @@ Faster alternative to `find` command when searching for a file by its name. It i **Examples** -* `wc power.log` outputs no. of lines, words and characters separated by white-space and followed by filename -* `wc -l power.log` outputs no. of lines followed by filename -* `wc -w power.log` outputs no. of words followed by filename -* `wc -c power.log` outputs no. of characters followed by filename -* `wc -l < power.log` output only the number of lines -* `wc -L power.log` length of longest line followed by filename +```bash +$ # by default, gives newline/word/byte count (in that order) +$ wc sample.txt + 5 17 78 sample.txt + +$ # options to get only newline/word/byte count +$ wc -l sample.txt +5 sample.txt +$ wc -w sample.txt +17 sample.txt +$ wc -c sample.txt +78 sample.txt + +$ # use shell input redirection if filename is not needed +$ wc -l < sample.txt +5 +``` + +* multiple file input + +```bash +$ # automatically displays total at end +$ wc *.txt + 5 10 57 fruits.txt + 2 6 32 greeting.txt + 5 17 78 sample.txt + 12 33 167 total +``` + +* other options + +```bash +$ # use -L to get length of longest line +$ # won't count non-printable characters, tabs are converted to equivalent spaces +$ wc -L < sample.txt +24 +$ printf 'foo\tbar\0baz' | wc -L +14 +$ printf 'foo\tbar\0baz' | awk '{print length()}' +11 + +$ # -c gives byte count, -m gives character count +$ printf 'hi👍' | wc -m +3 +$ printf 'hi👍' | wc -c +6 +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [wc from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#wc) * [wc Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/wc?sort=votes&pageSize=15) * [wc Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/wc?sort=votes&pageSize=15) @@ -563,18 +608,54 @@ Faster alternative to `find` command when searching for a file by its name. It i >estimate file space usage -* du command is useful to get size of files and folders, not for file systems - **Examples** -* `du project_report` display size (default unit is 1024 bytes) of folder project_report as well as it sub-directories -* `du --si project_report` display size (unit is 1000 bytes) of folder project_report as well as it sub-directories -* `du -h project_report` display size in human readable format for folder project_report as well as it sub-directories -* `du -ah project_report` display size in human readable format for folder project_report and all of its files and sub-directories -* `du -sh project_report` display size only for project_report folder in human readable format -* `du -sm * | sort -n` sort files and folders of current directory, numbers displayed are in Megabytes - * use `sort -nr` to reverse sort order, i.e largest at top -* `du -sh * | sort -h` sort files and folders of current directory, output displayed in human-readable format +```bash +$ # By default, size is given in size of 1024 bytes +$ # Files are ignored, all directories and sub-directories are recursively reported +$ # add -a option if files are also needed and -L if links should be dereferenced +$ du +17920 ./projs/full_addr +14316 ./projs/half_addr +32952 ./projs +33880 . + +$ # use -s to show total directory size without descending into sub-directories +$ du -s projs words.txt +32952 projs +924 words.txt +``` + +* different size formatting options + +```bash +$ # number of bytes +$ du -b words.txt +938848 words.txt + +$ # kilobytes = 1024 bytes +$ du -sk projs +32952 projs + +$ # megabytes = 1024 kilobytes +$ du -sm projs +33 projs + +$ # human readable, use --si for powers of 1000 instead of 1024 +$ du -h words.txt +924K words.txt + +$ # sorting +$ du -sh projs/* words.txt | sort -h +712K projs/report.log +924K words.txt +14M projs/half_addr +18M projs/full_addr +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [du from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#du) * [du Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/disk-usage?sort=votes&pageSize=15) * [du Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/du?sort=votes&pageSize=15) From 4ecc180e6efc4cd7644f19b69ec354d9faa87936 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 27 Jul 2017 11:31:27 +0530 Subject: [PATCH 31/76] modified examples for df, touch and file commands --- Working_with_Files_and_Directories.md | 124 +++++++++++++++++++------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 78422f3..5e64ce3 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -13,7 +13,6 @@ * [df](#df) * [touch](#touch) * [file](#file) -* [identify](#identify) * [basename](#basename) * [dirname](#dirname) * [chmod](#chmod) @@ -621,6 +620,7 @@ $ du 33880 . $ # use -s to show total directory size without descending into sub-directories +$ # add -c to also show total size at end $ du -s projs words.txt 32952 projs 924 words.txt @@ -667,8 +667,41 @@ $ du -sh projs/* words.txt | sort -h **Examples** -* `df -h` display usage statistics of all available file systems -* `df -h .` display usage of only the file system where the current working directory is located +```bash +$ # use df without arguments to get information on all currently mounted file systems +$ df . +Filesystem 1K-blocks Used Available Use% Mounted on +/dev/sda1 98298500 58563816 34734748 63% / + +$ # use -B option for custom size +$ # use --si for size in powers of 1000 instead of 1024 +$ df -h . +Filesystem Size Used Avail Use% Mounted on +/dev/sda1 94G 56G 34G 63% / +``` + +* Use `--output` to report only specific fields of interest + +```bash +$ df -h --output=size,used,file / /media/learnbyexample/projs + Size Used File + 94G 56G / + 92G 35G /media/learnbyexample/projs + +$ df -h --output=pcent . +Use% + 63% + +$ df -h --output=pcent,fstype | awk -F'%' 'NR>2 && $1>=40' + 63% ext3 + 40% ext4 + 51% ext4 +``` + + +**Further Reading** + +* For more detailed examples and discussion, see section [df from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#df) * [df Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/df?sort=votes&pageSize=15)
@@ -677,19 +710,41 @@ $ du -sh projs/* words.txt | sort -h >change file timestamps -Used to change file time stamps. But if file doesn't exist, the command will create an empty file with the name provided. Both features are quite useful +**Examples** + +```bash +$ # last access and modification time +$ stat -c $'%x\n%y' fruits.txt +2017-07-19 17:06:01.523308599 +0530 +2017-07-13 13:54:03.576055933 +0530 + +$ # Updating both access and modification timestamp to current time +$ # add -a to change only access timestamp and -m to change only modification +$ touch fruits.txt +$ stat -c $'%x\n%y' fruits.txt +2017-07-21 10:11:44.241921229 +0530 +2017-07-21 10:11:44.241921229 +0530 + +$ # copy both access and modification timestamp from power.log to report.log +$ # add -a or -m as needed +$ # See also -d and -t options +$ touch -r power.log report.log +``` -* Some program may require a particular file to be present to work, empty file might even be a valid argument. In such cases, a pre-processing script can scan the destination directories and create empty file if needed -* Similarly, some programs may behave differently according to the time stamps of two or more files - while debugging in such an environment, user might want to just change the time stamp of files +* If file doesn't exist, an empty one gets created unless -c is used -**Examples** +```bash +$ ls foo.txt +ls: cannot access 'foo.txt': No such file or directory -* `touch new_file.txt` create an empty file if it doesn't exist in current directory - * use `-c` if new file shouldn't be created - * use `-a` option to change only access time and `-m` to change only modification time -* `touch report.log` change the time stamp of report.log to current time (assuming report.log already exists in current directory) -* `touch -r power.log report.log` use time stamp of power.log instead of current time to change that of report.log - * use `-d` to provide time stamp from a string instead of file +$ touch foo.txt +$ ls foo.txt +foo.txt +``` + +**Further Reading** + +* For more detailed examples and discussion, see section [touch from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#touch) * [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15)
@@ -703,34 +758,37 @@ Used to change file time stamps. But if file doesn't exist, the command will cre ```bash $ file sample.txt sample.txt: ASCII text +$ printf 'hi👍\n' | file - +/dev/stdin: UTF-8 Unicode text +$ file ch +ch: Bourne-Again shell script, ASCII text executable -$ file sunset.jpg -sunset.jpg: JPEG image data - -$ mv sunset.jpg xyz -$ file xyz -xyz: JPEG image data +$ printf 'hi\r\n' | file - +/dev/stdin: ASCII text, with CRLF line terminators -$ file perl.png -perl.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced +$ file sunset.jpg moon.png +sunset.jpg: JPEG image data +moon.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced ``` -
- -### identify - ->describes the format and characteristics of one or more image files - -Although file command can also give information like pixel dimensions and image type, identify is more reliable command for images and gives complete format information +* find all files of particular type in current directory, for example `image` files ```bash -$ identify sunset.jpg -sunset.jpg JPEG 740x740 740x740+0+0 8-bit DirectClass 110KB 0.000u 0:00.030 - -$ identify perl.png -perl.png PNG 32x32 32x32+0+0 8-bit DirectClass 838B 0.000u 0:00.000 +$ find -type f -exec bash -c '(file -b "$0" | grep -wq "image data") && echo "$0"' {} \; +./sunset.jpg +./moon.png + +$ # if filenames do not contain : or newline characters +$ find -type f -exec file {} + | awk -F: '/\/{print $1}' +./sunset.jpg +./moon.png ``` +**Further Reading** + +* For more detailed examples and discussion, see section [file from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#file) +* See also `identify` command which `describes the format and characteristics of one or more image files` +
### basename From f7f1060fc97cca8ff2583f2ec0e988cf649b5785 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 27 Jul 2017 12:00:29 +0530 Subject: [PATCH 32/76] modified basename and dirname examples --- Working_with_Files_and_Directories.md | 44 +++++++++++++++++++++------ 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 5e64ce3..604c033 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -795,38 +795,64 @@ $ find -type f -exec file {} + | awk -F: '/\/{print $1}' >strip directory and suffix from filenames +**Examples** + ```bash -$ pwd +$ # same as using pwd command +$ echo "$PWD" /home/learnbyexample -$ basename $PWD +$ basename "$PWD" learnbyexample -$ basename '/home/learnbyexample/proj_adder/power.log' +$ # use -a option if there are multiple arguments +$ basename -a foo/a/report.log bar/y/power.log +report.log power.log -$ #use suffix option -s to strip file extension from filename -$ basename -s '.log' '/home/learnbyexample/proj_adder/power.log' +$ # use single quotes if arguments contain space and other special shell characters +$ # use suffix option -s to strip file extension from filename +$ basename -s '.log' '/home/learnbyexample/proj adder/power.log' +power +$ # -a is implied when using -s option +$ basename -s'.log' foo/a/report.log bar/y/power.log +report power ``` +* For more detailed examples and discussion, see section [basename from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/miscellaneous.md#basename) +
### dirname >strip last component from file name +**Examples** + ```bash -$ pwd +$ echo "$PWD" /home/learnbyexample -$ dirname $PWD +$ dirname "$PWD" /home -$ dirname '/home/learnbyexample/proj_adder/power.log' -/home/learnbyexample/proj_adder +$ # use single quotes if arguments contain space and other special shell characters +$ dirname '/home/learnbyexample/proj adder/power.log' +/home/learnbyexample/proj adder + +$ # unlike basename, by default dirname handles multiple arguments +$ dirname foo/a/report.log bar/y/power.log +foo/a +bar/y + +$ # if no / in argument, output is . to indicate current directory +$ dirname power.log +. ``` +* For more detailed examples and discussion, see section [dirname from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/miscellaneous.md#dirname) +
### chmod From 309ebf1da19313a93cb99949220043adf02b26a9 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 12 Mar 2018 11:50:54 +0530 Subject: [PATCH 33/76] corrected description for chmod +w --- Working_with_Files_and_Directories.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 604c033..3925673 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -1065,12 +1065,14 @@ rm: remove write-protected regular empty file ‘linux_tutorial/report/power.log rm: cannot remove ‘linux_tutorial/report/power.log’: Permission denied ``` -* `+r -r +x -x` without `u g o` qualifier affects all the three categories -* `+w -w` without `u g o` qualifier affects only user and group categories +* What permissions are affected by `+-/rwx` depends on `umask` value as well. It is usually `002` which means + * `+r -r +x -x` without `u g o` qualifier affects all the three categories + * `+w -w` without `u g o` qualifier affects only user and group categories **Further Reading** * [Linux File Permissions](https://www.linux.com/learn/getting-know-linux-file-permissions) * [Linux Permissions Primer](https://danielmiessler.com/study/unixlinux_permissions/) +* [unix.stackexchange - Why chmod +w filename not giving write permission to other](https://unix.stackexchange.com/questions/429421/why-chmod-w-filename-not-giving-write-permission-to-othero) * [chmod Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/chmod?sort=votes&pageSize=15) * [chmod Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/chmod?sort=votes&pageSize=15) From a646c51d76f682f4fab02b2aa94411e740d10f27 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 29 Mar 2018 15:22:50 +0530 Subject: [PATCH 34/76] added Contributing guidelines --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 810751b..83fb6d7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Use [![Join the chat at https://gitter.im/learnbyexample/scripting_course](https://badges.gitter.im/learnbyexample/scripting_course.svg)](https://gitter.im/learnbyexample/scripting_course) if you need help, have suggestions, etc +[![Join the chat at https://gitter.im/learnbyexample/scripting_course](https://badges.gitter.im/learnbyexample/scripting_course.svg)](https://gitter.im/learnbyexample/scripting_course) [![support learnbyexample](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/learnbyexample/donate)
@@ -32,6 +32,18 @@ Introduction to Linux commands and Shell scripting
+## Contributing + +* Please open an issue for typos/bugs/suggestions/etc + * Even for pull requests, open an issue for discussion before submitting PRs + * or [gitter group chat](https://gitter.im/learnbyexample/scripting_course) for discussion as well as for help/mentorship +* Share the repo with friends/colleagues, on social media, etc to help reach other learners +* Contribute by donating on [liberapay](https://liberapay.com/learnbyexample/donate) +* In case you need to reach me, use [gitter private chat](https://gitter.im/learnbyexample) + * or mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` + +
+ # ebook * Read as ebook on [gitbook](https://learnbyexample.gitbooks.io/linux-command-line/content/index.html) @@ -43,7 +55,7 @@ Introduction to Linux commands and Shell scripting * [unix.stackexchange](https://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions * [Devs and Hackers](http://devup.in/) - helpful slack group -* [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique +* Forums like [/r/commandline/](https://www.reddit.com/r/commandline/), [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique
From 8963268ef2ebfd0f8f899914657551836aa09588 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 27 Apr 2018 18:29:10 +0530 Subject: [PATCH 35/76] link corrections --- Working_with_Files_and_Directories.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md index 3925673..c81d0f2 100644 --- a/Working_with_Files_and_Directories.md +++ b/Working_with_Files_and_Directories.md @@ -242,8 +242,8 @@ For editing text files, the following applications can be used. Of these, `gedit Easy to use * [gedit](https://wiki.gnome.org/Apps/Gedit) -* [geany](http://www.geany.org/) -* [nano](http://nano-editor.org/) +* [geany](https://www.geany.org/) +* [nano](https://nano-editor.org/) Powerful text editors @@ -446,15 +446,12 @@ Yellow **Further Reading** +* For more detailed examples and discussion, see [GNU grep chapter from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/gnu_grep.md) * [how grep command was born](https://medium.com/@rualthanzauva/grep-was-a-private-command-of-mine-for-quite-a-while-before-i-made-it-public-ken-thompson-a40e24a5ef48) * [why GNU grep is fast](https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html) -* [grep tutorial](http://www.panix.com/~elflord/unix/grep.html) -* [grep examples](http://alvinalexander.com/unix/edu/examples/grep.shtml) * [Difference between grep, egrep and fgrep](https://unix.stackexchange.com/questions/17949/what-is-the-difference-between-grep-egrep-and-fgrep) * [grep Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/grep?sort=votes&pageSize=15) * [grep Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/grep?sort=votes&pageSize=15) -* [ucg](https://github.com/gvansickle/ucg) - UniversalCodeGrep (ucg) is an extremely fast grep-like tool specialized for searching large bodies of source code -
@@ -512,9 +509,8 @@ Passing filtered files as input to other commands **Further Reading** -* [using find](http://mywiki.wooledge.org/UsingFind) -* [find examples on SO](https://stackoverflow.com/documentation/bash/566/find#t=201612140534548263961) -* [Collection of find examples](http://alvinalexander.com/unix/edu/examples/find.shtml) +* [using find](https://mywiki.wooledge.org/UsingFind) +* [Collection of find examples](https://alvinalexander.com/unix/edu/examples/find.shtml) * [find Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/find?sort=votes&pageSize=15) * [find and tar example](https://unix.stackexchange.com/questions/282762/find-mtime-1-print-xargs-tar-archives-all-files-from-directory-ignoring-t/282885#282885) * [find Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/find?sort=votes&pageSize=15) @@ -1076,3 +1072,4 @@ rm: cannot remove ‘linux_tutorial/report/power.log’: Permission denied * [unix.stackexchange - Why chmod +w filename not giving write permission to other](https://unix.stackexchange.com/questions/429421/why-chmod-w-filename-not-giving-write-permission-to-othero) * [chmod Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/chmod?sort=votes&pageSize=15) * [chmod Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/chmod?sort=votes&pageSize=15) + From 25bf84d7c99eabc3b2ceb5a599e64f097ba10be9 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 27 Apr 2018 18:56:18 +0530 Subject: [PATCH 36/76] link and example corrections --- Files_and_Directories.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 176cb2a..82f3be4 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -73,7 +73,7 @@ Apart from knowing your current working directory, often used to copy the absolu * `ls -ltr` list files of current directory with details sorted such that latest created/modified file is displayed last * [ls Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ls?sort=votes&pageSize=15) * [ls Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ls?sort=votes&pageSize=15) -* [avoid parsing output of ls](http://mywiki.wooledge.org/ParsingLs) +* [avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) * [why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls)
@@ -184,7 +184,7 @@ The destination path is always specified as the last argument. More than one sou Also check out * `rsync` a fast, versatile, remote (and local) file-copying tool -* [rsync examples](http://www.tutorialspoint.com/articles/rsync-command-examples-on-linux) +* [rsync examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) * [rsync Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rsync?sort=votes&pageSize=15) * [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15) @@ -258,13 +258,13 @@ Archive and Compression * `tar -cvf backup_mar15.tar project results` create backup_mar15.tar of files/folders project and results * `-v` option stands for verbose, i.e displays all the files and directories being archived * `gzip backup_mar15.tar` overwrites backup_mar15.tar with backup_mar15.tar.gz, a compressed version -* `tar cvfz backup_mar15.tar.gz project results` create backup_mar15.tar and overwrite with backup_mar15.tar.gz +* `tar -cvzf backup_mar15.tar.gz project results` create backup_mar15.tar and overwrite with backup_mar15.tar.gz Extract archive and Decompression * `gunzip backup_mar15.tar.gz` decompress and overwrite as backup_mar15.tar * `tar -xvf backup_mar15.tar` extract archived files to current directory -* `tar xvfz backup_mar15.tar.gz` decompress and extract archived files to current directory +* `tar -xzvf backup_mar15.tar.gz` decompress and extract archived files to current directory z commands From ae6065ae51d49d254f44e43414e0fee50e70347c Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 2 Jul 2018 17:52:41 +0530 Subject: [PATCH 37/76] Improvements, corrections and formatting --- Linux_Introduction.md | 57 ++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/Linux_Introduction.md b/Linux_Introduction.md index 31b4ab4..018be2d 100644 --- a/Linux_Introduction.md +++ b/Linux_Introduction.md @@ -1,14 +1,16 @@ # Linux Introduction -* [What is Linux?](#what-is-linux?) -* [Why use Linux?](#why-use-linux?) -* [Where is Linux deployed?](#where-is-linux-deployed?) +**Table of Contents** + +* [What is Linux?](#what-is-linux) +* [Why use Linux?](#why-use-linux) +* [Where is Linux deployed?](#where-is-linux-deployed) * [Linux Distros](#linux-distros) * [Linux resource lists](#linux-resource-lists)
-### What is Linux? +## What is Linux? Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) @@ -16,56 +18,55 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux)
-### Why use Linux? +## Why use Linux? -* Speed, Security, Stability +* Faster, Secure, Stable + * it helps that developers from all over the world contribute, instead of just a single company * Highly configurable -* Multiuser environment by default +* Suitable for both single/multiuser environment * Well defined hierarchy and permissions to allow networking across different groups and sites * Strong set of commands to automate repetitive manual tasks -* Read more on using Linux and does it fit your computing needs on [computefreely](http://computefreely.org/) +* Read more on using Linux and whether it fits your computing needs on [computefreely](https://computefreely.org/)
-### Where is Linux deployed? +## Where is Linux deployed? * Servers * Supercomputers - * To quote [TOP500 article on wiki](https://en.wikipedia.org/wiki/TOP500), "As of November 2015, 494 or 98.8% of the world's fastest supercomputers use the Linux kernel" -* Embedded Systems -* Smart phone and similar + * To quote [TOP500 article on wikipedia](https://en.wikipedia.org/wiki/TOP500), "Since November 2017, all the listed supercomputers (100% of the performance share) use an operating system based on the Linux kernel" +* Embedded/IoT devices like POS, Raspberry Pi +* Smart phones * Android - built on top of Linux kernel * iOS - Unix based * Personal and Enterprise Computers * And many more uses, thanks to being open source -* [Usage Share of Operating Systems](http://en.wikipedia.org/wiki/Usage_share_of_operating_systems) +* [Usage Share of Operating Systems](https://en.wikipedia.org/wiki/Usage_share_of_operating_systems)
-### Linux Distros +## Linux Distros -Like how numerous programming languages exist, there are various Linux flavors called 'distribution' (distros for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case +There are various Linux flavors called 'distribution' (distros for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case -* There are [hundreds of known distributions](http://en.wikipedia.org/wiki/List_of_Linux_distributions) -* One can keep track of them at [distrowatch](http://distrowatch.com/) - * [Statistics of various Linux Distros](http://distrowatch.com/dwres.php?resource=popularity) -* [Popular Linux Distros compared](http://www.howtogeek.com/191207/10-of-the-most-popular-linux-distributions-compared/) -* [Light Weight Linux Distros](http://www.linux.com/news/software/applications/780781-6-excellent-lightweight-linux-distros-for-x86-and-arm) - * Check out article comments also +* There are [hundreds of known distributions](https://en.wikipedia.org/wiki/List_of_Linux_distributions) +* One can keep track of them at [distrowatch](https://distrowatch.com/) + * [Statistics of various Linux Distros](https://distrowatch.com/dwres.php?resource=popularity) +* [Popular Linux Distros compared](https://www.howtogeek.com/191207/10-of-the-most-popular-linux-distributions-compared/) +* [Light Weight Linux Distros](https://en.wikipedia.org/wiki/Light-weight_Linux_distribution) **Installation** Usually, you'll find installation instructions from respective website of the distro you chose. If you need an overview of installation process, this should help -* [Installing Nearly Any Distro On Just About Any Machine](http://www.newnix.space/blog/2015/7/6/installing-nearly-any-distro-on-just-about-any-machine) -* [Try out Linux on Virtual Machine](http://www.storagecraft.com/blog/the-dead-simple-guide-to-installing-a-linux-virtual-machine-on-windows/) +* [Installing Nearly Any Distro On Just About Any Machine](https://www.newnix.space/blog/2015/7/6/installing-nearly-any-distro-on-just-about-any-machine) +* [Try out Linux on Virtual Machine](https://blog.storagecraft.com/the-dead-simple-guide-to-installing-a-linux-virtual-machine-on-windows/)
-### Linux resource lists +## Linux resource lists * [Linux curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Linux_curated_resources.md) -* [awesome linux by Aleksandar](https://github.com/aleksandar-todorovic/awesome-linux) -* [awesome linux resources by itech001](https://github.com/itech001/awesome-linux-resources) -* [linux by Paul](https://linux.zeef.com/paul.reiber) -* [tutorials collection](http://alvinalexander.com/linux/unix-linux-command-tutorials-collection) +* [Awesome linux by Aleksandar](https://github.com/aleksandar-todorovic/awesome-linux) +* [Linux resources by Paul](https://linux.zeef.com/paul.reiber) + From fc66d870162298a820512e814f4f76e31786ba61 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 3 Jul 2018 18:57:40 +0530 Subject: [PATCH 38/76] improved descriptions and examples, formatting --- Command_Line_Introduction.md | 206 ++++++++++++++++++++++++----------- 1 file changed, 145 insertions(+), 61 deletions(-) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 6475d63..59fda8b 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -1,27 +1,32 @@ # Command Line introduction +**Table of Contents** + * [File System](#file-system) + * [Absolute and Relative paths](#absolute-and-relative-paths) * [Command Line Interface](#command-line-interface) * [Command Help](#command-help) -* [Do one thing and do it well](#do-one-thing-well) +* [Do one thing and do it well](#do-one-thing-and-do-it-well) + * [Command Structure](#command-structure) + * [Command Network](#command-network) +
For any thing that is repetitive or programmable, there likely is a relevant command. Ask your peers or search online before you start writing a script. Just remember that Unix was first introduced in late 1960s - there is likely to be a command for what you need Starting trouble with command line (for those accustomed to GUI) is the sudden trouble of interacting with the computer using just text commands. After using for a week or so, things will seem very systematic and GUI feels ill suited for frequent tasks. With continuous use, recalling various commands becomes easier. Short-cuts, history, aliases and tab-completion help in the process -If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into tiny screen and plethora of multi-purpose buttons. Commands and short-cuts pack much more punch than that on a terminal. +If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into tiny screen and plethora of multi-purpose buttons. Commands and short-cuts pack much more punch than that on a terminal -* Commands presented here are GNU/Linux specific and generally behave similarly across distros -* Commands in GNU/Linux usually have a few different options and syntax than [POSIX](http://en.wikipedia.org/wiki/POSIX) specification - * `man` and `info` pages of commands come in handy -* If any command is not found in a particular distro, either it has to be manually installed or not available for that distro +* Commands presented here are Linux specific and generally behave similarly across distros +* Commands in Linux usually have added features compared to [POSIX](https://en.wikipedia.org/wiki/POSIX) specification +* If any command is not found in a particular distro, either it has to be manually installed or probably an alternate exists * The **bash** shell version 4+ is used throughout this material * [rough overview of changes to Bash over time](http://wiki.bash-hackers.org/scripting/bashchanges)
-### File System +## File System Before we dive into ocean of commands, lets get a brief on Linux file system. If you've used Windows, you would be familiar with `C:` `D:` etc. In Linux, directory structure starts with `/` symbol, which is referred as the `root` directory @@ -35,7 +40,9 @@ In Linux, directory structure starts with `/` symbol, which is referred as the ` * `/usr/bin` This is the primary directory for executable programs. Most programs executed by normal users which are not needed for booting or for repairing the system and which are not installed locally should be placed in this directory. * `/usr/share` This directory contains subdirectories with specific application data, that can be shared among different architectures of the same OS. Often one finds stuff here that used to live in /usr/doc or /usr/lib or /usr/man. -**Absolute and Relative paths** +
+ +#### Absolute and Relative paths Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_and_relative_paths) @@ -45,7 +52,7 @@ Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_ * `/home/learnbyexample` absolute path * `../design` relative path -* [~/Documents is a relative or an absolute path?](https://unix.stackexchange.com/questions/221970/is-documents-a-relative-or-an-absolute-path) +* [unix.stackexchange: Is ~/Documents a relative or an absolute path?](https://unix.stackexchange.com/questions/221970/is-documents-a-relative-or-an-absolute-path) **Further Reading** @@ -54,67 +61,140 @@ Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_
-### Command Line Interface +## Command Line Interface + +Command Line Interface (CLI) allows us interact with computer using text commands -Command Line Interface (CLI) allows us interact with computer using text commands -For example: opening a Terminal, typing `ls` and pressing **Enter** key - the `ls` command lists the contents of a directory. To do the same thing in GUI, you double-click on the directory to view its content +For example: the `cd` command would help navigating to a particular directory and `ls` command to view contents of a directory. In GUI, you'd use an explorer for directory navigation by point and click, directory contents are shown by default -Shell and Terminal are sometimes interchangeably used to mean the same thing - a prompt where user enters and executes commands. They are [quite different](https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con) +Shell and Terminal are sometimes interchangeably used to mean the same thing - a prompt where user types and executes commands. However, they are [quite different](https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con) -* **Shell** command line interpreter -* **Terminal** text input/output environment -* `cat /etc/shells` to know which shells are available -* `echo "$SHELL"` to know which is your login-shell +* **Shell** is command line interpreter, sets the syntax rules for invoking commands, etc +* **Terminal** text input/output environment, responsible for visual details like font size, color, etc + +We'll learn more about Shell in later chapters. For now, open a Terminal and try these commands by typing them and pressing Enter key. You can spot the command lines by the prompt `$` at start of line + +```bash +$ cat /etc/shells +# /etc/shells: valid login shells +/bin/sh +/bin/dash +/bin/bash +/bin/rbash +/bin/tcsh +/usr/bin/tcsh + +$ echo "$SHELL" +/bin/bash +``` + +Note: Your command prompt might be different, for now you can leave it as or change it to the simple prompt I prefer by executing `PS1="$ "`
-### Command Help +## Command Help + +Most distros for personal use come with documentation for commands already installed. Getting used to reading manual from terminal is handy and there are various ways to get specific information -* `man man` get help about manual pages +* `man` command is an interface to reference manuals * usually displayed using `less` command, press `q` key to quit the man page and `h` key to get help - * for GNU/Linux commands, the `info` command has more detailed documentation -* `man bash` manual page for `bash` - * `gvim <(man bash)` open the manual page in text editor instead of displaying in terminal -* `man -k printf` search manual pages for `printf` + * for Linux commands, the `info` command gives the complete documentation + * you could also read them online, for ex: [GNU Coreutils manual](https://www.gnu.org/software/coreutils/manual/coreutils.html) has manuals for most of the commands covered in this material +* `man man` will give details about the `man` command itself +* `man bash` will give you the manual page for `bash` + * `man find | gvim -` to open the manual page in your favorite text editor +* `man -k printf` will search the short descriptions in all the manual pages for the string `printf` + * `-k` here is a command option * `man -k` is equivalent for `apropos` command -* `type` Display information about command type - * `type cd` cd is a shell builtin - * `type sed` sed is /bin/sed - * `type ls` ls is aliased to `ls --color=auto` -* Use `help` for builtin commands +* Excellent resource [unix.stackexchange: How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) + +For certain operations, shell provides its own set of commands, referred as builtin commands + +* `type` will display information about command type +* typically used to get path of command or expand alias/function + +```bash +$ type cd +cd is a shell builtin +$ type sed +sed is /bin/sed + +$ multiple commands can be given as arguments +$ type pwd awk +pwd is a shell builtin +awk is /usr/bin/awk + +$ type ls +ls is aliased to `ls --color=auto' +$ type -a ls +ls is aliased to `ls --color=auto' +ls is /bin/ls +``` + +* `help` command provides documentation for builtin commands * `help help` help page on `help` command - * `help -m cd` display usage in pseudo-manpage format for `cd` command - * `help -d compgen` use -d option to output short description for each topic - * `help` display all shell commands that are defined internally -* `whatis` display one-line manual page descriptions - * `whatis grep` print lines matching a pattern -* `whereis` locate the binary, source, and manual page files for a command - * `whereis awk` awk: /usr/bin/awk /usr/bin/X11/awk /usr/share/awk /usr/share/man/man1/awk.1.gz -* `history` Display or manipulate the history list + * `-m` option will display usage in pseudo-manpage format + * `-d` option gives short description for each topic, similar to `whatis` command + * `help` command by itself without any argument displays all shell commands that are defined internally -**Further Reading** +``` +$ help pwd +pwd: pwd [-LP] + Print the name of the current working directory. + + Options: + -L print the value of $PWD if it names the current working directory + -P print the physical directory, without any symbolic links + + By default, `pwd' behaves as if `-L' were specified. + + Exit Status: + Returns 0 unless an invalid option is given or the current directory + cannot be read. + +$ help -d compgen +compgen - Display possible completions depending on the options. +``` -* Excellent resource: [How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) -* [explainshell](http://explainshell.com/) write down a command line to see the help text that matches each argument - * example: [find . -type f -print0](http://explainshell.com/explain?cmd=find%20.%20-type%20f%20-print0) - * [ch](https://github.com/learnbyexample/command_help) similar functionality from command line, doesn't have all features of explainshell though -* [which, whatis, whereis examples](http://www.thegeekstuff.com/2013/04/linux-which-whatis-whereis/) +Here's some more companion commands -
+* `whatis` displays one-line manual page descriptions +* `whereis` locates the binary, source, and manual page files for a command +* [explainshell](https://explainshell.com/) is a web app that shows the help text that matches each argument of command line + * example: [tar xzvf archive.tar.gz](https://explainshell.com/explain?cmd=tar%20xzvf%20archive.tar.gz) +* [ch](https://github.com/learnbyexample/command_help) is a script, inspired by explainshell, to extract option descriptions from man/help pages + +``` +$ whatis grep +grep (1) - print lines matching a pattern + +$ whereis awk +awk: /usr/bin/awk /usr/share/awk /usr/share/man/man1/awk.1.gz -### Do one thing and do it well +$ ch sort -k + sort - sort lines of text files -[Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) + -k, --key=KEYDEF + sort via a key; KEYDEF gives location and type +``` + +
->Write programs that do one thing and do it well. +## Do one thing and do it well ->Write programs to work together. +The [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) applies to Linux as well: ->Write programs to handle text streams, because that is a universal interface. +>Write programs that do one thing and do it well +> +>Write programs to work together +> +>Write programs to handle text streams, because that is a universal interface Examples given below are for demonstration purposes only, more detail in later chapters -**Command Structure** +
+ +#### Command Structure only the command @@ -130,41 +210,45 @@ command with arguments * `mkdir project` create directory named 'project' in current working directory * `man sort` manual page for `sort` command -* `wget http://s.ntnu.no/bashguide.pdf` download file from internet +* `wget https://s.ntnu.no/bashguide.pdf` download file from internet command with options and arguments * `rm -r project` remove 'project' directory -* `find . -name '*log*'` print files in current directory (and its sub-directories) whose name contains the string 'log' +* `paste -sd, ip.txt` combine all lines from 'ip.txt' file to single line using `,` as delimiter single quotes vs double quotes * **single quotes** preserves the literal value of each character within the quotes * **double quotes** preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\', and, when history expansion is enabled, '!' -* [Difference between single and double quotes](https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash) - -Example: +* See also [stackoverflow: Difference between single and double quotes](https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash) ```bash $ echo '$SHELL' $SHELL + $ echo "$SHELL" /bin/bash ``` -**Command Network** +
+ +#### Command Network Redirecting output of a command * to another command * `du -sh * | sort -h` calculate size of files/folders, display size in human-readable format which is then sorted * to a file (instead of displaying on terminal) - * `grep -i 'pass' *.log > pass_list.txt` writes/overwrites to file - * `grep -i 'error' *.log >> errors.txt` appends to file + * `grep 'pass' *.log > pass_list.txt` writes to file (if file already exists, it is overwritten) + * `grep 'error' *.log >> errors.txt` appends to file (creates new file if necessary) +* to a variable + * `p=$(pwd)` saves the output of `pwd` command in variable `p`, there should be no spaces around `=` Redirecting input -* `wc -l < file.txt` in this case, useful to get just the number of lines, without displaying file name +* `wc -l < file.txt` useful to get just the number of lines, without displaying file name +* `tr 'a-z' 'A-Z' < ip.txt` some commands like `tr` only work on stdin Redirecting error @@ -172,11 +256,11 @@ Redirecting error Redirecting output of command as input file -* `comm -23 <(sort file1.txt) <(sort file2.txt)` allows to create named pipes, effectively avoiding need to create temporary files +* `comm -23 <(sort file1.txt) <(sort file2.txt)` process substitution, avoids need to create temporary files Combining output of several commands -* `(head -5 ~/.vimrc ; tail -5 ~/.vimrc) > vimrc_snippet.txt` multiple commands can be grouped in `()` and redirected as if single command output +* `(head -n5 ~/.vimrc ; tail -n5 ~/.vimrc) > vimrc_snippet.txt` multiple commands (separated by `;`) can be grouped inside a list Command substitution @@ -188,7 +272,7 @@ stdin, stdout and stderr * `<` or `0<` is stdin filehandle * `>` or `1>` is stdout filehandle * `2>` is stderr filehandle -* [read more](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) +* See also [stackoverflow: stdin, stdout and stderr](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) More detailed discussion in [Shell](./Shell.md) chapter From 3541ededcdac6a79363f56c2b47982d1ce21bb20 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 3 Jul 2018 20:35:23 +0530 Subject: [PATCH 39/76] fixed formatting typo --- Command_Line_Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 59fda8b..60d98f8 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -220,7 +220,7 @@ command with options and arguments single quotes vs double quotes * **single quotes** preserves the literal value of each character within the quotes -* **double quotes** preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\', and, when history expansion is enabled, '!' +* **double quotes** preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\\', and, when history expansion is enabled, '!' * See also [stackoverflow: Difference between single and double quotes](https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash) ```bash From ed4f8762efe15339317c31c235a60040e1091a7d Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 4 Jul 2018 14:58:29 +0530 Subject: [PATCH 40/76] added examples for pwd/cd commands, formatting --- Files_and_Directories.md | 141 +++++++++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 42 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 82f3be4..21c4d85 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -1,9 +1,11 @@ # Files and Directories +**Table of Contents** + * [pwd](#pwd) +* [cd](#cd) * [clear](#clear) * [ls](#ls) -* [cd](#cd) * [mkdir](#mkdir) * [touch](#touch) * [rm](#rm) @@ -13,31 +15,112 @@ * [ln](#ln) * [tar and gzip](#tar-and-gzip) +
+ +Let's look at commonly used commands to navigate directories, create and modify files and folders. For certain commands, a list of commonly used options are also given -Let's look at commonly used commands to move around directories, create and modify files and folders. For certain commands, a list of commonly used options are also given Make it a habit to use `man` command to read about a new command - for example `man ls` -Short descriptions shown for a command are taken from `whatis` or `help -d` +Short descriptions for commands are shown as quoted text (taken from `whatis` or `help -d`)
-### pwd +## pwd >print name of current/working directory -Apart from knowing your current working directory, often used to copy the absolute path to be pasted elsewhere, like in a script +* apart from knowing your current working directory, often used to copy the absolute path to be pasted elsewhere, like in a script +* some Terminal emulators display the current directory path as window/tab title by default + +```bash +$ pwd +/home/learnbyexample +```
-### clear +## cd + +>Change the shell working directory + +* Like `pwd`, the `cd` command is a shell builtin +* Let's see an example of changing working directory to some other directory and coming back +* Specifying `/` at end of path argument is optional + +```bash +$ pwd +/home/learnbyexample + +$ # providing an absolute path as argument +$ cd /etc +$ pwd +/etc + +$ # to go back to previous working directory +$ # if there's a directory named '-', use './-' to go that directory +$ cd - +/home/learnbyexample +$ pwd +/home/learnbyexample +``` + +* Relative paths are well, relative to current working directory +* `.` refers to current directory +* `..` refers to directory one hierarchy above +* `../..` refers to directory two hierarchies above and so on + +```bash +$ pwd +/home/learnbyexample + +$ # go to directory one hierarchy above +$ cd .. +$ pwd +/home + +$ # go to directory 'learnbyexample' present in current directory +$ # './' is optional in this case +$ cd ./learnbyexample +$ pwd +/home/learnbyexample + +$ # go to directory two hierarchies above +$ cd ../.. +$ pwd +/ +``` + +* `cd ~/` or `cd ~` or `cd` will go to directory specified by `HOME` shell variable (which is usually set to user's home directory) + +```bash +$ pwd +/ +$ echo "$HOME" +/home/learnbyexample + +$ cd +$ pwd +/home/learnbyexample +``` + +**Further Reading** + +* Use `help cd` for documentation +* [cd Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cd-command?sort=votes&pageSize=15) +* [cd Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cd?sort=votes&pageSize=15) +* [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html) + +
+ +## clear >clear the terminal screen -* Use `Ctrl+l` to clear the terminal screen and retain already typed text (if any) on command prompt +You can also use `Ctrl+l` short-cut to clear the terminal screen (in addition, this retains any typed text)
-### ls +## ls >list directory contents @@ -78,33 +161,7 @@ Apart from knowing your current working directory, often used to copy the absolu
-### cd - ->Change the shell working directory - -```bash -$ whatis cd -cd: nothing appropriate. -$ type cd -cd is a shell builtin -$ help -d cd -cd - Change the shell working directory. -``` - -**Examples** - -* `cd /etc` go to 'etc' directory under root folder (absolute path specified) -* `cd -` switch back to previous working directory -* `cd ~/` or `cd ~` or `cd` go to home directory - * as specified by `HOME` environment variable -* `cd ..` go one hierarchy back (relative path specified) -* `cd ../..` two hierarchy back (relative path specified) -* [cd Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cd-command?sort=votes&pageSize=15) -* [cd Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cd?sort=votes&pageSize=15) - -
- -### mkdir +## mkdir >make directories @@ -120,7 +177,7 @@ cd - Change the shell working directory.
-### touch +## touch >change file timestamps @@ -132,7 +189,7 @@ More info on this command is covered in a later chapter
-### rm +## rm >remove files and directories @@ -159,7 +216,7 @@ More info on this command is covered in a later chapter
-### cp +## cp >copy files and directories @@ -190,7 +247,7 @@ Also check out
-### mv +## mv >move (rename) files @@ -210,7 +267,7 @@ The destination path is always specified as the last argument. More than one sou
-### rename +## rename >renames multiple files @@ -229,7 +286,7 @@ Note: The `perl` based `rename` is presented here and different from [util-linux
-### ln +## ln >make links between files @@ -246,7 +303,7 @@ Create hard or soft link of file or folder. Soft link is similar to short-cuts c
-### tar and gzip +## tar and gzip `tar` is archiving utility. The archived file is same size as combined sizes of archived files Usually so often combined with compression utility like `gzip` that there is a way to do it just using the `tar` command. From 89193e616083efe74e0a4da8f3d1fd5f2c8bad74 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 4 Jul 2018 18:45:50 +0530 Subject: [PATCH 41/76] added link on history of type/which command --- Command_Line_Introduction.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 60d98f8..5c9cd28 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -111,7 +111,8 @@ Most distros for personal use come with documentation for commands already insta For certain operations, shell provides its own set of commands, referred as builtin commands * `type` will display information about command type -* typically used to get path of command or expand alias/function +* typically used to get path of command or expand alias/function, use `help type` for documentation +* See also [unix.stackexchange: Why not use “which”? What to use then?](https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then) ```bash $ type cd From 81fb6af47dd8e86e485788974407041d9ea4e87c Mon Sep 17 00:00:00 2001 From: learnbyexample Date: Thu, 5 Jul 2018 14:31:27 +0530 Subject: [PATCH 42/76] ls color option --- images/ls_color.png | Bin 0 -> 4091 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/ls_color.png diff --git a/images/ls_color.png b/images/ls_color.png new file mode 100644 index 0000000000000000000000000000000000000000..5a95ebf7ac6efbcc8c15331d706fb0436cd6408a GIT binary patch literal 4091 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 P+dRNf&qTLe+bQNhwZ|}g literal 0 HcmV?d00001 From ddbfce0655f7b4232c48550d6d3756ea0ff00ef7 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 5 Jul 2018 21:35:36 +0530 Subject: [PATCH 43/76] lots of examples for ls command --- Files_and_Directories.md | 204 ++++++++++++++++++++++++++++++++++----- 1 file changed, 182 insertions(+), 22 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 21c4d85..27ab4e9 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -124,21 +124,33 @@ You can also use `Ctrl+l` short-cut to clear the terminal screen (in addition, t >list directory contents -**Options** +* by default, `ls` output is sorted alphabetically -* `-a` list hidden files also -* `-A` like `-a` but excluding `.` and `..` -* `-1` list in single column (number one, not lowercase of letter L) -* `-l` list contents with extra details about the files (lowercase of letter L, not number one) -* `-h` display file sizes in human readable format -* `-t` sort based on time -* `-r` reverse sorting order -* `-R` recursively display sub-directories -* `-S` sort by file size - * directory is treated as file and doesn’t display actual size used by directory, use `du` command if directory size is also needed -* `-d` list directory entries instead of contents -* `-q` prints ? instead of non-graphic characters like `\n` (Linux file names can use any character other than `/` and null character) -* `-F` Append a character to each file name indicating the file type (other than regular files) +```bash +$ # if no argument is given, current directory contents are displayed +$ ls +backups hello_world.py palindrome.py projects todo +ch.sh ip.txt power.log report.log workshop_brochures + +$ # absolute/relative paths can be given as arguments +$ ls /var/ +backups crash local log metrics run spool +cache lib lock mail opt snap tmp +$ # for multiple arguments, listing is organized by directory +$ ls workshop_brochures/ backups/ +backups: +chrome_bookmarks_02_07_2018.html dot_files + +workshop_brochures: +Python_workshop_2017.pdf Scripting_course_2016.pdf + +$ # single column listing +$ ls -1 backups/ +chrome_bookmarks_02_07_2018.html +dot_files +``` + +* `-F` appends a character to each file name indicating the file type (other than regular files) * `/` for directories * `*` for executable files * `@` for symbolic links @@ -146,18 +158,164 @@ You can also use `Ctrl+l` short-cut to clear the terminal screen (in addition, t * `=` for sockets * `>` for doors * the indicator details are described in `info ls`, not in `man ls` -* `--color=auto` list contents with different color for directories, executables, etc -**Examples** +```bash +$ ls -F +backups/ hello_world.py* palindrome.py* projects@ todo +ch.sh* ip.txt power.log report.log workshop_brochures/ + +$ # if you just need to distinguish file and directory, use -p +$ ls -p +backups/ hello_world.py palindrome.py projects todo +ch.sh ip.txt power.log report.log workshop_brochures/ +``` + +* or use the color option + +![ls color output](./images/ls_color.png) + +* long listing format +* shows details like file permissions, ownership, size, timestamp, etc +* file types are distinguished as `d` for directories, `-` for regular files, `l` for symbolic links, etc -* `ls` list contents of current directory when argument is not given -* `ls /home` list contents of directory home present under the root directory (absolute path specified) -* `ls ../` list contents of directory one hierarchy above (relative path specified) -* `ls -ltr` list files of current directory with details sorted such that latest created/modified file is displayed last +```bash +$ ls -l +total 84 +drwxrwxr-x 3 learnbyexample eg 4096 Jul 4 18:23 backups +-rwxr-xr-x 1 learnbyexample eg 2746 Mar 30 11:38 ch.sh +-rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py +-rw-rw-r-- 1 learnbyexample eg 34 Jul 4 09:01 ip.txt +-rwxrwxr-x 1 learnbyexample eg 1236 Aug 21 2017 palindrome.py +-rw-r--r-- 1 learnbyexample eg 10449 Mar 8 2017 power.log +lrwxrwxrwx 1 learnbyexample eg 12 Jun 21 12:08 projects -> ../projects/ +-rw-rw-r-- 1 learnbyexample eg 39120 Feb 25 2017 report.log +-rw-rw-r-- 1 learnbyexample eg 5987 Apr 11 11:06 todo +drwxrwxr-x 2 learnbyexample eg 4096 Jul 5 12:05 workshop_brochures + +$ # to show size in human readable format instead of byte count +$ ls -lh power.log +-rw-r--r-- 1 learnbyexample eg 11K Mar 8 2017 power.log + +$ # use -s option instead of -l if only size info is needed +$ ls -1sh power.log report.log +12K power.log +40K report.log +``` + +* changing sorting criteria +* use `-t` to sort by timestamp, often combined with `-r` to reverse the order so that most recently modified file shows as last item +* `-S` option sorts by file size (not suitable for directories) +* `-v` option does version sorting (suitable for filenames with numbers in them) +* `-X` option allows to sort by file extension (i.e characters after the last `.` in filename) + +```bash +$ ls -lhtr +total 84K +-rw-rw-r-- 1 learnbyexample eg 39K Feb 25 2017 report.log +-rw-r--r-- 1 learnbyexample eg 11K Mar 8 2017 power.log +-rwxrwxr-x 1 learnbyexample eg 1.3K Aug 21 2017 palindrome.py +-rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py +-rwxr-xr-x 1 learnbyexample eg 2.7K Mar 30 11:38 ch.sh +-rw-rw-r-- 1 learnbyexample eg 5.9K Apr 11 11:06 todo +lrwxrwxrwx 1 learnbyexample eg 12 Jun 21 12:08 projects -> ../projects/ +-rw-rw-r-- 1 learnbyexample eg 34 Jul 4 09:01 ip.txt +drwxrwxr-x 3 learnbyexample eg 4.0K Jul 4 18:23 backups +drwxrwxr-x 2 learnbyexample eg 4.0K Jul 5 12:05 workshop_brochures + +$ ls -X +backups todo power.log hello_world.py ch.sh +projects workshop_brochures report.log palindrome.py ip.txt +``` + +* filenames starting with `.` are considered as hidden files + +```bash +$ # -a option will show hidden files too +$ ls -a backups/dot_files/ +. .. .bashrc .inputrc .vimrc + +$ # . and .. are special directories pointing to current and parent directory +$ # if you recall, we have used them in specifying relative paths +$ # so, 'ls', 'ls .' and 'ls backups/..' will give same result +$ ls -aF backups/dot_files/ +./ ../ .bashrc .inputrc .vimrc + +$ # use -A option to show hidden files excluding . and .. special directories +$ ls -A backups/dot_files/ +.bashrc .inputrc .vimrc +``` + +* use `-R` option to recursively list sub-directories too + +```bash +$ ls -ARF +.: +backups/ hello_world.py* palindrome.py* projects@ todo +ch.sh* ip.txt power.log report.log workshop_brochures/ + +./backups: +chrome_bookmarks_02_07_2018.html dot_files/ + +./backups/dot_files: +.bashrc .inputrc .vimrc + +./workshop_brochures: +Python_workshop_2017.pdf Scripting_course_2016.pdf +``` + +* often, we want to prune which files/folders are to be listed +* commands like `find` provide extensive features in this regard +* the shell itself provides a matching technique called glob/wildcards + * see [Shell wildcards](./Shell.md#wildcards) section for more examples and details +* beginners incorrectly associate globbing with `ls` command, as a demonstration globbing results are shown using `echo` command first + +```bash +$ # all unquoted arguments are subjected to shell globbing interpretation +$ echo *.py *.log +hello_world.py palindrome.py power.log report.log +$ echo '*.py' *.log +*.py power.log report.log + +$ # long list only files ending with .py +$ ls -l *.py +-rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py +-rwxrwxr-x 1 learnbyexample eg 1236 Aug 21 2017 palindrome.py + +$ # match all filenames starting with alphabets c/d/e/f/g/h/i +$ echo [c-i]* +ch.sh hello_world.py ip.txt +$ ls -sh [c-i]* +4.0K ch.sh 4.0K hello_world.py 4.0K ip.txt +``` + +* use `-d` option to not show directory contents + +```bash +$ echo b* +backups +$ # since backups is a directory, ls will list its contents +$ ls b* +chrome_bookmarks_02_07_2018.html dot_files +$ # -d option will show the directory entry instead of its contents +$ ls -d b* +backups + +$ # a simple way to get only the directory entries +$ # assuming simple filenames without spaces/newlines/etc +$ echo */ +backups/ projects/ workshop_brochures/ +$ ls -d */ +backups/ projects/ workshop_brochures/ +``` + +**Further Reading** + +* `man ls` and `info ls` for more options and complete documentation * [ls Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ls?sort=votes&pageSize=15) * [ls Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ls?sort=votes&pageSize=15) -* [avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) -* [why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls) +* [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) +* [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls) +* [unix.stackexchange: What are ./ and ../ directories?](https://unix.stackexchange.com/questions/63081/what-are-and-directories)
@@ -165,6 +323,8 @@ You can also use `Ctrl+l` short-cut to clear the terminal screen (in addition, t >make directories +File names can use any character other than `/` and ASCII NUL character + **Examples** * `mkdir project_adder` create folder project_adder in current directory From 6bf555cf57234e1ed04db0ffc0e944795c88e876 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 7 Jul 2018 11:41:38 +0530 Subject: [PATCH 44/76] examples added for mkdir and touch commands --- Files_and_Directories.md | 77 +++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 27ab4e9..89296af 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -176,6 +176,7 @@ ch.sh ip.txt power.log report.log workshop_brochures/ * long listing format * shows details like file permissions, ownership, size, timestamp, etc + * See [chmod](./Working_with_Files_and_Directories.md#chmod) section for details on permissions, groups, etc * file types are distinguished as `d` for directories, `-` for regular files, `l` for symbolic links, etc ```bash @@ -323,29 +324,77 @@ backups/ projects/ workshop_brochures/ >make directories -File names can use any character other than `/` and ASCII NUL character +* Linux filenames can use any character other than `/` and the ASCII NUL character +* quote the arguments if name contains characters like space, `*`, etc to prevent shell interpretation + * shell considers space as argument separator, `*` is a globbing character, etc +* unless otherwise needed, try to use only alphabets, numbers and underscores for filenames -**Examples** +```bash +$ # one or more absolute/relative paths can be given to create directories +$ mkdir reports 'low power adders' + +$ # listing can be confusing when filename contains characters like space +$ ls +low power adders reports +$ ls -1 +low power adders +reports +``` + +* use `-p` option to create multiple directory hierarchies in one go +* it is also useful in scripts to create a directory without having to check if it already exists +* special variable `$?` gives exit status of last executed command + * `0` indicates success and other values indicate some kind of failure + * see documentation of respective commands for details + +```bash +$ mkdir reports +mkdir: cannot create directory ‘reports’: File exists +$ echo $? +1 +$ # when -p is used, mkdir won't give an error if directory already exists +$ mkdir -p reports +$ echo $? +0 + +$ # error because 'a/b' doesn't exist +$ mkdir a/b/c +mkdir: cannot create directory ‘a/b/c’: No such file or directory +$ # with -p, any non-existing directory will be created as well +$ mkdir -p a/b/c +$ ls -1R a +a: +b + +a/b: +c + +a/b/c: +``` + +**Further Reading** -* `mkdir project_adder` create folder project_adder in current directory -* `mkdir project_adder/report` create folder report in project_adder directory -* `mkdir -p project_adder/report` create both project_adder and report directories in one shot - * if project_adder already exists, it won't be affected -* `mkdir /home/guest1` add a home directory for user guest1 * [mkdir Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/mkdir?sort=votes&pageSize=15) * [mkdir Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mkdir?sort=votes&pageSize=15) +* [unix.stackexchange: Characters best avoided in filenames](https://unix.stackexchange.com/questions/269093/characters-best-avoided-in-filenames-when-used-in-bash-e-g)
## touch ->change file timestamps +* Usually files are created using a text editor or by redirecting output of a command to a file +* But sometimes, for example to test file renaming, creating empty files comes in handy +* the `touch` command is primarily used to change timestamp of a file (see [touch](./Working_with_Files_and_Directories.md#touch) section of next chapter) +* if a filename given to `touch` doesn't exist, an empty file gets created with current timestamp -When a filename is passed as argument to `touch` command that doesn't exist, it creates an empty file -More info on this command is covered in a later chapter - -* `touch error.log` creates an empty file error.log in current directory if it doesn't exist -* [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15) +```bash +$ touch ip.txt +$ ls -1F +a/ +ip.txt +low power adders/ +reports/ +```
@@ -367,6 +416,7 @@ More info on this command is covered in a later chapter * `rm -d project_tmp` remove project_tmp folder provided it is empty * `rmdir project_tmp` can also be used * If available, use `gvfs-trash` command to send items to trash instead of permanent deletion + * or, [unix.stackexchange: creating a simple trash command](https://unix.stackexchange.com/questions/452496/create-a-recycle-bin-feature-without-using-functions) * Files removed using `rm` can still be recovered with time/skill. Use `shred` command to overwrite files * [recover deleted files](https://unix.stackexchange.com/questions/80270/unix-linux-undelete-recover-deleted-files) * [recovering accidentally deleted files](https://unix.stackexchange.com/questions/2677/recovering-accidentally-deleted-files) @@ -443,6 +493,7 @@ Note: The `perl` based `rename` is presented here and different from [util-linux * `rename 's/\.JPG$/.jpg/' *JPG` change the file extension from '.JPG' to '.jpg' * `rename 's/ /_/g' *` replace all 'space' characters in filenames with '_' * [rename Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rename?sort=votes&pageSize=15) +* See [Perl one liners](https://github.com/learnbyexample/Command-line-text-processing/blob/master/perl_the_swiss_knife.md) for examples and details on Perl based substitution command
From c530904953585ab6e43e93b1e70f8e37177ee2b7 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 7 Jul 2018 18:12:22 +0530 Subject: [PATCH 45/76] examples for rm, cp, mv and rename commands --- Files_and_Directories.md | 193 +++++++++++++++++++++++++++++---------- 1 file changed, 146 insertions(+), 47 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 89296af..92da509 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -402,25 +402,58 @@ reports/ >remove files and directories -**Options** +* to delete files, specify them as separate arguments +* to delete directories as well, use `-r` option (deletes recursively) +* use `-f` option to force remove without prompt for non-existing files and write protected files (provided user has appropriate permissions) -* `-r` remove recursively, used for removing directories -* `-f` force remove without prompt for non-existing files and write protected files (provided user has appropriate permissions) -* `-i` prompt before every removal -* `-d` remove empty directories +```bash +$ ls +a ip.txt low power adders reports +$ rm ip.txt +$ ls +a low power adders reports -**Examples** +$ rm reports +rm: cannot remove 'reports': Is a directory +$ rm -r reports +$ ls +a low power adders + +$ # to remove only empty directory, same as 'rmdir' command +$ rm -d a +rm: cannot remove 'a': Directory not empty +``` + +* typos like misplaced space, wrong glob, etc could wipe out files not intended for deletion +* apart from having backups and snapshots, one could take some mitigating steps + * using `-i` option to interactively delete each file + * using `echo` as a dry run to see how the glob expands + * using a trash command (see links below) instead of `rm` -* `rm project_adder/power.log` remove file power.log from project_adder directory -* `rm -r project_adder` remove folder project_adder from current directory even if non-empty -* `rm -d project_tmp` remove project_tmp folder provided it is empty - * `rmdir project_tmp` can also be used -* If available, use `gvfs-trash` command to send items to trash instead of permanent deletion +```bash +$ rm -ri 'low power adders' +rm: remove directory 'low power adders'? n +$ ls +a low power adders + +$ rm -ri a +rm: descend into directory 'a'? y +rm: descend into directory 'a/b'? y +rm: remove directory 'a/b/c'? y +rm: remove directory 'a/b'? y +rm: remove directory 'a'? y +$ ls +low power adders +``` + +**Further Reading** + +* See if a trash command is available for your distro (for ex: `gvfs-trash` on Ubuntu) - this will send items to trash instead of deletion * or, [unix.stackexchange: creating a simple trash command](https://unix.stackexchange.com/questions/452496/create-a-recycle-bin-feature-without-using-functions) * Files removed using `rm` can still be recovered with time/skill. Use `shred` command to overwrite files - * [recover deleted files](https://unix.stackexchange.com/questions/80270/unix-linux-undelete-recover-deleted-files) - * [recovering accidentally deleted files](https://unix.stackexchange.com/questions/2677/recovering-accidentally-deleted-files) - * [Securely wipe disk](https://wiki.archlinux.org/index.php/Securely_wipe_disk) + * [unix.stackexchange: recover deleted files](https://unix.stackexchange.com/questions/80270/unix-linux-undelete-recover-deleted-files) + * [unix.stackexchange: recovering accidentally deleted files](https://unix.stackexchange.com/questions/2677/recovering-accidentally-deleted-files) + * [wiki.archlinux: Securely wipe disk](https://wiki.archlinux.org/index.php/Securely_wipe_disk) * [rm Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rm?sort=votes&pageSize=15) * [rm Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rm?sort=votes&pageSize=15) @@ -430,30 +463,67 @@ reports/ >copy files and directories -The destination path is always specified as the last argument. More than one source file/folder can be specified if destination is a directory +* to copy a single file or directory, specify the source as first argument and destination as second argument +* similar to `rm` command, use `-r` for directories -**Options** +```bash +$ # when destination is a directory, specified sources are placed inside that directory +$ # recall that . is a relative path referring to current directory +$ cp /usr/share/dict/words . +$ ls +low power adders words -* `-r` copy recursively, used for copying directories -* `-i` prompt before overwriting -* `-u` copy files only if newer than existing file in destination location or if file doesn't exist in destination +$ cp /usr/share/dict . +cp: omitting directory '/usr/share/dict' +$ cp -r /usr/share/dict . +$ ls -1F +dict/ +low power adders/ +words +``` -**Examples** +* often, we want to copy for the purpose of modifying it +* in such cases, a different name can be given while specifying the destination +* if the destination filename already exists, it will be overwritten (see options `-i` and `-n` to avoid this) -* `cp /home/raja/Raja_resume.doc Ravi_resume.doc` create a copy of file Raja_resume.doc as Ravi_resume.doc in your current directory -* `cp /home/raja/Raja_resume.doc .` create a copy of file Raja_resume.doc in your current directory - name not changed in this case - * `.` represents current directory and `..` represents one hierarchy above -* `cp -r /home/guest1/proj_matlab ~/proj_matlab_bug_test` copy proj_matlab to your home directory as proj_matlab_bug_test -* `cp report/output.log report/timing.log .` copy files output.log and timing.log to current directory -* [cp Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cp?sort=votes&pageSize=15) -* [cp Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cp?sort=votes&pageSize=15) +```bash +$ cp /usr/share/dict/words words_ref.txt +$ cp -r /usr/share/dict word_lists + +$ ls -1F +dict/ +low power adders/ +word_lists/ +words +words_ref.txt +``` -Also check out +* multiple files and directories can be copied at once if the destination is a directory +* using `-t` option, one could specify destination directory first followed by sources (this is helpful with `find` command and other cases) +```bash +$ mkdir bkp_dot_files + +$ # here, ~ will get expanded to user's home directory +$ cp ~/.bashrc ~/.bash_profile bkp_dot_files/ +$ ls -A bkp_dot_files +.bash_profile .bashrc +``` + +* see `man cp` and `info cp` for more options and complete documentation +* some notable options are + * `-u` copy files from source only if they are newer than those in destination or if it doesn't exist in destination location + * `-b` and `--backup` for back up options if file with same name already exists in destination location + * `--preserve` option to copy files along with source file attributes like timestamp + +**Further Reading** + +* [cp Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cp?sort=votes&pageSize=15) +* [cp Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cp?sort=votes&pageSize=15) * `rsync` a fast, versatile, remote (and local) file-copying tool -* [rsync examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) -* [rsync Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rsync?sort=votes&pageSize=15) -* [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15) + * [rsync examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) + * [rsync Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rsync?sort=votes&pageSize=15) + * [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15)
@@ -461,17 +531,39 @@ Also check out >move (rename) files -The destination path is always specified as the last argument. More than one source file/folder can be specified if destination is a directory +* as name suggests, `mv` can move files from one location to another +* if multiple files need to be moved, destination argument should be a directory (or specified using `-t` option) +* unlike `rm` and `cp`, both files and directories have same syntax, no additional option required +* use `-i` option to be prompted instead of overwriting file of same name in destination location -**Options** +```bash +$ ls +bkp_dot_files dict low power adders word_lists words words_ref.txt +$ mkdir backups -* `-f` don't prompt for overwriting and moving write protected files (provided user has appropriate permissions) -* `-i` prompt before overwriting +$ mv bkp_dot_files/ backups/ +$ ls -F +backups/ dict/ low power adders/ word_lists/ words words_ref.txt +$ ls -F backups/ +bkp_dot_files/ -**Examples** +$ mv dict words backups/ +$ ls -F +backups/ low power adders/ word_lists/ words_ref.txt +$ ls -F backups/ +bkp_dot_files/ dict/ words +``` + +* like `cp` command, for single file/directory one can provide a different destination name + +```bash +$ mv backups/bkp_dot_files backups/dot_files +$ ls -F backups/ +dict/ dot_files/ words +``` + +**Further Reading** -* `mv project_adder project_lowpower_adder` rename file or folder -* `mv power.log timing.log area.log project_multiplier/result/` move the specified files to result directory * [mv Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/mv?sort=votes&pageSize=15) * [mv Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mv?sort=votes&pageSize=15) @@ -481,19 +573,26 @@ The destination path is always specified as the last argument. More than one sou >renames multiple files -Note: The `perl` based `rename` is presented here and different from [util-linux-ng version](https://linux.die.net/man/1/rename). Check `man rename` for details +Note: The `perl` based `rename` is presented here which is different from [util-linux-ng version](https://linux.die.net/man/1/rename). Check `man rename` for details -**Options** - -* `-f` overwrite existing files -* `-n` dry run without actually renaming files +```bash +$ ls +backups low power adders word_lists words_ref.txt +$ # here, the * glob will expand to all non-hidden files in current directory +$ # -n option is for dry run, to see changes before actually renaming files +$ # s/ /_/g means replace all space characters with _ character +$ rename -n 's/ /_/g' * +rename(low power adders, low_power_adders) + +$ rename 's/ /_/g' * +$ ls +backups low_power_adders word_lists words_ref.txt +``` -**Examples** +**Further Reading** -* `rename 's/\.JPG$/.jpg/' *JPG` change the file extension from '.JPG' to '.jpg' -* `rename 's/ /_/g' *` replace all 'space' characters in filenames with '_' * [rename Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rename?sort=votes&pageSize=15) -* See [Perl one liners](https://github.com/learnbyexample/Command-line-text-processing/blob/master/perl_the_swiss_knife.md) for examples and details on Perl based substitution command +* See [Perl one liners](https://github.com/learnbyexample/Command-line-text-processing/blob/master/perl_the_swiss_knife.md) for examples and details on Perl substitution command
From fabc922e44219a09da05814a6bd0405d26f9c24c Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 9 Jul 2018 15:13:55 +0530 Subject: [PATCH 46/76] examples for ln command and other improvements --- Files_and_Directories.md | 63 +++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 92da509..669c93a 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -17,7 +17,7 @@
-Let's look at commonly used commands to navigate directories, create and modify files and folders. For certain commands, a list of commonly used options are also given +Let's look at commonly used commands to navigate directories, create and modify files and directories. For certain commands, a list of commonly used options are also given Make it a habit to use `man` command to read about a new command - for example `man ls` @@ -30,7 +30,7 @@ Short descriptions for commands are shown as quoted text (taken from `whatis` or >print name of current/working directory * apart from knowing your current working directory, often used to copy the absolute path to be pasted elsewhere, like in a script -* some Terminal emulators display the current directory path as window/tab title by default +* some Terminal emulators display the current directory path as window/tab title ```bash $ pwd @@ -116,7 +116,7 @@ $ pwd >clear the terminal screen -You can also use `Ctrl+l` short-cut to clear the terminal screen (in addition, this retains any typed text) +You can also use `Ctrl+l` short-cut to clear the Terminal screen (in addition, this retains any typed text)
@@ -264,11 +264,11 @@ chrome_bookmarks_02_07_2018.html dot_files/ Python_workshop_2017.pdf Scripting_course_2016.pdf ``` -* often, we want to prune which files/folders are to be listed +* often, we want to prune which files/directories are to be listed * commands like `find` provide extensive features in this regard * the shell itself provides a matching technique called glob/wildcards * see [Shell wildcards](./Shell.md#wildcards) section for more examples and details -* beginners incorrectly associate globbing with `ls` command, as a demonstration globbing results are shown using `echo` command first +* beginners incorrectly associate globbing with `ls` command, so globbing results are shown below using `echo` command as a demonstration ```bash $ # all unquoted arguments are subjected to shell globbing interpretation @@ -499,7 +499,7 @@ words_ref.txt ``` * multiple files and directories can be copied at once if the destination is a directory -* using `-t` option, one could specify destination directory first followed by sources (this is helpful with `find` command and other cases) +* using `-t` option, one could specify destination directory first followed by sources (this is helpful with `find` command and other places) ```bash $ mkdir bkp_dot_files @@ -555,6 +555,7 @@ bkp_dot_files/ dict/ words ``` * like `cp` command, for single file/directory one can provide a different destination name +* so, when source and destination has same parent directory, `mv` acts as renaming command ```bash $ mv backups/bkp_dot_files backups/dot_files @@ -600,16 +601,52 @@ backups low_power_adders word_lists words_ref.txt >make links between files -Create hard or soft link of file or folder. Soft link is similar to short-cuts created in Windows. Hard link is like same file with different name, same timestamp and permissions of original file. Hard links can be moved to another directory after creation, will still have content even when original file is deleted. On the other hand, soft links have their own timestamps and permissions, it cannot be moved to another folder unless the link creation was done using full path and of course becomes a dead link when original file is deleted. More differences [here](https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) +* there are two types of links - symbolic and hard links +* symbolic links is like a pointer/shortcut to another file or directory + * if the original file is deleted or moved to another location, symbolic link will no longer work + * if the symbolic link is moved to another location, it will still work if the link was done using absolute path (for relative path, it will depend on whether or not there's another file with same name in that location) + * a symbolic link file has its own inode, permissions, timestamps, etc + * most commands will work the same when original file or the symbolic file is given as command line argument, see their documentation for details -**Examples** +```bash +$ # similar to cp, a different name can be specified if needed +$ ln -s /usr/share/dict/words . +$ ls -F +words@ + +$ # to know which file the link points to +$ ls -l words +lrwxrwxrwx 1 learnbyexample eg 21 Jul 9 13:41 words -> /usr/share/dict/words +$ readlink words +/usr/share/dict/words +$ # the linked file may be another link +$ # use -f option to get original file +$ readlink -f words +/usr/share/dict/english +``` + +* hard link can only point to another file (not a directory, and restricted to within the same filesystem) + * the `.` and `..` special directories are the exceptions, they are hard links which are automatically created +* once a hard link is created, there is no distinction between the two files other than different filename/location - they have same inode, permissions, timestamps, etc +* any of the hard link will continue working even if all the other hard links are deleted +* if a hard link is moved to another location, the links will still be in sync - any change in one of them will be reflected in all the other links + +```bash +$ touch foo.txt +$ ln foo.txt baz.txt +$ ls -1i foo.txt baz.txt +649140 baz.txt +649140 foo.txt +``` + +**Further Reading** -* `ln -s results/report.log .` create a symbolic link of report.log from results folder to current directory -* `ln results/report.log report.log` create a hard link of report.log from results folder to current directory, will not lose content even if results/report.log file is deleted -* `unlink report.log` delete link - * `rm report.log` can also be used +* `unlink` command to delete links (`rm` can be used as well) * [ln Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ln?sort=votes&pageSize=15) * [ln Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ln?sort=votes&pageSize=15) +* [askubuntu: What is the difference between a hard link and a symbolic link?](https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) +* [unix.stackexchange: What is the difference between symbolic and hard links?](https://unix.stackexchange.com/questions/9575/what-is-the-difference-between-symbolic-and-hard-links) +* [unix.stackexchange: What is a Superblock, Inode, Dentry and a File?](https://unix.stackexchange.com/questions/4402/what-is-a-superblock-inode-dentry-and-a-file)
@@ -622,7 +659,7 @@ Usually so often combined with compression utility like `gzip` that there is a w Archive and Compression -* `tar -cvf backup_mar15.tar project results` create backup_mar15.tar of files/folders project and results +* `tar -cvf backup_mar15.tar project results` create backup_mar15.tar of files/directories project and results * `-v` option stands for verbose, i.e displays all the files and directories being archived * `gzip backup_mar15.tar` overwrites backup_mar15.tar with backup_mar15.tar.gz, a compressed version * `tar -cvzf backup_mar15.tar.gz project results` create backup_mar15.tar and overwrite with backup_mar15.tar.gz From c45da83c089f863f5fe0a9919d4f9ab6a42f7a22 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 9 Jul 2018 20:36:11 +0530 Subject: [PATCH 47/76] examples for tar and gzip commands --- Files_and_Directories.md | 96 +++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index 669c93a..b9b32a5 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -634,6 +634,8 @@ $ readlink -f words ```bash $ touch foo.txt $ ln foo.txt baz.txt + +$ # the -i option gives inode $ ls -1i foo.txt baz.txt 649140 baz.txt 649140 foo.txt @@ -652,31 +654,93 @@ $ ls -1i foo.txt baz.txt ## tar and gzip -`tar` is archiving utility. The archived file is same size as combined sizes of archived files -Usually so often combined with compression utility like `gzip` that there is a way to do it just using the `tar` command. +* `tar` is an archiving utility +* first, lets see an example of creating single archive file from multiple input files +* note that the archive file so created is a new file and doesn't overwrite input files -**Examples** +```bash +$ ls -F +backups/ low_power_adders/ word_lists/ words_ref.txt -Archive and Compression +$ # -c option creates a new archive, existing archive will be overwritten +$ # -f option allows to specify name of archive to be created +$ # rest of the arguments are the files to be archived +$ tar -cf bkp_words.tar word_lists words_ref.txt -* `tar -cvf backup_mar15.tar project results` create backup_mar15.tar of files/directories project and results - * `-v` option stands for verbose, i.e displays all the files and directories being archived -* `gzip backup_mar15.tar` overwrites backup_mar15.tar with backup_mar15.tar.gz, a compressed version -* `tar -cvzf backup_mar15.tar.gz project results` create backup_mar15.tar and overwrite with backup_mar15.tar.gz +$ ls -F +backups/ bkp_words.tar low_power_adders/ word_lists/ words_ref.txt +$ ls -sh bkp_words.tar +2.3M bkp_words.tar +``` -Extract archive and Decompression +* once we have an archive, we can compress it using `gzip` +* this will replace the archive file with compressed version, adding a `.gz` suffix -* `gunzip backup_mar15.tar.gz` decompress and overwrite as backup_mar15.tar -* `tar -xvf backup_mar15.tar` extract archived files to current directory -* `tar -xzvf backup_mar15.tar.gz` decompress and extract archived files to current directory +```bash +$ gzip bkp_words.tar -z commands +$ ls -F +backups/ bkp_words.tar.gz low_power_adders/ word_lists/ words_ref.txt +$ ls -sh bkp_words.tar.gz +652K bkp_words.tar.gz +``` -* `zcat story.txt.gz` display file contents of compressed file on standard output -* `zless story.txt.gz` display file contents of compressed file one screenful at a time -* There are other commands as well like `zgrep`, `zdiff`, `zcmp` etc to work on compressed files +* to uncompress, use `gunzip` or `gzip -d` +* this will replace the compressed version with the uncompressed archive file + +```bash +$ gunzip bkp_words.tar.gz + +$ ls -F +backups/ bkp_words.tar low_power_adders/ word_lists/ words_ref.txt +$ ls -sh bkp_words.tar +2.3M bkp_words.tar +``` + +* to extract the original files from archive, use `-x` option + +```bash +$ mkdir test_extract +$ mv bkp_words.tar test_extract/ +$ cd test_extract/ +$ ls +bkp_words.tar + +$ tar -xf bkp_words.tar +$ ls -F +bkp_words.tar word_lists/ words_ref.txt +$ cd .. +$ rm -r test_extract/ +``` + +* the GNU version of `tar` supports compressing/uncompressing options as well + +```bash +$ ls -F +backups/ low_power_adders/ word_lists/ words_ref.txt + +$ # -z option gives same compression as gzip command +$ # reverse would be: tar -zxf bkp_words.tar.gz +$ tar -zcf bkp_words.tar.gz word_lists words_ref.txt +$ ls -sh bkp_words.tar.gz +652K bkp_words.tar.gz +``` + +* there are loads of options for various needs, see documentation for details + * `-v` for verbose option + * `-r` to append files to archive + * `-t` to list contents of archive + * `--exclude=` to specify files to be ignored from archiving + * `-j` and `-J` to use `bzip2` or `xz` compression technique instead of `-z` which uses `gzip` +* there are commands starting with `z` to work with compressed files + * `zcat` to display file contents of compressed file on standard output + * `zless` to display file contents of compressed file one screenful at a time + * `zgrep` to search compressed files and so on... **Further Reading** * [tar Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/tar?sort=votes&pageSize=15) * [tar Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/tar?sort=votes&pageSize=15) +* [superuser: gzip without tar? Why are they used together?](https://superuser.com/questions/252065/gzip-without-tar-why-are-they-used-together) +* `zip` and `unzip` commands + From e492ef86aeb5beeb0a37cc13ead9f582800c2ad2 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 10 Jul 2018 12:25:36 +0530 Subject: [PATCH 48/76] updated quote on Linux from wikipedia --- Linux_Introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Linux_Introduction.md b/Linux_Introduction.md index 018be2d..b022974 100644 --- a/Linux_Introduction.md +++ b/Linux_Introduction.md @@ -14,7 +14,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) -> Linux is a Unix-like and mostly POSIX-compliant computer operating system (OS) assembled under the model of free and open-source software development and distribution. The defining component of Linux is the Linux kernel an operating system kernel first released on 5 October 1991 by Linus Torvalds. The Free Software Foundation uses the name **GNU/Linux** to describe the operating system +>Linux is a family of free and open-source software operating systems built around the Linux kernel. Typically, Linux is packaged in a form known as a Linux distribution (or distro for short) for both desktop and server use. The defining component of a Linux distribution is the Linux kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Many Linux distributions use the word "Linux" in their name. The Free Software Foundation uses the name GNU/Linux to refer to the operating system family, as well as specific distributions, to emphasize that most Linux distributions are not just the Linux kernel, and that they have in common not only the kernel, but also numerous utilities and libraries, a large proportion of which are from the GNU project
@@ -47,7 +47,7 @@ Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) ## Linux Distros -There are various Linux flavors called 'distribution' (distros for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case +There are various Linux flavors called 'distribution' (distro for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case * There are [hundreds of known distributions](https://en.wikipedia.org/wiki/List_of_Linux_distributions) * One can keep track of them at [distrowatch](https://distrowatch.com/) From 1c89284d8b39da892b1360df8dd676513d00842a Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 10 Jul 2018 13:55:56 +0530 Subject: [PATCH 49/76] links and clarification --- Command_Line_Introduction.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 5c9cd28..0ef3572 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -90,6 +90,8 @@ $ echo "$SHELL" Note: Your command prompt might be different, for now you can leave it as or change it to the simple prompt I prefer by executing `PS1="$ "` +In the above example, `cat` command is used to display contents of a file and `echo` command is used to display contents of a variable - these commands have other uses as well, which will be covered later on +
## Command Help @@ -112,6 +114,7 @@ For certain operations, shell provides its own set of commands, referred as buil * `type` will display information about command type * typically used to get path of command or expand alias/function, use `help type` for documentation +* See also [unix.stackexchange: What is the difference between a builtin command and one that is not?](https://unix.stackexchange.com/questions/11454/what-is-the-difference-between-a-builtin-command-and-one-that-is-not) * See also [unix.stackexchange: Why not use “which”? What to use then?](https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then) ```bash From dce666d39ba58c242a7db6003ebe7ee776a1ddc0 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 16 Jul 2018 18:23:19 +0530 Subject: [PATCH 50/76] added ex for tree command, links for rename --- Files_and_Directories.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Files_and_Directories.md b/Files_and_Directories.md index b9b32a5..5a6e462 100644 --- a/Files_and_Directories.md +++ b/Files_and_Directories.md @@ -264,6 +264,32 @@ chrome_bookmarks_02_07_2018.html dot_files/ Python_workshop_2017.pdf Scripting_course_2016.pdf ``` +* `tree` command displays contents of a directory recursively as a tree like structure +* you might have to install this command or have an equivalent command like `gvfs-tree` + +```bash +$ # -h option will show hidden files +$ gvfs-tree -h +file:///home/learnbyexample/ls_ex +|-- backups +| |-- chrome_bookmarks_02_07_2018.html +| `-- dot_files +| |-- .bashrc +| |-- .inputrc +| `-- .vimrc +|-- ch.sh +|-- hello_world.py +|-- ip.txt +|-- palindrome.py +|-- power.log +|-- projects -> ../projects/ +|-- report.log +|-- todo +`-- workshop_brochures + |-- Python_workshop_2017.pdf + `-- Scripting_course_2016.pdf +``` + * often, we want to prune which files/directories are to be listed * commands like `find` provide extensive features in this regard * the shell itself provides a matching technique called glob/wildcards @@ -594,6 +620,7 @@ backups low_power_adders word_lists words_ref.txt * [rename Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rename?sort=votes&pageSize=15) * See [Perl one liners](https://github.com/learnbyexample/Command-line-text-processing/blob/master/perl_the_swiss_knife.md) for examples and details on Perl substitution command +* Some more `rename` examples - [unix.stackexchange: replace dots except last one](https://unix.stackexchange.com/questions/315586/replacing-dots-in-file-name-with-underscores-except-the-extension/315589#315589) and [stackoverflow: change date format](https://stackoverflow.com/questions/40286513/converting-date-format-in-bash/40288150#40288150)
From c40e0b124766d83801159aa76cb4734ab0cf2b0d Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 6 Oct 2018 11:19:18 +0530 Subject: [PATCH 51/76] another good resource about man pages --- Command_Line_Introduction.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md index 0ef3572..4971ef7 100644 --- a/Command_Line_Introduction.md +++ b/Command_Line_Introduction.md @@ -109,6 +109,7 @@ Most distros for personal use come with documentation for commands already insta * `-k` here is a command option * `man -k` is equivalent for `apropos` command * Excellent resource [unix.stackexchange: How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) +* See also [wiki.archlinux: man page](https://wiki.archlinux.org/index.php/man_page) For certain operations, shell provides its own set of commands, referred as builtin commands From c93eda603c8072a144b242a3f272e0ea531458d7 Mon Sep 17 00:00:00 2001 From: learnbyexample Date: Sat, 6 Oct 2018 11:23:58 +0530 Subject: [PATCH 52/76] added patreon button --- images/become_a_patron_button.png | Bin 0 -> 3086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/become_a_patron_button.png diff --git a/images/become_a_patron_button.png b/images/become_a_patron_button.png new file mode 100644 index 0000000000000000000000000000000000000000..291b7bcf265521a3d062024bc4f7df927ae60e8f GIT binary patch literal 3086 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 S8x99PkF}+}MV*;%;{O2Ee#b2U literal 0 HcmV?d00001 From b26cece8f72d30cdd17d2d1cdc906ba8d2fe0ca2 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 6 Oct 2018 11:29:00 +0530 Subject: [PATCH 53/76] added patreon link --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 83fb6d7..85e7c9a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -[![Join the chat at https://gitter.im/learnbyexample/scripting_course](https://badges.gitter.im/learnbyexample/scripting_course.svg)](https://gitter.im/learnbyexample/scripting_course) [![support learnbyexample](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/learnbyexample/donate) +

+ + + +


@@ -38,7 +42,7 @@ Introduction to Linux commands and Shell scripting * Even for pull requests, open an issue for discussion before submitting PRs * or [gitter group chat](https://gitter.im/learnbyexample/scripting_course) for discussion as well as for help/mentorship * Share the repo with friends/colleagues, on social media, etc to help reach other learners -* Contribute by donating on [liberapay](https://liberapay.com/learnbyexample/donate) +* Contribute by donating on [patreon](https://www.patreon.com/learnbyexample) or [liberapay](https://liberapay.com/learnbyexample/donate) * In case you need to reach me, use [gitter private chat](https://gitter.im/learnbyexample) * or mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` From dcbf75d1e7285c48b67036f6ebcb5fee8357310b Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 27 Aug 2019 14:57:26 +0530 Subject: [PATCH 54/76] link to blog --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 85e7c9a..52af93e 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,9 @@ -

- - - -

- -
- # Linux Command Line Introduction to Linux commands and Shell scripting * [Linux curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Linux_curated_resources.md) for more complete resources list, including tutorials for beginners -* For more related resources, visit [scripting course](https://github.com/learnbyexample/scripting_course) +* For more related resources, visit [scripting course](https://github.com/learnbyexample/scripting_course) and my programming blog https://learnbyexample.github.io
@@ -42,7 +34,6 @@ Introduction to Linux commands and Shell scripting * Even for pull requests, open an issue for discussion before submitting PRs * or [gitter group chat](https://gitter.im/learnbyexample/scripting_course) for discussion as well as for help/mentorship * Share the repo with friends/colleagues, on social media, etc to help reach other learners -* Contribute by donating on [patreon](https://www.patreon.com/learnbyexample) or [liberapay](https://liberapay.com/learnbyexample/donate) * In case you need to reach me, use [gitter private chat](https://gitter.im/learnbyexample) * or mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` @@ -66,3 +57,4 @@ Introduction to Linux commands and Shell scripting # License This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) + From 09091253463a313ddce5a95f467857ea85c25ce6 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 1 Oct 2020 13:58:33 +0530 Subject: [PATCH 55/76] updated links and contact info --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 52af93e..374a9ba 100644 --- a/README.md +++ b/README.md @@ -31,18 +31,16 @@ Introduction to Linux commands and Shell scripting ## Contributing * Please open an issue for typos/bugs/suggestions/etc - * Even for pull requests, open an issue for discussion before submitting PRs - * or [gitter group chat](https://gitter.im/learnbyexample/scripting_course) for discussion as well as for help/mentorship + * **Please open an issue for discussion before submitting PRs** * Share the repo with friends/colleagues, on social media, etc to help reach other learners -* In case you need to reach me, use [gitter private chat](https://gitter.im/learnbyexample) - * or mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` +* In case you need to reach me, mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` or send a DM via [twitter](https://twitter.com/learn_byexample)
# ebook * Read as ebook on [gitbook](https://learnbyexample.gitbooks.io/linux-command-line/content/index.html) -* Download ebook for offline reading - [link](https://www.gitbook.com/book/learnbyexample/linux-command-line/details) +* All `legacy.gitbook.com` links are now automatically redirected to `gitbook.com`, so there's no longer an option to download ebooks for offline reading
From f521d5c85f210d381436a0d5f14ec41b2de33b83 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 2 May 2022 15:37:46 +0530 Subject: [PATCH 56/76] license for code snippets --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cd26a33 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Sundeep Agarwal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 76770d4a0c2c68401a0f56b46a32d4d25b248700 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 2 May 2022 16:37:22 +0530 Subject: [PATCH 57/76] added details about new version of the book --- Command_Line_Introduction.md | 283 ------ Files_and_Directories.md | 773 -------------- Linux_Introduction.md | 72 -- README.md | 65 +- Shell.md | 340 ------- Shell_Customization.md | 193 ---- Shell_Scripting.md | 665 ------------ Text_Processing.md | 1338 ------------------------- Working_with_Files_and_Directories.md | 1075 -------------------- images/become_a_patron_button.png | Bin 3086 -> 0 bytes images/ls_color.png | Bin 4091 -> 0 bytes 11 files changed, 28 insertions(+), 4776 deletions(-) delete mode 100644 Command_Line_Introduction.md delete mode 100644 Files_and_Directories.md delete mode 100644 Linux_Introduction.md delete mode 100644 Shell.md delete mode 100644 Shell_Customization.md delete mode 100644 Shell_Scripting.md delete mode 100644 Text_Processing.md delete mode 100644 Working_with_Files_and_Directories.md delete mode 100644 images/become_a_patron_button.png delete mode 100644 images/ls_color.png diff --git a/Command_Line_Introduction.md b/Command_Line_Introduction.md deleted file mode 100644 index 4971ef7..0000000 --- a/Command_Line_Introduction.md +++ /dev/null @@ -1,283 +0,0 @@ -# Command Line introduction - -**Table of Contents** - -* [File System](#file-system) - * [Absolute and Relative paths](#absolute-and-relative-paths) -* [Command Line Interface](#command-line-interface) -* [Command Help](#command-help) -* [Do one thing and do it well](#do-one-thing-and-do-it-well) - * [Command Structure](#command-structure) - * [Command Network](#command-network) - -
- -For any thing that is repetitive or programmable, there likely is a relevant command. Ask your peers or search online before you start writing a script. Just remember that Unix was first introduced in late 1960s - there is likely to be a command for what you need - -Starting trouble with command line (for those accustomed to GUI) is the sudden trouble of interacting with the computer using just text commands. After using for a week or so, things will seem very systematic and GUI feels ill suited for frequent tasks. With continuous use, recalling various commands becomes easier. Short-cuts, history, aliases and tab-completion help in the process - -If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into tiny screen and plethora of multi-purpose buttons. Commands and short-cuts pack much more punch than that on a terminal - -* Commands presented here are Linux specific and generally behave similarly across distros -* Commands in Linux usually have added features compared to [POSIX](https://en.wikipedia.org/wiki/POSIX) specification -* If any command is not found in a particular distro, either it has to be manually installed or probably an alternate exists -* The **bash** shell version 4+ is used throughout this material - * [rough overview of changes to Bash over time](http://wiki.bash-hackers.org/scripting/bashchanges) - -
- -## File System - -Before we dive into ocean of commands, lets get a brief on Linux file system. If you've used Windows, you would be familiar with `C:` `D:` etc. -In Linux, directory structure starts with `/` symbol, which is referred as the `root` directory - -* `man hier` gives description of the filesystem hierarchy. A few examples: - * `/` This is the root directory. This is where the whole tree starts. - * `/bin` This directory contains executable programs which are needed in single user mode and to bring the system up or repair it. - * `/home` On machines with home directories for users, these are usually beneath this directory, directly or not. The structure of this directory depends on local administration decisions. - * `/tmp` This directory contains temporary files which may be deleted with no notice, such as by a regular job or at system boot up. - * `/usr` This directory is usually mounted from a separate partition. It should hold only sharable, read-only data, so that it can be mounted by various machines running Linux. - * `/usr/bin` This is the primary directory for executable programs. Most programs executed by normal users which are not needed for booting or for repairing the system and which are not installed locally should be placed in this directory. - * `/usr/share` This directory contains subdirectories with specific application data, that can be shared among different architectures of the same OS. Often one finds stuff here that used to live in /usr/doc or /usr/lib or /usr/man. - -
- -#### Absolute and Relative paths - -Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_and_relative_paths) - ->An **absolute or full path** points to the same location in a file system regardless of the current working directory. To do that, it must contain the root directory. - ->By contrast, a **relative path** starts from some given working directory, avoiding the need to provide the full absolute path. A filename can be considered as a relative path based at the current working directory. If the working directory is not the file's parent directory, a file not found error will result if the file is addressed by its name. - -* `/home/learnbyexample` absolute path -* `../design` relative path -* [unix.stackexchange: Is ~/Documents a relative or an absolute path?](https://unix.stackexchange.com/questions/221970/is-documents-a-relative-or-an-absolute-path) - -**Further Reading** - -* [Learning the Linux File System - video tutorial](https://www.youtube.com/watch?v=HIXzJ3Rz9po) -* [Overview of file system](http://tldp.org/LDP/intro-linux/html/sect_03_01.html) - -
- -## Command Line Interface - -Command Line Interface (CLI) allows us interact with computer using text commands - -For example: the `cd` command would help navigating to a particular directory and `ls` command to view contents of a directory. In GUI, you'd use an explorer for directory navigation by point and click, directory contents are shown by default - -Shell and Terminal are sometimes interchangeably used to mean the same thing - a prompt where user types and executes commands. However, they are [quite different](https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con) - -* **Shell** is command line interpreter, sets the syntax rules for invoking commands, etc -* **Terminal** text input/output environment, responsible for visual details like font size, color, etc - -We'll learn more about Shell in later chapters. For now, open a Terminal and try these commands by typing them and pressing Enter key. You can spot the command lines by the prompt `$` at start of line - -```bash -$ cat /etc/shells -# /etc/shells: valid login shells -/bin/sh -/bin/dash -/bin/bash -/bin/rbash -/bin/tcsh -/usr/bin/tcsh - -$ echo "$SHELL" -/bin/bash -``` - -Note: Your command prompt might be different, for now you can leave it as or change it to the simple prompt I prefer by executing `PS1="$ "` - -In the above example, `cat` command is used to display contents of a file and `echo` command is used to display contents of a variable - these commands have other uses as well, which will be covered later on - -
- -## Command Help - -Most distros for personal use come with documentation for commands already installed. Getting used to reading manual from terminal is handy and there are various ways to get specific information - -* `man` command is an interface to reference manuals - * usually displayed using `less` command, press `q` key to quit the man page and `h` key to get help - * for Linux commands, the `info` command gives the complete documentation - * you could also read them online, for ex: [GNU Coreutils manual](https://www.gnu.org/software/coreutils/manual/coreutils.html) has manuals for most of the commands covered in this material -* `man man` will give details about the `man` command itself -* `man bash` will give you the manual page for `bash` - * `man find | gvim -` to open the manual page in your favorite text editor -* `man -k printf` will search the short descriptions in all the manual pages for the string `printf` - * `-k` here is a command option - * `man -k` is equivalent for `apropos` command -* Excellent resource [unix.stackexchange: How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/questions/193815/how-do-i-use-man-pages-to-learn-how-to-use-commands) -* See also [wiki.archlinux: man page](https://wiki.archlinux.org/index.php/man_page) - -For certain operations, shell provides its own set of commands, referred as builtin commands - -* `type` will display information about command type -* typically used to get path of command or expand alias/function, use `help type` for documentation -* See also [unix.stackexchange: What is the difference between a builtin command and one that is not?](https://unix.stackexchange.com/questions/11454/what-is-the-difference-between-a-builtin-command-and-one-that-is-not) -* See also [unix.stackexchange: Why not use “which”? What to use then?](https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then) - -```bash -$ type cd -cd is a shell builtin -$ type sed -sed is /bin/sed - -$ multiple commands can be given as arguments -$ type pwd awk -pwd is a shell builtin -awk is /usr/bin/awk - -$ type ls -ls is aliased to `ls --color=auto' -$ type -a ls -ls is aliased to `ls --color=auto' -ls is /bin/ls -``` - -* `help` command provides documentation for builtin commands - * `help help` help page on `help` command - * `-m` option will display usage in pseudo-manpage format - * `-d` option gives short description for each topic, similar to `whatis` command - * `help` command by itself without any argument displays all shell commands that are defined internally - -``` -$ help pwd -pwd: pwd [-LP] - Print the name of the current working directory. - - Options: - -L print the value of $PWD if it names the current working directory - -P print the physical directory, without any symbolic links - - By default, `pwd' behaves as if `-L' were specified. - - Exit Status: - Returns 0 unless an invalid option is given or the current directory - cannot be read. - -$ help -d compgen -compgen - Display possible completions depending on the options. -``` - -Here's some more companion commands - -* `whatis` displays one-line manual page descriptions -* `whereis` locates the binary, source, and manual page files for a command -* [explainshell](https://explainshell.com/) is a web app that shows the help text that matches each argument of command line - * example: [tar xzvf archive.tar.gz](https://explainshell.com/explain?cmd=tar%20xzvf%20archive.tar.gz) -* [ch](https://github.com/learnbyexample/command_help) is a script, inspired by explainshell, to extract option descriptions from man/help pages - -``` -$ whatis grep -grep (1) - print lines matching a pattern - -$ whereis awk -awk: /usr/bin/awk /usr/share/awk /usr/share/man/man1/awk.1.gz - -$ ch sort -k - sort - sort lines of text files - - -k, --key=KEYDEF - sort via a key; KEYDEF gives location and type -``` - -
- -## Do one thing and do it well - -The [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) applies to Linux as well: - ->Write programs that do one thing and do it well -> ->Write programs to work together -> ->Write programs to handle text streams, because that is a universal interface - -Examples given below are for demonstration purposes only, more detail in later chapters - -
- -#### Command Structure - -only the command - -* `clear` clear the terminal screen -* `top` display Linux processes - -command with options - -* `ls -l` list directory contents, use a long listing format -* `df -h` report file system disk space usage, print sizes in human readable format (e.g., 1K 234M 2G) - -command with arguments - -* `mkdir project` create directory named 'project' in current working directory -* `man sort` manual page for `sort` command -* `wget https://s.ntnu.no/bashguide.pdf` download file from internet - -command with options and arguments - -* `rm -r project` remove 'project' directory -* `paste -sd, ip.txt` combine all lines from 'ip.txt' file to single line using `,` as delimiter - -single quotes vs double quotes - -* **single quotes** preserves the literal value of each character within the quotes -* **double quotes** preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\\', and, when history expansion is enabled, '!' -* See also [stackoverflow: Difference between single and double quotes](https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash) - -```bash -$ echo '$SHELL' -$SHELL - -$ echo "$SHELL" -/bin/bash -``` - -
- -#### Command Network - -Redirecting output of a command - -* to another command - * `du -sh * | sort -h` calculate size of files/folders, display size in human-readable format which is then sorted -* to a file (instead of displaying on terminal) - * `grep 'pass' *.log > pass_list.txt` writes to file (if file already exists, it is overwritten) - * `grep 'error' *.log >> errors.txt` appends to file (creates new file if necessary) -* to a variable - * `p=$(pwd)` saves the output of `pwd` command in variable `p`, there should be no spaces around `=` - -Redirecting input - -* `wc -l < file.txt` useful to get just the number of lines, without displaying file name -* `tr 'a-z' 'A-Z' < ip.txt` some commands like `tr` only work on stdin - -Redirecting error - -* `xyz 2> cmderror.log` assuming a non-existent command `xyz`, it would give an error and gets redirected to specified file - -Redirecting output of command as input file - -* `comm -23 <(sort file1.txt) <(sort file2.txt)` process substitution, avoids need to create temporary files - -Combining output of several commands - -* `(head -n5 ~/.vimrc ; tail -n5 ~/.vimrc) > vimrc_snippet.txt` multiple commands (separated by `;`) can be grouped inside a list - -Command substitution - -* `sed -i "s|^|$(basename $PWD)/|" dir_list.txt` add current directory path and forward-slash character at the start of every line - * Note the use of double quotes - -stdin, stdout and stderr - -* `<` or `0<` is stdin filehandle -* `>` or `1>` is stdout filehandle -* `2>` is stderr filehandle -* See also [stackoverflow: stdin, stdout and stderr](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) - -More detailed discussion in [Shell](./Shell.md) chapter - diff --git a/Files_and_Directories.md b/Files_and_Directories.md deleted file mode 100644 index 5a6e462..0000000 --- a/Files_and_Directories.md +++ /dev/null @@ -1,773 +0,0 @@ -# Files and Directories - -**Table of Contents** - -* [pwd](#pwd) -* [cd](#cd) -* [clear](#clear) -* [ls](#ls) -* [mkdir](#mkdir) -* [touch](#touch) -* [rm](#rm) -* [cp](#cp) -* [mv](#mv) -* [rename](#rename) -* [ln](#ln) -* [tar and gzip](#tar-and-gzip) - -
- -Let's look at commonly used commands to navigate directories, create and modify files and directories. For certain commands, a list of commonly used options are also given - -Make it a habit to use `man` command to read about a new command - for example `man ls` - -Short descriptions for commands are shown as quoted text (taken from `whatis` or `help -d`) - -
- -## pwd - ->print name of current/working directory - -* apart from knowing your current working directory, often used to copy the absolute path to be pasted elsewhere, like in a script -* some Terminal emulators display the current directory path as window/tab title - -```bash -$ pwd -/home/learnbyexample -``` - -
- -## cd - ->Change the shell working directory - -* Like `pwd`, the `cd` command is a shell builtin -* Let's see an example of changing working directory to some other directory and coming back -* Specifying `/` at end of path argument is optional - -```bash -$ pwd -/home/learnbyexample - -$ # providing an absolute path as argument -$ cd /etc -$ pwd -/etc - -$ # to go back to previous working directory -$ # if there's a directory named '-', use './-' to go that directory -$ cd - -/home/learnbyexample -$ pwd -/home/learnbyexample -``` - -* Relative paths are well, relative to current working directory -* `.` refers to current directory -* `..` refers to directory one hierarchy above -* `../..` refers to directory two hierarchies above and so on - -```bash -$ pwd -/home/learnbyexample - -$ # go to directory one hierarchy above -$ cd .. -$ pwd -/home - -$ # go to directory 'learnbyexample' present in current directory -$ # './' is optional in this case -$ cd ./learnbyexample -$ pwd -/home/learnbyexample - -$ # go to directory two hierarchies above -$ cd ../.. -$ pwd -/ -``` - -* `cd ~/` or `cd ~` or `cd` will go to directory specified by `HOME` shell variable (which is usually set to user's home directory) - -```bash -$ pwd -/ -$ echo "$HOME" -/home/learnbyexample - -$ cd -$ pwd -/home/learnbyexample -``` - -**Further Reading** - -* Use `help cd` for documentation -* [cd Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cd-command?sort=votes&pageSize=15) -* [cd Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cd?sort=votes&pageSize=15) -* [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html) - -
- -## clear - ->clear the terminal screen - -You can also use `Ctrl+l` short-cut to clear the Terminal screen (in addition, this retains any typed text) - -
- -## ls - ->list directory contents - -* by default, `ls` output is sorted alphabetically - -```bash -$ # if no argument is given, current directory contents are displayed -$ ls -backups hello_world.py palindrome.py projects todo -ch.sh ip.txt power.log report.log workshop_brochures - -$ # absolute/relative paths can be given as arguments -$ ls /var/ -backups crash local log metrics run spool -cache lib lock mail opt snap tmp -$ # for multiple arguments, listing is organized by directory -$ ls workshop_brochures/ backups/ -backups: -chrome_bookmarks_02_07_2018.html dot_files - -workshop_brochures: -Python_workshop_2017.pdf Scripting_course_2016.pdf - -$ # single column listing -$ ls -1 backups/ -chrome_bookmarks_02_07_2018.html -dot_files -``` - -* `-F` appends a character to each file name indicating the file type (other than regular files) - * `/` for directories - * `*` for executable files - * `@` for symbolic links - * `|` for FIFOs - * `=` for sockets - * `>` for doors - * the indicator details are described in `info ls`, not in `man ls` - -```bash -$ ls -F -backups/ hello_world.py* palindrome.py* projects@ todo -ch.sh* ip.txt power.log report.log workshop_brochures/ - -$ # if you just need to distinguish file and directory, use -p -$ ls -p -backups/ hello_world.py palindrome.py projects todo -ch.sh ip.txt power.log report.log workshop_brochures/ -``` - -* or use the color option - -![ls color output](./images/ls_color.png) - -* long listing format -* shows details like file permissions, ownership, size, timestamp, etc - * See [chmod](./Working_with_Files_and_Directories.md#chmod) section for details on permissions, groups, etc -* file types are distinguished as `d` for directories, `-` for regular files, `l` for symbolic links, etc - -```bash -$ ls -l -total 84 -drwxrwxr-x 3 learnbyexample eg 4096 Jul 4 18:23 backups --rwxr-xr-x 1 learnbyexample eg 2746 Mar 30 11:38 ch.sh --rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py --rw-rw-r-- 1 learnbyexample eg 34 Jul 4 09:01 ip.txt --rwxrwxr-x 1 learnbyexample eg 1236 Aug 21 2017 palindrome.py --rw-r--r-- 1 learnbyexample eg 10449 Mar 8 2017 power.log -lrwxrwxrwx 1 learnbyexample eg 12 Jun 21 12:08 projects -> ../projects/ --rw-rw-r-- 1 learnbyexample eg 39120 Feb 25 2017 report.log --rw-rw-r-- 1 learnbyexample eg 5987 Apr 11 11:06 todo -drwxrwxr-x 2 learnbyexample eg 4096 Jul 5 12:05 workshop_brochures - -$ # to show size in human readable format instead of byte count -$ ls -lh power.log --rw-r--r-- 1 learnbyexample eg 11K Mar 8 2017 power.log - -$ # use -s option instead of -l if only size info is needed -$ ls -1sh power.log report.log -12K power.log -40K report.log -``` - -* changing sorting criteria -* use `-t` to sort by timestamp, often combined with `-r` to reverse the order so that most recently modified file shows as last item -* `-S` option sorts by file size (not suitable for directories) -* `-v` option does version sorting (suitable for filenames with numbers in them) -* `-X` option allows to sort by file extension (i.e characters after the last `.` in filename) - -```bash -$ ls -lhtr -total 84K --rw-rw-r-- 1 learnbyexample eg 39K Feb 25 2017 report.log --rw-r--r-- 1 learnbyexample eg 11K Mar 8 2017 power.log --rwxrwxr-x 1 learnbyexample eg 1.3K Aug 21 2017 palindrome.py --rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py --rwxr-xr-x 1 learnbyexample eg 2.7K Mar 30 11:38 ch.sh --rw-rw-r-- 1 learnbyexample eg 5.9K Apr 11 11:06 todo -lrwxrwxrwx 1 learnbyexample eg 12 Jun 21 12:08 projects -> ../projects/ --rw-rw-r-- 1 learnbyexample eg 34 Jul 4 09:01 ip.txt -drwxrwxr-x 3 learnbyexample eg 4.0K Jul 4 18:23 backups -drwxrwxr-x 2 learnbyexample eg 4.0K Jul 5 12:05 workshop_brochures - -$ ls -X -backups todo power.log hello_world.py ch.sh -projects workshop_brochures report.log palindrome.py ip.txt -``` - -* filenames starting with `.` are considered as hidden files - -```bash -$ # -a option will show hidden files too -$ ls -a backups/dot_files/ -. .. .bashrc .inputrc .vimrc - -$ # . and .. are special directories pointing to current and parent directory -$ # if you recall, we have used them in specifying relative paths -$ # so, 'ls', 'ls .' and 'ls backups/..' will give same result -$ ls -aF backups/dot_files/ -./ ../ .bashrc .inputrc .vimrc - -$ # use -A option to show hidden files excluding . and .. special directories -$ ls -A backups/dot_files/ -.bashrc .inputrc .vimrc -``` - -* use `-R` option to recursively list sub-directories too - -```bash -$ ls -ARF -.: -backups/ hello_world.py* palindrome.py* projects@ todo -ch.sh* ip.txt power.log report.log workshop_brochures/ - -./backups: -chrome_bookmarks_02_07_2018.html dot_files/ - -./backups/dot_files: -.bashrc .inputrc .vimrc - -./workshop_brochures: -Python_workshop_2017.pdf Scripting_course_2016.pdf -``` - -* `tree` command displays contents of a directory recursively as a tree like structure -* you might have to install this command or have an equivalent command like `gvfs-tree` - -```bash -$ # -h option will show hidden files -$ gvfs-tree -h -file:///home/learnbyexample/ls_ex -|-- backups -| |-- chrome_bookmarks_02_07_2018.html -| `-- dot_files -| |-- .bashrc -| |-- .inputrc -| `-- .vimrc -|-- ch.sh -|-- hello_world.py -|-- ip.txt -|-- palindrome.py -|-- power.log -|-- projects -> ../projects/ -|-- report.log -|-- todo -`-- workshop_brochures - |-- Python_workshop_2017.pdf - `-- Scripting_course_2016.pdf -``` - -* often, we want to prune which files/directories are to be listed -* commands like `find` provide extensive features in this regard -* the shell itself provides a matching technique called glob/wildcards - * see [Shell wildcards](./Shell.md#wildcards) section for more examples and details -* beginners incorrectly associate globbing with `ls` command, so globbing results are shown below using `echo` command as a demonstration - -```bash -$ # all unquoted arguments are subjected to shell globbing interpretation -$ echo *.py *.log -hello_world.py palindrome.py power.log report.log -$ echo '*.py' *.log -*.py power.log report.log - -$ # long list only files ending with .py -$ ls -l *.py --rwxrwxr-x 1 learnbyexample eg 41 Aug 21 2017 hello_world.py --rwxrwxr-x 1 learnbyexample eg 1236 Aug 21 2017 palindrome.py - -$ # match all filenames starting with alphabets c/d/e/f/g/h/i -$ echo [c-i]* -ch.sh hello_world.py ip.txt -$ ls -sh [c-i]* -4.0K ch.sh 4.0K hello_world.py 4.0K ip.txt -``` - -* use `-d` option to not show directory contents - -```bash -$ echo b* -backups -$ # since backups is a directory, ls will list its contents -$ ls b* -chrome_bookmarks_02_07_2018.html dot_files -$ # -d option will show the directory entry instead of its contents -$ ls -d b* -backups - -$ # a simple way to get only the directory entries -$ # assuming simple filenames without spaces/newlines/etc -$ echo */ -backups/ projects/ workshop_brochures/ -$ ls -d */ -backups/ projects/ workshop_brochures/ -``` - -**Further Reading** - -* `man ls` and `info ls` for more options and complete documentation -* [ls Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ls?sort=votes&pageSize=15) -* [ls Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ls?sort=votes&pageSize=15) -* [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) -* [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls) -* [unix.stackexchange: What are ./ and ../ directories?](https://unix.stackexchange.com/questions/63081/what-are-and-directories) - -
- -## mkdir - ->make directories - -* Linux filenames can use any character other than `/` and the ASCII NUL character -* quote the arguments if name contains characters like space, `*`, etc to prevent shell interpretation - * shell considers space as argument separator, `*` is a globbing character, etc -* unless otherwise needed, try to use only alphabets, numbers and underscores for filenames - -```bash -$ # one or more absolute/relative paths can be given to create directories -$ mkdir reports 'low power adders' - -$ # listing can be confusing when filename contains characters like space -$ ls -low power adders reports -$ ls -1 -low power adders -reports -``` - -* use `-p` option to create multiple directory hierarchies in one go -* it is also useful in scripts to create a directory without having to check if it already exists -* special variable `$?` gives exit status of last executed command - * `0` indicates success and other values indicate some kind of failure - * see documentation of respective commands for details - -```bash -$ mkdir reports -mkdir: cannot create directory ‘reports’: File exists -$ echo $? -1 -$ # when -p is used, mkdir won't give an error if directory already exists -$ mkdir -p reports -$ echo $? -0 - -$ # error because 'a/b' doesn't exist -$ mkdir a/b/c -mkdir: cannot create directory ‘a/b/c’: No such file or directory -$ # with -p, any non-existing directory will be created as well -$ mkdir -p a/b/c -$ ls -1R a -a: -b - -a/b: -c - -a/b/c: -``` - -**Further Reading** - -* [mkdir Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/mkdir?sort=votes&pageSize=15) -* [mkdir Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mkdir?sort=votes&pageSize=15) -* [unix.stackexchange: Characters best avoided in filenames](https://unix.stackexchange.com/questions/269093/characters-best-avoided-in-filenames-when-used-in-bash-e-g) - -
- -## touch - -* Usually files are created using a text editor or by redirecting output of a command to a file -* But sometimes, for example to test file renaming, creating empty files comes in handy -* the `touch` command is primarily used to change timestamp of a file (see [touch](./Working_with_Files_and_Directories.md#touch) section of next chapter) -* if a filename given to `touch` doesn't exist, an empty file gets created with current timestamp - -```bash -$ touch ip.txt -$ ls -1F -a/ -ip.txt -low power adders/ -reports/ -``` - -
- -## rm - ->remove files and directories - -* to delete files, specify them as separate arguments -* to delete directories as well, use `-r` option (deletes recursively) -* use `-f` option to force remove without prompt for non-existing files and write protected files (provided user has appropriate permissions) - -```bash -$ ls -a ip.txt low power adders reports -$ rm ip.txt -$ ls -a low power adders reports - -$ rm reports -rm: cannot remove 'reports': Is a directory -$ rm -r reports -$ ls -a low power adders - -$ # to remove only empty directory, same as 'rmdir' command -$ rm -d a -rm: cannot remove 'a': Directory not empty -``` - -* typos like misplaced space, wrong glob, etc could wipe out files not intended for deletion -* apart from having backups and snapshots, one could take some mitigating steps - * using `-i` option to interactively delete each file - * using `echo` as a dry run to see how the glob expands - * using a trash command (see links below) instead of `rm` - -```bash -$ rm -ri 'low power adders' -rm: remove directory 'low power adders'? n -$ ls -a low power adders - -$ rm -ri a -rm: descend into directory 'a'? y -rm: descend into directory 'a/b'? y -rm: remove directory 'a/b/c'? y -rm: remove directory 'a/b'? y -rm: remove directory 'a'? y -$ ls -low power adders -``` - -**Further Reading** - -* See if a trash command is available for your distro (for ex: `gvfs-trash` on Ubuntu) - this will send items to trash instead of deletion - * or, [unix.stackexchange: creating a simple trash command](https://unix.stackexchange.com/questions/452496/create-a-recycle-bin-feature-without-using-functions) -* Files removed using `rm` can still be recovered with time/skill. Use `shred` command to overwrite files - * [unix.stackexchange: recover deleted files](https://unix.stackexchange.com/questions/80270/unix-linux-undelete-recover-deleted-files) - * [unix.stackexchange: recovering accidentally deleted files](https://unix.stackexchange.com/questions/2677/recovering-accidentally-deleted-files) - * [wiki.archlinux: Securely wipe disk](https://wiki.archlinux.org/index.php/Securely_wipe_disk) -* [rm Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rm?sort=votes&pageSize=15) -* [rm Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rm?sort=votes&pageSize=15) - -
- -## cp - ->copy files and directories - -* to copy a single file or directory, specify the source as first argument and destination as second argument -* similar to `rm` command, use `-r` for directories - -```bash -$ # when destination is a directory, specified sources are placed inside that directory -$ # recall that . is a relative path referring to current directory -$ cp /usr/share/dict/words . -$ ls -low power adders words - -$ cp /usr/share/dict . -cp: omitting directory '/usr/share/dict' -$ cp -r /usr/share/dict . -$ ls -1F -dict/ -low power adders/ -words -``` - -* often, we want to copy for the purpose of modifying it -* in such cases, a different name can be given while specifying the destination -* if the destination filename already exists, it will be overwritten (see options `-i` and `-n` to avoid this) - -```bash -$ cp /usr/share/dict/words words_ref.txt -$ cp -r /usr/share/dict word_lists - -$ ls -1F -dict/ -low power adders/ -word_lists/ -words -words_ref.txt -``` - -* multiple files and directories can be copied at once if the destination is a directory -* using `-t` option, one could specify destination directory first followed by sources (this is helpful with `find` command and other places) - -```bash -$ mkdir bkp_dot_files - -$ # here, ~ will get expanded to user's home directory -$ cp ~/.bashrc ~/.bash_profile bkp_dot_files/ -$ ls -A bkp_dot_files -.bash_profile .bashrc -``` - -* see `man cp` and `info cp` for more options and complete documentation -* some notable options are - * `-u` copy files from source only if they are newer than those in destination or if it doesn't exist in destination location - * `-b` and `--backup` for back up options if file with same name already exists in destination location - * `--preserve` option to copy files along with source file attributes like timestamp - -**Further Reading** - -* [cp Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cp?sort=votes&pageSize=15) -* [cp Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cp?sort=votes&pageSize=15) -* `rsync` a fast, versatile, remote (and local) file-copying tool - * [rsync examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) - * [rsync Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rsync?sort=votes&pageSize=15) - * [rsync Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/rsync?sort=votes&pageSize=15) - -
- -## mv - ->move (rename) files - -* as name suggests, `mv` can move files from one location to another -* if multiple files need to be moved, destination argument should be a directory (or specified using `-t` option) -* unlike `rm` and `cp`, both files and directories have same syntax, no additional option required -* use `-i` option to be prompted instead of overwriting file of same name in destination location - -```bash -$ ls -bkp_dot_files dict low power adders word_lists words words_ref.txt -$ mkdir backups - -$ mv bkp_dot_files/ backups/ -$ ls -F -backups/ dict/ low power adders/ word_lists/ words words_ref.txt -$ ls -F backups/ -bkp_dot_files/ - -$ mv dict words backups/ -$ ls -F -backups/ low power adders/ word_lists/ words_ref.txt -$ ls -F backups/ -bkp_dot_files/ dict/ words -``` - -* like `cp` command, for single file/directory one can provide a different destination name -* so, when source and destination has same parent directory, `mv` acts as renaming command - -```bash -$ mv backups/bkp_dot_files backups/dot_files -$ ls -F backups/ -dict/ dot_files/ words -``` - -**Further Reading** - -* [mv Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/mv?sort=votes&pageSize=15) -* [mv Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/mv?sort=votes&pageSize=15) - -
- -## rename - ->renames multiple files - -Note: The `perl` based `rename` is presented here which is different from [util-linux-ng version](https://linux.die.net/man/1/rename). Check `man rename` for details - -```bash -$ ls -backups low power adders word_lists words_ref.txt -$ # here, the * glob will expand to all non-hidden files in current directory -$ # -n option is for dry run, to see changes before actually renaming files -$ # s/ /_/g means replace all space characters with _ character -$ rename -n 's/ /_/g' * -rename(low power adders, low_power_adders) - -$ rename 's/ /_/g' * -$ ls -backups low_power_adders word_lists words_ref.txt -``` - -**Further Reading** - -* [rename Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/rename?sort=votes&pageSize=15) -* See [Perl one liners](https://github.com/learnbyexample/Command-line-text-processing/blob/master/perl_the_swiss_knife.md) for examples and details on Perl substitution command -* Some more `rename` examples - [unix.stackexchange: replace dots except last one](https://unix.stackexchange.com/questions/315586/replacing-dots-in-file-name-with-underscores-except-the-extension/315589#315589) and [stackoverflow: change date format](https://stackoverflow.com/questions/40286513/converting-date-format-in-bash/40288150#40288150) - -
- -## ln - ->make links between files - -* there are two types of links - symbolic and hard links -* symbolic links is like a pointer/shortcut to another file or directory - * if the original file is deleted or moved to another location, symbolic link will no longer work - * if the symbolic link is moved to another location, it will still work if the link was done using absolute path (for relative path, it will depend on whether or not there's another file with same name in that location) - * a symbolic link file has its own inode, permissions, timestamps, etc - * most commands will work the same when original file or the symbolic file is given as command line argument, see their documentation for details - -```bash -$ # similar to cp, a different name can be specified if needed -$ ln -s /usr/share/dict/words . -$ ls -F -words@ - -$ # to know which file the link points to -$ ls -l words -lrwxrwxrwx 1 learnbyexample eg 21 Jul 9 13:41 words -> /usr/share/dict/words -$ readlink words -/usr/share/dict/words -$ # the linked file may be another link -$ # use -f option to get original file -$ readlink -f words -/usr/share/dict/english -``` - -* hard link can only point to another file (not a directory, and restricted to within the same filesystem) - * the `.` and `..` special directories are the exceptions, they are hard links which are automatically created -* once a hard link is created, there is no distinction between the two files other than different filename/location - they have same inode, permissions, timestamps, etc -* any of the hard link will continue working even if all the other hard links are deleted -* if a hard link is moved to another location, the links will still be in sync - any change in one of them will be reflected in all the other links - -```bash -$ touch foo.txt -$ ln foo.txt baz.txt - -$ # the -i option gives inode -$ ls -1i foo.txt baz.txt -649140 baz.txt -649140 foo.txt -``` - -**Further Reading** - -* `unlink` command to delete links (`rm` can be used as well) -* [ln Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ln?sort=votes&pageSize=15) -* [ln Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ln?sort=votes&pageSize=15) -* [askubuntu: What is the difference between a hard link and a symbolic link?](https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) -* [unix.stackexchange: What is the difference between symbolic and hard links?](https://unix.stackexchange.com/questions/9575/what-is-the-difference-between-symbolic-and-hard-links) -* [unix.stackexchange: What is a Superblock, Inode, Dentry and a File?](https://unix.stackexchange.com/questions/4402/what-is-a-superblock-inode-dentry-and-a-file) - -
- -## tar and gzip - -* `tar` is an archiving utility -* first, lets see an example of creating single archive file from multiple input files -* note that the archive file so created is a new file and doesn't overwrite input files - -```bash -$ ls -F -backups/ low_power_adders/ word_lists/ words_ref.txt - -$ # -c option creates a new archive, existing archive will be overwritten -$ # -f option allows to specify name of archive to be created -$ # rest of the arguments are the files to be archived -$ tar -cf bkp_words.tar word_lists words_ref.txt - -$ ls -F -backups/ bkp_words.tar low_power_adders/ word_lists/ words_ref.txt -$ ls -sh bkp_words.tar -2.3M bkp_words.tar -``` - -* once we have an archive, we can compress it using `gzip` -* this will replace the archive file with compressed version, adding a `.gz` suffix - -```bash -$ gzip bkp_words.tar - -$ ls -F -backups/ bkp_words.tar.gz low_power_adders/ word_lists/ words_ref.txt -$ ls -sh bkp_words.tar.gz -652K bkp_words.tar.gz -``` - -* to uncompress, use `gunzip` or `gzip -d` -* this will replace the compressed version with the uncompressed archive file - -```bash -$ gunzip bkp_words.tar.gz - -$ ls -F -backups/ bkp_words.tar low_power_adders/ word_lists/ words_ref.txt -$ ls -sh bkp_words.tar -2.3M bkp_words.tar -``` - -* to extract the original files from archive, use `-x` option - -```bash -$ mkdir test_extract -$ mv bkp_words.tar test_extract/ -$ cd test_extract/ -$ ls -bkp_words.tar - -$ tar -xf bkp_words.tar -$ ls -F -bkp_words.tar word_lists/ words_ref.txt -$ cd .. -$ rm -r test_extract/ -``` - -* the GNU version of `tar` supports compressing/uncompressing options as well - -```bash -$ ls -F -backups/ low_power_adders/ word_lists/ words_ref.txt - -$ # -z option gives same compression as gzip command -$ # reverse would be: tar -zxf bkp_words.tar.gz -$ tar -zcf bkp_words.tar.gz word_lists words_ref.txt -$ ls -sh bkp_words.tar.gz -652K bkp_words.tar.gz -``` - -* there are loads of options for various needs, see documentation for details - * `-v` for verbose option - * `-r` to append files to archive - * `-t` to list contents of archive - * `--exclude=` to specify files to be ignored from archiving - * `-j` and `-J` to use `bzip2` or `xz` compression technique instead of `-z` which uses `gzip` -* there are commands starting with `z` to work with compressed files - * `zcat` to display file contents of compressed file on standard output - * `zless` to display file contents of compressed file one screenful at a time - * `zgrep` to search compressed files and so on... - -**Further Reading** - -* [tar Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/tar?sort=votes&pageSize=15) -* [tar Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/tar?sort=votes&pageSize=15) -* [superuser: gzip without tar? Why are they used together?](https://superuser.com/questions/252065/gzip-without-tar-why-are-they-used-together) -* `zip` and `unzip` commands - diff --git a/Linux_Introduction.md b/Linux_Introduction.md deleted file mode 100644 index b022974..0000000 --- a/Linux_Introduction.md +++ /dev/null @@ -1,72 +0,0 @@ -# Linux Introduction - -**Table of Contents** - -* [What is Linux?](#what-is-linux) -* [Why use Linux?](#why-use-linux) -* [Where is Linux deployed?](#where-is-linux-deployed) -* [Linux Distros](#linux-distros) -* [Linux resource lists](#linux-resource-lists) - -
- -## What is Linux? - -Quoting from [Wikipedia](https://en.wikipedia.org/wiki/Linux) - ->Linux is a family of free and open-source software operating systems built around the Linux kernel. Typically, Linux is packaged in a form known as a Linux distribution (or distro for short) for both desktop and server use. The defining component of a Linux distribution is the Linux kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Many Linux distributions use the word "Linux" in their name. The Free Software Foundation uses the name GNU/Linux to refer to the operating system family, as well as specific distributions, to emphasize that most Linux distributions are not just the Linux kernel, and that they have in common not only the kernel, but also numerous utilities and libraries, a large proportion of which are from the GNU project - -
- -## Why use Linux? - -* Faster, Secure, Stable - * it helps that developers from all over the world contribute, instead of just a single company -* Highly configurable -* Suitable for both single/multiuser environment -* Well defined hierarchy and permissions to allow networking across different groups and sites -* Strong set of commands to automate repetitive manual tasks -* Read more on using Linux and whether it fits your computing needs on [computefreely](https://computefreely.org/) - -
- -## Where is Linux deployed? - -* Servers -* Supercomputers - * To quote [TOP500 article on wikipedia](https://en.wikipedia.org/wiki/TOP500), "Since November 2017, all the listed supercomputers (100% of the performance share) use an operating system based on the Linux kernel" -* Embedded/IoT devices like POS, Raspberry Pi -* Smart phones - * Android - built on top of Linux kernel - * iOS - Unix based -* Personal and Enterprise Computers -* And many more uses, thanks to being open source -* [Usage Share of Operating Systems](https://en.wikipedia.org/wiki/Usage_share_of_operating_systems) - -
- -## Linux Distros - -There are various Linux flavors called 'distribution' (distro for short), to cater the needs of beginners to advanced users as well as highly customized as per end use case - -* There are [hundreds of known distributions](https://en.wikipedia.org/wiki/List_of_Linux_distributions) -* One can keep track of them at [distrowatch](https://distrowatch.com/) - * [Statistics of various Linux Distros](https://distrowatch.com/dwres.php?resource=popularity) -* [Popular Linux Distros compared](https://www.howtogeek.com/191207/10-of-the-most-popular-linux-distributions-compared/) -* [Light Weight Linux Distros](https://en.wikipedia.org/wiki/Light-weight_Linux_distribution) - -**Installation** - -Usually, you'll find installation instructions from respective website of the distro you chose. If you need an overview of installation process, this should help - -* [Installing Nearly Any Distro On Just About Any Machine](https://www.newnix.space/blog/2015/7/6/installing-nearly-any-distro-on-just-about-any-machine) -* [Try out Linux on Virtual Machine](https://blog.storagecraft.com/the-dead-simple-guide-to-installing-a-linux-virtual-machine-on-windows/) - -
- -## Linux resource lists - -* [Linux curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Linux_curated_resources.md) -* [Awesome linux by Aleksandar](https://github.com/aleksandar-todorovic/awesome-linux) -* [Linux resources by Paul](https://linux.zeef.com/paul.reiber) - diff --git a/README.md b/README.md index 374a9ba..8f95e6f 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,49 @@ -# Linux Command Line +# Computing from the Command Line -Introduction to Linux commands and Shell scripting +⚠️ ⚠️ ⚠️ This is a **work-in-progress** book on Linux command line and Shell Scripting for beginner to intermediate level users. -* [Linux curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Linux_curated_resources.md) for more complete resources list, including tutorials for beginners -* For more related resources, visit [scripting course](https://github.com/learnbyexample/scripting_course) and my programming blog https://learnbyexample.github.io +[Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an earlier version of the book on this repo. + +See also my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources.
-# Chapters - -* [Linux Introduction](./Linux_Introduction.md) - * What is Linux?, Why use Linux?, Where is Linux deployed?, Linux Distros, Linux resource lists -* [Command Line Introduction](./Command_Line_Introduction.md) - * File System, Command Line Interface, Command Help, Do one thing and do it well -* [Files and Directories](./Files_and_Directories.md) - * pwd, clear, ls, cd, mkdir, touch, rm, cp, mv, rename, ln, tar and gzip -* [Working with Files and Directories](./Working_with_Files_and_Directories.md) - * cat, less, tail, head, Text Editors, grep, find, locate, wc, du, df, touch, file, identify, basename, dirname, chmod -* [Text Processing](./Text_Processing.md) - * sort, uniq, comm, cmp, diff, tr, sed, awk, perl, cut, paste, column, pr -* [Shell](./Shell.md) - * What is Shell?, Popular Shells, Wildcards, Redirection, Process Control, Running jobs in background -* [Shell Customization](./Shell_Customization.md) - * Variables, Config files, Emac mode Readline shortcuts -* [Shell Scripting](./Shell_Scripting.md) - * Need for scripting, Hello script, Command Line Arguments, Variables and Comparisons, Accepting User Input interactively, if then else, for loop, while loop, Debugging, Resource lists +# E-book + +For web version of the book, visit https://learnbyexample.github.io/cli-computing/ + +* Links to pdf/epub versions of the book will be added once they are done +* See https://learnbyexample.github.io/books/ for list of other books
-## Contributing +## Feedback and Contributing -* Please open an issue for typos/bugs/suggestions/etc - * **Please open an issue for discussion before submitting PRs** -* Share the repo with friends/colleagues, on social media, etc to help reach other learners -* In case you need to reach me, mail me at `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` or send a DM via [twitter](https://twitter.com/learn_byexample) +[Open an issue](https://github.com/learnbyexample/cli-computing/issues) if you spot any typo/errors. -
+⚠️ ⚠️ Please DO NOT submit pull requests. Main reason being any modification requires changes in multiple places. -# ebook +I'd also highly appreciate your feedback about the book. -* Read as ebook on [gitbook](https://learnbyexample.gitbooks.io/linux-command-line/content/index.html) -* All `legacy.gitbook.com` links are now automatically redirected to `gitbook.com`, so there's no longer an option to download ebooks for offline reading +Twitter: https://twitter.com/learn_byexample
-# Acknowledgements +# Acknowledgements -* [unix.stackexchange](https://unix.stackexchange.com/) and [stackoverflow](https://stackoverflow.com/) - for getting answers to pertinent questions as well as sharpening skills by understanding and answering questions -* [Devs and Hackers](http://devup.in/) - helpful slack group -* Forums like [/r/commandline/](https://www.reddit.com/r/commandline/), [Weekly Coders, Hackers & All Tech related thread](https://www.reddit.com/r/india/search?q=Weekly+Coders%2C+Hackers+%26+All+Tech+related+thread+author%3Aavinassh&restrict_sr=on&sort=new&t=all) - for suggestions and critique +* [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) — for getting answers on pertinent questions related to cli tools +* [/r/commandline/](https://www.reddit.com/r/commandline), [/r/linux4noobs/](https://www.reddit.com/r/linux4noobs/) and [/r/linux/](https://www.reddit.com/r/linux/) — helpful forums +* [Warning](https://commons.wikimedia.org/wiki/File:Warning_icon.svg) and [Info](https://commons.wikimedia.org/wiki/File:Info_icon_002.svg) icons by [Amada44](https://commons.wikimedia.org/wiki/User:Amada44) under public domain +* [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) for optimizing images +* [mdBook](https://github.com/rust-lang/mdBook) — for web version of the book + * [mdBook-pagetoc](https://github.com/JorelAli/mdBook-pagetoc) — for adding table of contents for each page + * [minify-html](https://github.com/wilsonzlin/minify-html) — for minifying html files
-# License +# License + +The book is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) -This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) +The code snippets are licensed under MIT, see [LICENSE](./LICENSE) file diff --git a/Shell.md b/Shell.md deleted file mode 100644 index b42ae9d..0000000 --- a/Shell.md +++ /dev/null @@ -1,340 +0,0 @@ -# Shell - -* [What is Shell?](#what-is-shell) -* [Popular Shells](#popular-shells) -* [Wildcards](#wildcards) -* [Redirection](#redirection) -* [Process Control](#process-control) -* [Running jobs in background](#running-jobs-in-background) - -
- -### What is Shell? - -Quoting from [wikipedia](https://en.wikipedia.org/wiki/Unix_shell) - ->A Unix shell is a command-line interpreter or shell that provides a traditional Unix-like command line user interface. Users direct the operation of the computer by entering commands as text for a command line interpreter to execute, or by creating text scripts of one or more such commands. Users typically interact with a Unix shell using a terminal emulator, however, direct operation via serial hardware connections, or networking session, are common for server systems. All Unix shells provide filename wildcarding, piping, here documents, command substitution, variables and control structures for condition-testing and iteration - -* Interprets user commands - * from terminal, from a file or as a shell script - * expand wildcards, command/variable substitution -* Command history, command completion and command editing -* Managing processes -* Shell variables to customize the environment -* [Difference between shell, tty and console](https://www.reddit.com/r/programming/comments/41u5hw/what_is_the_exact_difference_between_a_terminal_a/) - -
- -### Popular Shells - -Like any indispensible software, Shell has undergone transformation from the days of basic `sh` shell that was used in 1970s Unix. While `bash` is default shell in most distros and most commonly used, powerful and feature rich shells are still being developed and released - -* `sh` bourne shell (light weight Linux distros might come with `sh` shell only) -* `bash` bourne again shell -* `csh` C shell -* `tcsh` tenex C shell -* `ksh` Korn shell -* `zsh` Z shell (bourne shell with improvements, including features from bash, tcsh, ksh) -* `cat /etc/shells` displays list of login shells available in the current Linux distro -* `echo $SHELL` path of current user's login shell - * The material presented here is primarily for interactive shell - * [difference between login shell and non-login shell](https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell) - -**Further Reading** - -* [Comparison of command shells](https://en.wikipedia.org/wiki/Comparison_of_command_shells) -* [Features and differences between various shells](http://www.faqs.org/faqs/unix-faq/shell/shell-differences/) -* [syntax comparison on different shells with examples](http://hyperpolyglot.org/unix-shells) -* `bash` shell has also been ported on Windows platform - * [git bash](https://git-for-windows.github.io/) - * [Cygwin](https://www.cygwin.com/) - * [MinGW](http://www.mingw.org/) - * [Linux Subsystem for Windows](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/) -* [Shell, choosing shell and changing default shells](https://wiki.ubuntu.com/ChangingShells) - -
- -### Wildcards - -It is easy to specify complete filenames as command arguments when they are few in number. But suppose, one has to delete hundreds of log files, spread across different sub-directories? Wildcards, or also known as globbing patterns help in such cases, provided the filenames have a commonality to exploit. We have already seen regular expressions used in commands like `grep` and `sed`. Shell wildcards are similar but has fundamental and syntactical differences - -* `*` match any character, 0 or more times - * as a special case, `*` won't match the starting `.` of hidden files and has to be explicity specified -* `?` match any character exactly 1 time -* `[aeiou]` match any vowel character -* `[!aeiou]` exclude vowel characters, i.e match a consonant -* `[!0-9]` match any character except digits -* `[a-z]` match any lower case alphabets -* `[0-9a-fA-F]` match any hexademical character -* `{word1,word2}` match either of the specified words - * words can themselves be made of wildcards - -**Examples** - -* `ls txt*` list all files starting with txt -* `ls *txt*` list all files containing txt anywhere in its name -* `ls *txt` list all files ending with txt in the current directory -* `ls -d .*` list only hidden files and directories -* `rm *.???` remove any file ending with . character followed by exactly three characters -* `ls bkp/201[0-5]` list files in bkp directory matching 2010/2011/2012/2013/2014/2015 -* `echo *txt` for dry runs, use `echo` command to see how the wildcard expands - -**Brace Expansion** - -* `ls *{txt,log}` list all files ending with txt or log in the current directory -* `cp ~/projects/adders/verilog/{half_,full_}adder.v .` copy half_adder.v and full_adder.v to current directory -* `mv story.txt{,.bkp}` rename story.txt as story.txt.bkp -* `cp story.txt{,.bkp}` to create bkp file as well retain original -* `mv story.txt{.bkp,}` rename story.txt.bkp as story.txt -* `mv story{,_old}.txt` rename story.txt as story_old.txt -* `touch file{1..4}.txt` same as `touch file1.txt file2.txt file3.txt file4.txt` -* `touch file_{x..z}.txt` same as `touch file_x.txt file_y.txt file_z.txt` -* `rm file{1..4}.txt` same as `rm file1.txt file2.txt file3.txt file4.txt` -* `echo story.txt{,.bkp}` displays the expanded version 'story.txt story.txt.bkp' , useful to dry run before executing actual command - -**Extended globs** - -From `info bash`, where `pattern-list` is a list of one or more patterns separated by a `|` - -* `?(pattern-list)` Matches zero or one occurrence of the given patterns -* `*(pattern-list)` Matches zero or more occurrences of the given patterns -* `+(pattern-list)` Matches one or more occurrences of the given patterns -* `@(pattern-list)` Matches one of the given patterns -* `!(pattern-list)` Matches anything except one of the given patterns - -To check if `extglob` is enabled or to enable/disable: - -```bash -$ shopt extglob -extglob on - -$ # unset extglob -$ shopt -u extglob -$ shopt extglob -extglob off - -$ # set extglob -$ shopt -s extglob -$ shopt extglob -extglob on -``` - -Examples - -```bash -$ ls -123.txt main.c math.h power.log - -$ echo +([0-9]).txt -123.txt - -$ ls @(*.c|*.h) -main.c math.h - -$ ls !(*.txt) -main.c math.h power.log -$ ls !(*.c|*.h) -123.txt power.log -``` - -**Recursively search current directory and its sub-folders** - -Set `globstar` and prefix pattern with `**/` to search recursively - -```bash -$ find -name '*.txt' -./song_list.txt -./bar/f1.txt -./bar/baz/f2.txt - -$ shopt -s globstar -$ ls **/*.txt -bar/baz/f2.txt bar/f1.txt song_list.txt -``` - -**Further Reading** - -* [Glob](http://mywiki.wooledge.org/glob) -* See topic 'Pathname Expansion' in `info bash` -* [brace expansion wiki](http://wiki.bash-hackers.org/syntax/expansion/brace) -* [when to use brace expansion](https://unix.stackexchange.com/questions/6035/when-do-you-use-brace-expansion) - -
- -### Redirection - -By default all results of a command are displayed on the terminal, which is the default destination for **standard output**. But often, one might want to save or discard them or send as input to another command. Similarly, inputs to a command can be given from files or from another command. Errors are special outputs generated on a wrong usage of command or command name - -* `<` or `0<` is stdin filehandle -* `>` or `1>` is stdout filehandle -* `2>` is stderr filehandle - -**Redirecting output of a command to a file** - -* `grep -i 'error' report/*.log > error.log` create new file, overwrite if file already exists -* `grep -i 'fail' test_results_20mar2015.log >> all_fail_tests.log` creates new file if file doesn’t exist, otherwise append the result to existing file -* `./script.sh > /dev/null` redirect output to a special file `/dev/null` that just discards everything written to it, whatever may be the size -* [explicitly override the setting of noclobber with the >| redirection operator](https://unix.stackexchange.com/questions/45201/bash-what-does-do/45203#45203) - -**Redirecting output of a command to another command** - -* `ls -q | wc -l` the 'pipe' operator redirects stdout of `ls` command to `wc` command as stdin -* `du -sh * | sort -h` calculate size of files/folders, display size in human-readable format which is then sorted -* `./script.sh | tee output.log` the `tee` command displays standard output on terminal as well as writes to file - -**Combining output of several commands** - -* `(head -5 ~/.vimrc ; tail -5 ~/.vimrc) > vimrc_snippet.txt` multiple commands can be grouped in `()` and redirected as if single command output - * commands grouped in `()` gets executed in a subshell environment -* `{ head -5 ~/.vimrc ; tail -5 ~/.vimrc ; } > vimrc_snippet.txt` gets executed in current shell context -* [Command grouping](http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping) - -**Command substitution** - -* `sed -i "s|^|$(basename $PWD)/|" dir_list.txt` add current directory path and forward-slash character at the start of every line - * Note the use of double quotes to perform command substitution -* `file_count=$(ls -q | wc -l)` save command output to a variable -* [Command Substitution](http://mywiki.wooledge.org/CommandSubstitution) - -**Process Substitution** - -* `comm -23 <(sort file1.txt) <(sort file2.txt)` allows to create named pipes, effectively avoiding need to create temporary files -* [Process Substitution](http://wiki.bash-hackers.org/syntax/expansion/proc_subst) -* [input and output process substitution examples](https://unix.stackexchange.com/questions/17107/process-substitution-and-pipe) - -**Redirecting error** - -* `xyz 2> cmderror.log` assuming a non-existent command `xyz`, it would give an error and gets redirected to specified file -* `./script.sh 2> /dev/null` discard error messages - -**Combining stdout and stderr** - -Assume that the file 'report.log' exists containing the text 'test' and non-existing file 'xyz.txt' - -Bash version 4+: - -* `grep 'test' report.log xyz.txt &> cmb_out.txt` redirect both stdout and stderr to a file -* `grep 'test' report.log xyz.txt &>> cmb_out.txt` append both stdout and stderr to a file -* `ls report.log xyz.txt |& grep '[st]'` redirect both stdout and stderr as stdin - -Earlier versions: - -* `grep 'test' report.log xyz.txt > cmb_out.txt 2>&1` redirect both stdout and stderr to a file -* `grep 'test' report.log xyz.txt 2> cmb_out.txt 1>&2` redirect both stdout and stderr to a file -* `grep 'test' report.log xyz.txt >> cmb_out.txt 2>&1` append both stdout and stderr to a file -* `ls report.log xyz.txt 2>&1 | grep '[st]'` redirect both stdout and stderr as stdin - -**Redirecting input** - -* `tr a-z A-Z < test_list.txt` convert lowercase to uppercase, `tr` command only reads from stdin and doesn't have the ability to read from a file directly -* `wc -l < report.log` useful to avoid filename in `wc` output -* `< report.log grep 'test'` useful to easily modify previous command for different command options, search patterns, etc -* `grep 'test' report.log | diff - test_list.txt` output of `grep` as one of the input file for `diff` command -* [difference between << , <<< and < <](https://askubuntu.com/questions/678915/whats-the-difference-between-and-in-bash) - -**Using xargs to redirect output of command as input to another command** - -* `grep -rlZ 'pattern' | xargs -0 sed -i 's/pattern/replace/'` search and replace only those files matching the required pattern (Note: search pattern could be different for `grep` and `sed` as per requirement) - * the `-Z` option would print filename separated by **ASCII NUL character** which is in turn understood by `xargs` via the `-0` option. This ensures the command won't break on filenames containing characters like spaces, newlines, etc -* [When to use xargs](https://unix.stackexchange.com/questions/24954/when-is-xargs-needed) - * has a good example for [parallel processing jobs with xargs](https://unix.stackexchange.com/questions/24954/when-is-xargs-needed/24979#24979) - -**Further Reading** - -* See topic 'REDIRECTION' in `info bash` -* [stdin, stdout and stderr](https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr) -* [Illustrated Redirection Tutorial](http://wiki.bash-hackers.org/howto/redirection_tutorial) -* [short introduction](http://mywiki.wooledge.org/BashGuide/InputAndOutput#Redirection) -* [redirect a stream to another file descriptor using >&](https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean) -* [difference between 2>&1 >foo and >foo 2>&1](http://mywiki.wooledge.org/BashFAQ/055) -* [redirect and append both stdout and stderr to a file](https://stackoverflow.com/questions/876239/how-can-i-redirect-and-append-both-stdout-and-stderr-to-a-file-with-bash) -* [Redirections explained](http://www.catonmat.net/blog/bash-one-liners-explained-part-three/) - -
- -### Process Control - -* `Process` is any running program - * Program is a set of instructions written to perform a task -* `Daemon` to simply put, are background processes -* `Job` in Shell parlance is a process that is not a daemon, i.e an interactive program with user control - -**ps** - ->report a snapshot of the current processes - -* First column indicates the process id (PID) -* `-e` select all processes -* `-f` full-format listing -* [ps Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/ps?sort=votes&pageSize=15) -* [ps Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/ps?sort=votes&pageSize=15) -* [ps tutorial](https://linuxjourney.com/lesson/monitor-processes-ps-command) - -**kill** - ->send a signal to a process - -* `kill -l` list signal names -* `kill PID` send default 'SIGTERM' signal to a process (specified by the PID) asking the process to terminate -* [gracefully shutdown processes](https://stackoverflow.com/questions/690415/in-what-order-should-i-send-signals-to-gracefully-shutdown-processes/690631#690631) -* [why kill -9 should be avoided](https://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) -* [kill Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/kill?sort=votes&pageSize=15) -* [kill Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/kill?sort=votes&pageSize=15) -* See also `pkill` and `killall` commands - -**top** - ->display Linux processes - -* Press `M` (uppercase) to sort the processes by memory usage -* Press `q` to quit the command -* Press `W` (uppercase) to write your favorite view of top command to `~/.toprc` file and quit immediately, so that next time you use top command, it will display in the format you like -* [htop](https://www.reddit.com/r/linux/comments/3ih6n9/why_do_people_seem_to_prefer_htop_over_top/) is better/prettier alternative to top - * install instructions [here](http://ccm.net/faq/41400-linux-how-to-install-htop) -* [top Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/top?sort=votes&pageSize=15) - -**free** - ->Display amount of free and used memory in the system - -* `free -h` shows amount of free and used memory in human readable format - -**pgrep** - ->look up or signal processes based on name and other attributes - -* `pgrep -l foobar` search for process names containing foobar, displays PID and full process name -* `pgrep -x gvim` search for processes exactly named gvim -* `pgrep -c chrom` total number of processes matching chrom -* `pgrep -nl chrom` most recently started process matching chrom - -
- -**Further Reading** - -* [Process Management](http://ryanstutorials.net/linuxtutorial/processes.php) -* [Managing Linux Processes](https://www.digitalocean.com/community/tutorials/how-to-use-ps-kill-and-nice-to-manage-processes-in-linux) -* [Linux Processes](http://www.tldp.org/LDP/tlk/kernel/processes.html) -* [what is daemon](http://en.wikipedia.org/wiki/Daemon_(computing)) -* [Job Control commands](http://linuxcommand.org/lc3_lts0100.php) -* [Useful examples for top command](http://www.thegeekstuff.com/2010/01/15-practical-unix-linux-top-command-examples/#more-2515) - -
- -### Running jobs in background - -Often commands and scripts can take more than few minutes to complete, but user might still need to continue using the shell. Opening a new shell might not serve the purpose if local shell variable settings are needed too. Shell provides the `&` operator to push the commad (or script) execution to background and return the command prompt to the user. However, the standard outputs and errors would still get displayed on the terminal unless appropriately redirected - -* `tkdiff result_v1.log result_v2.log &` tkdiff, if installed, shows differences between two files in a GUI. If `&` is not used, the program would hog the command prompt - -**Pushing current job to background** - -What if you forgot to add `&` and using `kill` on the process might corrupt lot of things? - -* `Ctrl+z` suspends the current running job -* `bg` push the recently suspended job to background -* Continue using shell -* `fg` bring the recently pushed background job to foreground -* `jobs` built-in command - Display status of jobs -* `nohup` command - run a command immune to hangups, with output to a non-tty -* [job control](https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes) diff --git a/Shell_Customization.md b/Shell_Customization.md deleted file mode 100644 index d6ddf4a..0000000 --- a/Shell_Customization.md +++ /dev/null @@ -1,193 +0,0 @@ -# Shell Customization - -* [Variables](#variables) -* [Config files](#config-files) -* [Emac mode Readline shortcuts](#emac-mode-readline-shortcuts) - -
- -### Variables - -Quoting from [article on BASH Environment & Shell Variables](http://www.tricksofthetrades.net/2015/06/14/notes-bash-env-variables/) - ->Variables provide a simple way to share configuration settings between multiple applications and processes in Linux, and are mainly set in either a terminal or shell configuration file upon start up. - ->They are either environmental or shell variables by convention. Both of which are usually defined using all capital letters. This helps users distinguish environmental variables from within other contexts. - ->“Environment variables” have been defined for use in the current shell and will be inherited by any child shells or processes spawned as a result of the parent. Environmental variables can also be used to pass information into processes that are spawned by the shell - ->“Shell variables” are contained exclusively within the shell in which they were set or defined. They are mostly used to keep track of ephemeral temporal data, like the current working directory in a session - -Some example Variables: - -* `HOME` The home directory of the current user; the default argument for the `cd` builtin command. The value of this variable is also used when performing tilde expansion -* `SHELL` The full pathname to the shell is kept in this environment variable. If it is not set when the shell starts, bash assigns to it the full pathname of the current user's login shell -* `PATH` The search path for commands. It is a colon-separated list of directories in which the shell looks for commands. A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin` -* `PWD` and `OLDPWD` full path of current working directory and previous working directory -* `HISTFILESIZE,HISTSIZE,HISTCONTROL,HISTFILE` command history related variables -* `PS1` The value of this parameter is expanded and used as the primary prompt string. The default value is `\s-\v\$ ` -* `printenv` command to display names and values of Environment variables -* `set` builtin command to display the names and values of all the variables when used without options/arguments -* `echo "$HOME"` use `$` when Variable value is needed - -**User defined variables** - -User can define variables as well - for temporary use, in shell script, etc. -Using lowercase is preferred to avoid potential conflict with shell or environment variables - -```bash -$ #array of 8-bit binary numbers in ascending order -$ dec2bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) -$ echo "${dec2bin[2]}" -00000010 -$ echo "${dec2bin[120]}" -01111000 -$ echo "${dec2bin[255]}" -11111111 -``` - -**Further Reading** - -* Section 'Shell Variables' in `info bash` -* [Difference between shell and environment variables](https://stackoverflow.com/questions/3341372/differnce-between-the-shell-and-environment-variable-in-bash) -* [Variable behavior varies with different type of shells](http://sc.tamu.edu/help/general/unix/vars.html) -* [How to correctly modify PATH variable](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path) -* [Read more on the dec2bin brace expansion example](https://twitter.com/climagic/status/593842202314420224) -* [Parameter expansion](http://wiki.bash-hackers.org/syntax/pe#simple_usage) - from simple ways to get Variable values to complicated manipulations - -
- -### Config files - -Through use of aliases, functions, shell variables, etc one can customize the shell as per their needs - -From 'FILES' section in `info bash` - -* `/etc/profile` The systemwide initialization file, executed for login shells -* `/etc/bash.bashrc` The systemwide per-interactive-shell startup file -* `/etc/bash.bash.logout` The systemwide login shell cleanup file, executed when a login shell exits -* `~/.bash_profile` The personal initialization file, executed for login shells -* `~/.bashrc` The individual per-interactive-shell startup file -* `~/.bash_logout` The individual login shell cleanup file, executed when a login shell exits -* `~/.inputrc` Individual readline initialization file - -**~/.bashrc** - -From 'INVOCATION' section in `info bash` - ->When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc. - -* `shopt` Set and unset shell options - * `shopt -s autocd` change directory by typing just the name, without having to explicity type the `cd` command (`-s` sets/enables this option) - * `shopt -u autocd` unset/disable autocd option - * `shopt -s dotglob` include files starting with `.` also for wildcard expansion - * [shopt builtin command](http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) -* `set` Set or unset values of shell options and positional parameters - * `set -o emacs` Use emacs-style line editing interface - * `set -o vi` Use vi-style line editing interface - * `set -o history` enable command history - * `set +o history` disable command history, useful to temporarily disable logging command history for current session until it is re-enabled - * `set -o` see current status of various options - are they on/off - * [set builtin command](http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html#The-Set-Builtin) -* aliases - * aliases and functions are generally used to construct new commands or invoke commands with preferred options - * `source ~/.bash_aliases` to avoid cluttering the bashrc file, it is recommended to put them in a separate file and use `source` command to add to bashrc -* history - * By default, history commands are stored in ~/.bash_history, can be changed using `HISTFILE` variable - * `HISTSIZE=5000` this variable affects how many commands are in history of current shell session. Use negative number for unlimited size - * `HISTFILESIZE=10000` this variable affects how many commands are stored in the history file. Use negative number for unlimited file size - * `HISTCONTROL=ignorespace:erasedups` don't save commands with leading space and erase all previous duplicates matching current command line - * `shopt -s histappend` append to history file instead of overwriting - * [using bash history efficiently](http://jorge.fbarr.net/2011/03/24/making-your-bash-history-more-efficient/) - * [common history across sessions](https://unix.stackexchange.com/questions/18212/bash-history-ignoredups-and-erasedups-setting-conflict-with-common-history) -* Setting prompt using the `PS1` variable - * `PS1="$ "` simple prompt '$ ' - * `PS1="\s-\v\$ "` default prompt, adds bash version number, for ex: 'bash-4.3$ ' - * `PS1="\u@\h\\$ \[$(tput sgr0)\]"` is way of saying to set the prompt as 'username@hostname$ ' - * [easy way to generate PS1](http://bashrcgenerator.com/) - above example was generated using this site, has options to add color as well -* [What does the ~/.bashrc file do?](http://askubuntu.com/questions/540683/what-is-a-bashrc-file-and-what-does-it-do) -* Distros like Ubuntu come with `~/.bashrc` already created with useful configurations like `bash_completion` -* [sample bashrc](https://github.com/learnbyexample/scripting_course/blob/master/.bashrc) - -**~/.inputrc** - -Key bindings for command line (readline) are customized in this file. By default, emacs-style is on and can be changed using the `set` command as discussed in previous section -Some of the default key bindings are discussed later in this chapter - -* `"\e[A": history-search-backward` up arrow to match history starting with partly typed text -* `"\e[B": history-search-forward` down arrow to search in forward direction -* `"\C-d": unix-filename-rubout` Ctrl+d to delete from cursor backwards to filename boundary -* `set echo-control-characters off` turn off control characters like `^C` (Ctrl+C) from showing on screen -* `set completion-ignore-case on` ignore case for Tab completion -* `set show-all-if-ambiguous on` combines single and double Tab presses behavior into single Tab press -* [Simpler introduction to Readline](https://wiki.archlinux.org/index.php/readline) -* [discussion on GNU Readline library](https://cnswww.cns.cwru.edu/php/chet/readline/readline.html) library allows user to interact/edit command line -* [sample inputrc](https://github.com/learnbyexample/scripting_course/blob/master/.inputrc) - -**~/.bash_aliases** - -Before creating an alias or function, use `type alias_name` to check if an existing command or alias exists with that name - -* `alias` used without argument shows all aliases currently set, sorted in alphabetical order -* `alias c='clear'` alias `clear` command to just the single letter `c` - * Note that there should be no white-space around = operator -* `alias b1='cd ../'` alias b1 to go back one hierarchy above -* `alias app='cd /home/xyz/Android/xyz/app/src/main/java/com/xyz/xyzapp/'` alias frequently used long paths. Particularly useful when working on multiple projects spanning multiple years - * and if aliases are forgotten over the years, they can recalled by opening ~/.bash_aliases file or using `alias` command -* `alias oa='gvim ~/.bash_aliases'` open aliases file with your favorite editor -* `alias sa='source ~/.bash_aliases'` useful to apply changes to current session -* `alias ls='ls --color=auto'` colorize output to distinguish file types -* `alias l='ls -ltrh'` map favorite options, plus color output as previously set alias will be substituted for `ls` -* `alias grep='grep --color=auto'` colorize file names, line numbers, matched pattern, etc -* `alias s='du -sh * | sort -h'` sort files/directories by size and display in human-readable format -* `\ls` override alias and use original command by using the `\` prefix -* `ch() { man $1 | sed -n "/^\s*$2/,/^$/p" ; }` simple command help (ch) function to get information on a command option - * for example: `ch ls -F` , `ch grep -o` , etc - * `ch() { whatis $1; man $1 | sed -n "/^\s*$2/,/^$/p" ; }` also prints description of command - * [ch](https://github.com/learnbyexample/command_help) does a much better job with capability to handle multiple options, multiple arguments, builtin commands, etc - * [explainshell](http://explainshell.com/) does even better -* `o() { gnome-open "$@" &> /dev/null ; }` open files with their default applications, discards output and error messages - * for example: `o bashguide.pdf` - * `$1` first positional argument - * `$2` second positional argument - * `$@` all the arguments -* [sample bash_aliases](https://github.com/learnbyexample/scripting_course/blob/master/.bash_aliases) - -**Further Reading** - -* [Sensible bash customizations](http://mrzool.cc/writing/sensible-bash/) -* [shell config files](http://blog.sanctum.geek.nz/shell-config-subfiles/) -* [command line navigation](http://cupfullofcode.com/blog/2013/07/03/efficient-command-line-navigation/index.html) -* [difference between bashrc and bash_profile](http://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile/183980#183980) -* [when to use alias, functions and scripts](https://unix.stackexchange.com/questions/30925/in-bash-when-to-alias-when-to-script-and-when-to-write-a-function/30964#30964) -* [what does rc in bashrc stand for](https://unix.stackexchange.com/questions/3467/what-does-rc-in-bashrc-stand-for) - -
- -### Emac mode Readline shortcuts - -* `Ctrl+c` sends SIGINT signal, requesting the current running process to terminate - * [how Ctrl+c works](https://stackoverflow.com/questions/6108953/how-does-ctrl-c-terminate-a-child-process) -* `Ctrl+c` can also be used to abort the currently typed command and give fresh command prompt -* `Ctrl+z` suspends the current running process -* `Tab` the tab key completes the command (even aliases) or filename if it is unique, double Tab gives list of possible matches if it is not unique - * `set show-all-if-ambiguous on` combines single and double Tab presses behavior into single Tab press -* `Ctrl+r` Search command history. After pressing this key sequence, type characters you wish to match from history, then press `Esc` key to return to command prompt or press `Enter` to execute the command -* `Esc+b` move cursor backward by one word -* `Esc+f` move cursor forward by one word -* `Esc+Backspace` delete backwards upto word boundary -* `Ctrl+a` or `Home` move cursor to beginning to prompt -* `Ctrl+e` or `End` move cursor to end of command line -* `Ctrl+l` preserve whatever is typed in command prompt and clear the terminal screen -* `Ctrl+u` delete from beginning of command line upto cursor -* `Ctrl+k` delete from cursor to end of command line -* `Ctrl+t` swap the previous two characters around - * For example: if you typed sp instead of ps, press Ctrl+t when the cursor is to right of sp and it will change to ps -* `Esc+t` swap the previous two words around -* `!$` last used argument - * for example: if `cat temp.txt` was the last command used, `rm !$` will delete temp.txt file - * `Esc+.` will insert the last used argument, useful when you need to modify before execution. Also multiple presses allows to traverse through second last command and so on -* `Mouse scroll button click` highlight text you want to copy and then press scroll button of mouse in destination to paste the text - * to disable pasting text on `Mouse scroll button click` , use the `xinput` command and get the number corresponding to your mouse.. say it is `11` - * `xinput set-button-map 11 1 0 3` to disable - * `xinput set-button-map 11 1 2 3` to enable back diff --git a/Shell_Scripting.md b/Shell_Scripting.md deleted file mode 100644 index 4a0b915..0000000 --- a/Shell_Scripting.md +++ /dev/null @@ -1,665 +0,0 @@ -# Shell Scripting - -* [Need for scripting](#need-for-scripting) -* [Hello script](#hello-script) -* [Sourcing script](#sourcing-script) -* [Command Line Arguments](#command-line-arguments) -* [Variables and Comparisons](#variables-and-comparisons) -* [Accepting User Input interactively](#accepting-user-input-interactively) -* [if then else](#if-then-else) -* [for loop](#for-loop) -* [while loop](#while-loop) -* [Reading a file](#reading-file) -* [Debugging](#debugging) -* [Real world use case](#real-world-use-case) -* [Resource lists](#resource-lists) - -
- -### Need for scripting - -* Automate repetitive manual tasks -* Create specialized and custom commands -* [Difference between scripting and programming languages](https://stackoverflow.com/questions/17253545/scripting-language-vs-programming-language) - -Note: - -* `.sh` is typically used as extension for shell scripts -* Material presented here is for `GNU bash, version 4.3.11(1)-release` - -
- -### Hello script - -```bash -#!/bin/bash - -# Print greeting message -echo "Hello $USER" -# Print day of week -echo "Today is $(date -u +%A)" - -# use single quotes for literal strings -echo 'Have a nice day' -``` - -The first line has two parts - -* `/bin/bash` is path of `bash` - * `type bash` to get path -* `#!` called as [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)), directs the program loader to use the interpreter path provided - -Comments - -* Comments start with `#` -* Comments can be placed at end of line of code as well - * `echo 'Hello' # end of code comment` -* [Multiline comments](https://unix.stackexchange.com/questions/37411/multiline-shell-script-comments-how-does-this-work) - -Single quotes vs Double quotes - -* Single quotes preserves the literal value of each character within the quotes -* Double quotes preserves the literal value of all characters within the quotes, with the exception of '$', '`', '\', and, when history expansion is enabled, '!' -* [Difference between single and double quotes](https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash) - -`echo` builtin command - -* `help -d echo` Write arguments to the standard output -* By default, `echo` adds a newline and doesn't interpret backslash -* `-n` do not append a newline -* `-e` enable interpretation of the following backslash escapes -* `-E` explicitly suppress interpretation of backslash escapes -* [echo Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/echo?sort=votes&pageSize=15) - -```bash -$ chmod +x hello_script.sh -$ ./hello_world.sh -Hello learnbyexample -Today is Wednesday -Have a nice day -``` - -
- -### Sourcing script - -```bash -$ help -d source -source - Execute commands from a file in the current shell. -``` - -* If script should be executed in current shell environment instead of sub-shell, use the `.` or `source` command - * For example, after editing `~/.bashrc` one can use `source ~/.bashrc` for changes to be immeditely effective - -```bash -$ # contents of prev_cmd.sh -prev=$(fc -ln -2 | sed 's/^[ \t]*//;q') -echo "$prev" -``` - -* For example, to access history of current interactive shell from within script - -```bash -$ printf 'hi there\n' -hi there -$ bash prev_cmd.sh - -$ printf 'hi there\n' -hi there -$ source prev_cmd.sh -printf 'hi there\n' -``` - -
- -### Command Line Arguments - -```bash -#!/bin/bash - -# Print line count of files given as command line argument -echo "No of lines in '$1' is $(wc -l < "$1")" -echo "No of lines in '$2' is $(wc -l < "$2")" -``` - -* Command line arguments are saved in positional variables starting with `$1 $2 $3` etc -* If a particular argument requires multiple word string, enclose them in quotes or use appropriate escape sequences -* `$0` contains the name of the script itself - useful to code different behavior based on name of script used -* `$@` array of all the command line arguments passed to script -* `$#` Number of command line arguments passed to script -* Use double quotes around variables when passing its value to another command - * [why does my shell script choke on whitespace or other special characters?](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters) -* [bash special parameters reference](https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables/5163260#5163260) - -```bash -$ ./command_line_arguments.sh hello_script.sh test\ file.txt -No of lines in 'hello_script.sh' is 9 -No of lines in 'test file.txt' is 5 -``` - -
- -### Variables and Comparisons - -* `dir_path=/home/guest` space has special meaning in bash, cannot be used around = in variables -* `greeting='hello world'` use single quotes for literal strings -* `user_greeting="hello $USER"` use double quotes for substitutions -* `echo $user_greeting` use `$` when variable's value is needed -* `no_of_lines=$(wc -l < "$filename")` use double quotes around variables when passing its value to another command -* `num=534` numbers can also be declared -* `(( num = 534 ))` but using `(( ))` for numbers makes life much easier -* `(( num1 > num2 ))` number comparisons are also more readable within `(( ))` -* `[[ -e story.txt ]]` test if the file/directory exists -* `[[ $str1 == $str2 ]]` for string comparisons - -**Further Reading** - -* [bash arithmetic expressions](http://mywiki.wooledge.org/ArithmeticExpression) -* [how can I add numbers in a bash script?](https://stackoverflow.com/questions/6348902/how-can-i-add-numbers-in-a-bash-script) -* [difference between test, \[ and \[\[](http://mywiki.wooledge.org/BashFAQ/031) -* [Tests and Conditionals](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals) -* [How to use double or single bracket, parentheses, curly braces?](https://stackoverflow.com/questions/2188199/how-to-use-double-or-single-bracket-parentheses-curly-braces) -* [Variable quoting and using braces for variable substitution](https://unix.stackexchange.com/questions/4899/var-vs-var-and-to-quote-or-not-to-quote) -* [Parameters](http://mywiki.wooledge.org/BashGuide/Parameters) -* [Parameter expansion](http://mywiki.wooledge.org/BashFAQ/073) - substitute a variable or special parameter for its value - -
- -### Accepting User Input interactively - -```bash -#!/bin/bash - -# Get user input -echo 'Hi there! This script returns the sum of two numbers' -read -p 'Enter two numbers separated by spaces: ' number1 number2 - -echo -e "\n$number1 + $number2 = $((number1 + number2))" -echo 'Thank you for using the script, Have a nice day :)' -``` - -* `help -d read` Read a line from the standard input and split it into fields -* `-a` array assign the words read to sequential indices of the array variable ARRAY, starting at zero -* `-p` prompt output the string PROMPT without a trailing newline before attempting to read -* `-s` do not echo input coming from a terminal -* [More examples with read and getting input from stdin](http://ryanstutorials.net/bash-scripting-tutorial/bash-input.php) - -```bash -$ ./user_input.sh -Hi there! This script returns the sum of two numbers -Enter two numbers separated by spaces: 7 42 - -7 + 42 = 49 -Thank you for using the script, Have a nice day :) -``` - -
- -### if then else - -```bash -#!/bin/bash - -if (( $# != 2 )) -then - echo "Error!! Please provide two file names" - # simple convention for exit values is '0' for success and '1' for error - exit 1 -else - # Use ; to combine multiple commands in same line - # -f option checks if file exists, ! negates the value - # white-space around [[ and ]] is necessary - if [[ ! -f $1 ]] ; then - echo "Error!! '$1' is not a valid filename" ; exit 1 - else - echo "No of lines in '$1' is $(wc -l < "$1")" - fi - - # Conditional Execution - [[ ! -f $2 ]] && echo "Error!! '$2' is not a valid filename" && exit 1 - echo "No of lines in '$2' is $(wc -l < "$2")" -fi -``` - -* When handling user provided arguments, it is always advisable to check the sanity of arguments. A simple check can reduce hours of frustrating debug when things go wrong -* The code inside `if [[ ! -f $1 ]] ; then` block is only intended for demonstration, we could as well have used error handling of `wc` command if file doesn't exist -* Default `exit` value is `0` , so need not be explicitly written for successful script completion -* Use `elif` if you need to test more conditions after `if` -* The operator `&&` is used to execute a command only when the preceding one successfully finishes -* To redirect error message to stderr, use `echo "Error!! Please provide two file names" 1>&2` and so on -* [Control Operators && and ||](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators_.28.26.26_and_.7C.7C.29) -* [More examples for if conditional block](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29) - -```bash -$ ./if_then_else.sh -Error!! Please provide two file names -$ echo $? -1 - -$ ./if_then_else.sh hello_script.sh -Error!! Please provide two file names -$ echo $? -1 - -$ ./if_then_else.sh hello_script.sh xyz.tzt -No of lines in 'hello_script.sh' is 9 -Error!! 'xyz.tzt' is not a valid filename -$ echo $? -1 - -$ ./if_then_else.sh hello_script.sh 'test file.txt' -No of lines in 'hello_script.sh' is 9 -No of lines in 'test file.txt' is 5 -$ echo $? -0 -``` - -**Combining if with exit status of command executed** - -Sometimes one needs to know if intended command operation was successful or not and then take action depending on outcome. Exit status of `0` is considered as successful condition when used with `if` statement. When avaiable, use appropriate options to suppress stdout/stderr of command being used, otherwise redirection might be needed to avoid cluttering output on terminal - -```bash -$ grep 'echo' hello_script.sh -echo "Hello $USER" -echo "Today is $(date -u +%A)" -echo 'Have a nice day' - -$ # do not write anything to standard output -$ grep -q 'echo' hello_script.sh -$ echo $? -0 - -$ grep -q 'echo' xyz.txt -grep: xyz.txt: No such file or directory -$ echo $? -2 -$ # Suppress error messages about nonexistent or unreadable files -$ grep -qs 'echo' xyz.txt -$ echo $? -2 -``` - -Example - -```bash -#!/bin/bash - -if grep -q 'echo' hello_script.sh ; then - # do something - echo "string found" -else - # do something else - echo "string not found" -fi -``` - -
- -### for loop - -```bash -#!/bin/bash - -# Ensure atleast one argument is provided -(( $# == 0 )) && echo "Error!! Please provide atleast one file name" && exit 1 - -file_count=0 -total_lines=0 - -# every iteration, variable file gets next positional argument -for file in "$@" -do - # Let wc show its error message if file doesn't exist - # terminate the script if wc command exit status is not 0 - no_of_lines=$(wc -l < "$file") || exit 1 - echo "No of lines in '$file' is $no_of_lines" - ((file_count++)) - ((total_lines = total_lines + no_of_lines)) -done - -echo -e "\nTotal Number of files = $file_count" -echo "Total Number of lines = $total_lines" -``` - -* This form of `for` loop is useful if we need only element of an array, without having to iterate over length of an array and using an index for each iteration to get array elements -* In this example we use the control operator `||` to stop the script if `wc` fails i.e 'exit status' other than `0` - -```bash -$ ./for_loop.sh -Error!! Please provide atleast one file name -$ echo $? -1 - -$ ./for_loop.sh hello_script.sh if_then_else.sh command_line_arguments.sh -No of lines in 'hello_script.sh' is 9 -No of lines in 'if_then_else.sh' is 21 -No of lines in 'command_line_arguments.sh' is 5 - -Total Number of files = 3 -Total Number of lines = 35 -$ echo $? -0 - -$ ./for_loop.sh hello_script.sh xyz.tzt -No of lines in 'hello_script.sh' is 9 -./for_loop.sh: line 14: xyz.tzt: No such file or directory -$ echo $? -1 -``` - -**Index based for loop** - -```bash -#!/bin/bash - -# Print 0 to 4 -for ((i = 0; i < 5; i++)) -do - echo $i -done -``` - -**Iterating over used defined array** - -```bash -$ files=('report.log' 'pass_list.txt') -$ for f in "${files[@]}"; do echo "$f"; done -report.log -pass_list.txt -``` - -**Files specified by glob pattern** - -A common mistake is to use output of `ls` command which is error prone and needless. Instead, the arguments can be directly used. - -```bash -$ ls -pass_list.txt power.log report.txt - -$ for f in power.log *.txt; do echo "$f"; done -power.log -pass_list.txt -report.txt -``` - -* [more examples and use of continue/break](http://ryanstutorials.net/bash-scripting-tutorial/bash-loops.php) - -
- -### while loop - -```bash -#!/bin/bash - -# Print 5 to 1 -(( i = 5 )) -while (( i != 0 )) -do - echo $i - ((i--)) -done -``` - -* Use `while` when you need to execute commands according to a specified condition - -```bash -$ ./while_loop.sh -5 -4 -3 -2 -1 -``` - -
- -### Reading a file - -Reading line by line - -```bash -#!/bin/bash - -while IFS= read -r line; do - # do something with each line - echo "$line" -done < 'files.txt' -``` - -* `IFS` is used to specify field separator which is by default whitespace. `IFS=` will clear the default value and prevent stripping of leading and trailing whitespace of lines -* The `-r` option for `read` will prevent interpreting `\` escapes -* Last line from input won't be read if not properly terminated by newline character - -```bash -$ cat files.txt -hello_script.sh -if_then_else.sh -$ ./while_read_file.sh -hello_script.sh -if_then_else.sh -``` - -Reading line as different fields - -* By default, whitespace is delimiter -* Specify a different one by setting `IFS` - -```bash -$ cat read_file_field.sh -#!/bin/bash - -while IFS=: read -r genre name; do - echo -e "$genre\t:: $name" -done < 'books.txt' -$ cat books.txt -fantasy:Harry Potter -sci-fi:The Martian -mystery:Sherlock Holmes - -$ ./read_file_field.sh -fantasy :: Harry Potter -sci-fi :: The Martian -mystery :: Sherlock Holmes -``` - -Reading 'n' characters at a time - -```bash -$ while read -n1 char; do echo "Character read is: $char"; done <<< "\word" -Character read is: w -Character read is: o -Character read is: r -Character read is: d -Character read is: - -$ # if ending newline character is not desirable -$ while read -n1 char; do echo "Character read is: $char"; done < <(echo -n "hi") -Character read is: h -Character read is: i - -$ while read -r -n2 chars; do echo "Characters read: $chars"; done <<< "\word" -Characters read: \w -Characters read: or -Characters read: d -``` - -
- -### Debugging - -* `-x` Print commands and their arguments as they are executed -* `-v` verbose option, print shell input lines as they are read -* `set -xv` use this command to enable debugging from within script itself - -```bash -$ bash -x hello_script.sh -+ echo 'Hello learnbyexample' -Hello learnbyexample -++ date -u +%A -+ echo 'Today is Friday' -Today is Friday -+ echo 'Have a nice day' -Have a nice day -``` - -```bash -$ bash -xv hello_script.sh -#!/bin/bash - -# Print greeting message -echo "Hello $USER" -+ echo 'Hello learnbyexample' -Hello learnbyexample -# Print day of week -echo "Today is $(date -u +%A)" -date -u +%A -++ date -u +%A -+ echo 'Today is Friday' -Today is Friday - -# use single quotes for literal strings -echo 'Have a nice day' -+ echo 'Have a nice day' -Have a nice day -``` - -
- -### Real world use case - -With so much copy-paste of commands and their output involved in creating these chapters, mistakes do happen. So a script to check correctness comes in handy. Consider the below markdown file - - ## Some heading - - Some explanation - - ```bash - $ seq 3 - 1 - 2 - 3 - - $ printf 'hi there!\n' - hi there! - ``` - - ## Another heading - - More explanations - - ```bash - $ help -d readarray - readarray - Read lines from a file into an array variable. - - $ a=5 - $ printf "$a\n" - 5 - ``` - -* The whole file is read into an array so that index of next line to be read can be controlled dynamically -* Once a command is identified to be tested - * the expected output is collected into a variable. Multiple lines are concatenated. Some commands do not have stdout to compare against - * accordingly the index of next iteration is corrected -* Note that this is a sample script to demonstrate use of shell script. It is not fool-proof, doesn't have proactive check for possible errors, etc -* Be sure `eval` is being used for known commands like is the case here -* See [Parameter Expansion](http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion) for examples and explanations on string processing constructs - -```bash -#!/bin/bash - -cb_start=0 -readarray -t lines < 'sample.md' - -for ((i = 0; i < ${#lines[@]}; i++)); do - # mark start/end of command block - # Line starting with $ to be verified only between ```bash and ``` block end - [[ ${lines[$i]:0:7} == '```bash' ]] && ((cb_start=1)) && continue - [[ ${lines[$i]:0:3} == '```' ]] && ((cb_start=0)) && continue - - if [[ $cb_start == 1 && ${lines[$i]:0:2} == '$ ' ]]; then - cmd="${lines[$i]:2}" - - # collect command output lines until line starting with $ or ``` block end - cmp_str='' - j=1 - while [[ ${lines[$i+$j]:0:2} != '$ ' && ${lines[$i+$j]:0:3} != '```' ]]; do - cmp_str+="${lines[$i+$j]}" - ((j++)) - done - ((i+=j-1)) - - cmd_op=$(eval "$cmd") - if [[ "${cmd_op//$'\n'}" == "${cmp_str//$'\n'}" ]]; then - echo "Pass: $cmd" - else - echo "Fail: $cmd" - fi - fi -done -``` - -* Note how sourcing the script is helpful to take into consideration commands dependent on previous commands - -```bash -$ ./verify_cmds.sh -Pass: seq 3 -Pass: printf 'hi there!\n' -Pass: help -d readarray -Pass: a=5 -Fail: printf "$a\n" - -$ source verify_cmds.sh -Pass: seq 3 -Pass: printf 'hi there!\n' -Pass: help -d readarray -Pass: a=5 -Pass: printf "$a\n" -``` - -
- -### Resource lists - -The material in this chapter is only a basic introduction - -**Shell Scripting** - -* [Bash Guide](http://mywiki.wooledge.org/BashGuide) - for everything related to bash and bash scripting, also has a downloadable pdf -* [ryanstutorial](http://ryanstutorials.net/bash-scripting-tutorial/) - good introductory tutorial -* [bash handbook](https://github.com/denysdovhan/bash-handbook) -* [writing shell scripts](http://linuxcommand.org/lc3_writing_shell_scripts.php) -* [snipcademy - shell scripting](http://code.snipcademy.com/tutorials/shell-scripting) -* [wikibooks - bash shell scripting](https://en.wikibooks.org/wiki/Bash_Shell_Scripting) -* [linuxconfig - Bash scripting tutorial](http://linuxconfig.org/bash-scripting-tutorial) -* [learnshell](http://www.learnshell.org/) - -**Specific topics** - -* [using source command to execute bash script](https://askubuntu.com/questions/661577/difference-between-and-for-running-a-script-application) -* [functions](http://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php) -* Reading file(s) - * [Reading file](http://mywiki.wooledge.org/BashFAQ/001) - * [Loop through the lines of two files in parallel](https://unix.stackexchange.com/questions/82541/loop-through-the-lines-of-two-files-in-parallel) -* [arrays](http://mywiki.wooledge.org/BashGuide/Arrays) -* [nameref](https://unix.stackexchange.com/questions/288886/bash-array-values-like-variables-inside-loop/288894#288894) - * also see this [FAQ](http://mywiki.wooledge.org/BashFAQ/006) -* getopts - * [getopts tutorial](http://wiki.bash-hackers.org/howto/getopts_tutorial) - * [wooledge - handle command-line arguments](http://mywiki.wooledge.org/BashFAQ/035) - * [stackoverflow - getopts example](https://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash) - -**Handy tools, tips and reference** - -* [shellcheck](http://www.shellcheck.net/) - online static analysis tool that gives warnings and suggestions for scripts - * See [github](https://github.com/koalaman/shellcheck) link for more info and install instructions -* [Common bash scripting issues faced by beginners](http://wiki.bash-hackers.org/scripting/newbie_traps) -* [bash FAQ](http://mywiki.wooledge.org/BashFAQ) -* [bash best Practices](http://mywiki.wooledge.org/BashGuide/Practices) -* [bash pitfalls](http://mywiki.wooledge.org/BashPitfalls) -* [Google shell style guide](https://google.github.io/styleguide/shell.xml) -* [better bash scripting](http://robertmuth.blogspot.in/2012/08/better-bash-scripting-in-15-minutes.html) -* [robust shell scripting](http://www.davidpashley.com/articles/writing-robust-shell-scripts/) -* [Bash Sheet](http://mywiki.wooledge.org/BashSheet) -* [bash reference](https://devmanual.gentoo.org/tools-reference/bash/index.html) - nicely formatted and explained well -* [bash special variables reference](https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables/5163260#5163260) -* [Testing exit values in bash](http://blog.sanctum.geek.nz/testing-exit-values-bash/) diff --git a/Text_Processing.md b/Text_Processing.md deleted file mode 100644 index 093a289..0000000 --- a/Text_Processing.md +++ /dev/null @@ -1,1338 +0,0 @@ -# Text Processing - -* [sort](#sort) -* [uniq](#uniq) -* [comm](#comm) -* [cmp](#cmp) -* [diff](#diff) -* [tr](#tr) -* [sed](#sed) -* [awk](#awk) -* [perl](#perl) -* [cut](#cut) -* [paste](#paste) -* [column](#column) -* [pr](#pr) - -The rich set of text processing commands is comprehensive and time saving. Knowing even their existence is enough to avoid the need of writing yet another script (which takes time and effort plus debugging) – a trap which many beginners fall into. An extensive list of text processing commands and examples can be found [here](http://tldp.org/LDP/abs/html/textproc.html) - -
- -### sort - ->sort lines of text files - -As the name implies, this command is used to sort files. How about alphabetic sort and numeric sort? Possible. How about sorting a particular column? Possible. Prioritized multiple sorting order? Possible. Randomize? Unique? Just about any sorting need is catered by this powerful command - -**Options** - -* `-R` random sort -* `-r` reverse the sort order -* `-o` redirect sorted result to specified filename, very useful to sort a file inplace -* `-n` sort numerically -* `-V` version sort, aware of numbers within text -* `-h` sort human readable numbers like 4K, 3M, etc -* `-k` sort via key -* `-u` sort uniquely -* `-b` ignore leading white-spaces of a line while sorting -* `-t` use SEP instead of non-blank to blank transition - -**Examples** - -* `sort dir_list.txt` display sorted file on standard output -* `sort -bn numbers.txt -o numbers.txt` sort numbers.txt numerically (ignoring leading white-spaces) and overwrite the file with sorted output -* `sort -R crypto_keys.txt -o crypto_keys_random.txt` sort randomly and write to new file - * `shuf crypto_keys.txt -o crypto_keys_random.txt` can also be used -* `du -sh * | sort -h` sort file/directory sizes in current directory in human readable format - -
- -```bash -$ cat ip.txt -6.2 : 897 : bar -3.1 : 32 : foo -2.3 : 012 : bar -1.2 : 123 : xyz - -$ # -k3,3 means from 3rd column onwards to 3rd column -$ # for ex: to sort from 2nd column till end, use -k2 -$ sort -t: -k3,3 ip.txt -2.3 : 012 : bar -6.2 : 897 : bar -3.1 : 32 : foo -1.2 : 123 : xyz - -$ # -n option for numeric sort, check out what happens when -n is not used -$ sort -t: -k2,2n ip.txt -2.3 : 012 : bar -3.1 : 32 : foo -1.2 : 123 : xyz -6.2 : 897 : bar - -$ # more than one rule can be specified to resolve same values -$ sort -t: -k3,3 -k1,1rn ip.txt -6.2 : 897 : bar -2.3 : 012 : bar -3.1 : 32 : foo -1.2 : 123 : xyz -``` - -**Further Reading** - -* [sort like a master](http://www.skorks.com/2010/05/sort-files-like-a-master-with-the-linux-sort-command-bash/) -* [sort Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/sort?sort=votes&pageSize=15) -* [sort on multiple columns using -k option](https://unix.stackexchange.com/questions/249452/unix-multiple-column-sort-issue) - -
- -### uniq - ->report or omit repeated lines - -This command is more specific to recognizing duplicates. Usually requires a sorted input as the comparison is made on adjacent lines only - -**Options** - -* `-d` print only duplicate lines -* `-c` prefix count to occurrences -* `-u` print only unique lines - -**Examples** - -* `sort test_list.txt | uniq` outputs lines of test_list.txt in sorted order with duplicate lines removed - * `uniq <(sort test_list.txt)` same command using process substitution - * `sort -u test_list.txt` equivalent command -* `uniq -d sorted_list.txt` print only duplicate lines -* `uniq -cd sorted_list.txt` print only duplicate lines and prefix the line with number of times it is repeated -* `uniq -u sorted_list.txt` print only unique lines, repeated lines are ignored -* [uniq Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/uniq?sort=votes&pageSize=15) - -```bash -$ echo -e 'Blue\nRed\nGreen\nBlue\nRed\nBlack\nRed' > colors.txt -$ uniq colors.txt -Blue -Red -Green -Blue -Red -Black -Red - -$ echo -e 'Blue\nRed\nGreen\nBlue\nRed\nBlack\nRed' | sort > sorted_colors.txt -$ uniq sorted_colors.txt -Black -Blue -Green -Red - -$ uniq -d sorted_colors.txt -Blue -Red - -$ uniq -cd sorted_colors.txt - 2 Blue - 3 Red - -$ uniq -u sorted_colors.txt -Black -Green -``` - -
- -### comm - ->compare two sorted files line by line - -Without any options, it prints output in three columns - lines unique to file1, line unique to file2 and lines common to both files - -**Options** - -* `-1` suppress lines unique to file1 -* `-2` suppress lines unique to file2 -* `-3` suppress lines common to both files - -**Examples** - -* `comm -23 sorted_file1.txt sorted_file2.txt` print lines unique to sorted_file1.txt - * `comm -23 <(sort file1.txt) <(sort file2.txt)'` same command using process substitution, if sorted input files are not available -* `comm -13 sorted_file1.txt sorted_file2.txt` print lines unique to sorted_file2.txt -* `comm -12 sorted_file1.txt sorted_file2.txt` print lines common to both files -* [comm Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/comm?sort=votes&pageSize=15) - -```bash -$ echo -e 'Brown\nRed\nPurple\nBlue\nTeal\nYellow' | sort > colors_1.txt -$ echo -e 'Red\nGreen\nBlue\nBlack\nWhite' | sort > colors_2.txt - -$ # the input files viewed side by side -$ paste colors_1.txt colors_2.txt -Blue Black -Brown Blue -Purple Green -Red Red -Teal White -Yellow -``` - -* examples - -```bash -$ # 3 column output - unique to file1, file2 and common -$ comm colors_1.txt colors_2.txt - Black - Blue -Brown - Green -Purple - Red -Teal - White -Yellow  - -$ # suppress 1 and 2 column, gives only common lines -$ comm -12 colors_1.txt colors_2.txt -Blue -Red - -$ # suppress 1 and 3 column, gives lines unique to file2 -$ comm -13 colors_1.txt colors_2.txt -Black -Green -White - -$ # suppress 2 and 3 column, gives lines unique to file1 -$ comm -23 colors_1.txt colors_2.txt -Brown -Purple -Teal -Yellow -``` - -
- -### cmp - ->compare two files byte by byte - -Useful to compare binary files. If the two files are same, no output is displayed (exit status 0) -If there is a difference, it prints the first difference - line number and byte location (exit status 1) -Option `-s` allows to suppress the output, useful in scripts - -```bash -$ cmp /bin/grep /bin/fgrep -/bin/grep /bin/fgrep differ: byte 25, line 1 -``` - -* More examples [here](http://www.sanfoundry.com/5-cmp-command-usage-examples-linux/) - -
- -### diff - ->compare files line by line - -Useful to compare old and new versions of text files -All the differences are printed, which might not be desirable if files are too long - -**Options** - -* `-s` convey message when two files are same -* `-y` two column output -* `-i` ignore case while comparing -* `-w` ignore white-spaces -* `-r` recursively compare files between the two directories specified -* `-q` report if files differ, not the details of difference - -**Examples** - -* `diff -s test_list_mar2.txt test_list_mar3.txt` compare two files -* `diff -s report.log bkp/mar10/` no need to specify second filename if names are same -* `diff -qr report/ bkp/mar10/report/` recursively compare files between report and bkp/mar10/report directories, filenames not matching are also specified in output - * see [this link](https://stackoverflow.com/questions/6217628/diff-to-output-only-the-file-names) for detailed analysis and corner cases -* `diff report/ bkp/mar10/report/ | grep -w '^diff'` useful trick to get only names of mismatching files (provided no mismatches contain the whole word diff at start of line) - -**Further Reading** - -* [diff Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/diff?sort=votes&pageSize=15) -* `gvimdiff` edit two, three or four versions of a file with Vim and show differences -* [GUI diff and merge tools](http://askubuntu.com/questions/2946/what-are-some-good-gui-diff-and-merge-applications-available-for-ubuntu) - -
- -### tr - ->translate or delete characters - -**Options** - -* `-d` delete the specified characters -* `-c` complement set of characters to be replaced - -**Examples** - -* `tr a-z A-Z < test_list.txt` convert lowercase to uppercase -* `tr -d ._ < test_list.txt` delete the dot and underscore characters -* `tr a-z n-za-m < test_list.txt > encrypted_test_list.txt` Encrypt by replacing every lowercase alphabet with 13th alphabet after it - * Same command on encrypted text will decrypt it -* [tr Q&A on unix stackexchange](http://unix.stackexchange.com/questions/tagged/tr?sort=votes&pageSize=15) - -
- -### sed - ->stream editor for filtering and transforming text - -**Options** - -* `-n` suppress automatic printing of pattern space -* `-i` edit files inplace (makes backup if SUFFIX supplied) -* `-r` use extended regular expressions -* `-e` add the script to the commands to be executed -* `-f` add the contents of script-file to the commands to be executed - * for examples and details, refer to links given below - -**commands** - -We'll be seeing examples only for three commonly used commands - -* `d` Delete the pattern space -* `p` Print out the pattern space -* `s` search and replace -* check out 'Often-Used Commands' and 'Less Frequently-Used Commands' sections in `info sed` for complete list of commands - -**range** - -By default, `sed` acts on all of input contents. This can be refined to specific line number or a range defined by line numbers, search pattern or mix of the two - -* `n,m` range between nth line to mth line, including n and m -* `i~j` act on ith line and i+j, i+2j, i+3j, etc - * `1~2` means 1st, 3rd, 5th, 7th, etc lines i.e odd numbered lines - * `5~3` means 5th, 8th, 11th, etc -* `n` only nth line -* `$` only last line -* `/pattern/` lines matching pattern -* `n,/pattern/` nth line to line matching pattern -* `n,+x` nth line and x lines after -* `/pattern/,m` line matching pattern to mth line -* `/pattern/,+x` line matching pattern and x lines after -* `/pattern1/,/pattern2/` line matching pattern1 to line matching pattern2 -* `/pattern/I` lines matching pattern, pattern is case insensitive -* for more details, see section 'Selecting lines with sed' in `info sed` -* see 'Regular Expressions' in [grep command](https://github.com/learnbyexample/Linux_command_line/blob/master/Working_with_Files_and_Directories.md#grep) for extended regular expressions reference -* also check out 'Overview of Regular Expression Syntax' section in `info sed` - -**Examples for selective deletion(d)** - -* `sed '/cat/d' story.txt` delete every line containing cat -* `sed '/cat/!d' story.txt` delete every line NOT containing cat -* `sed '$d' story.txt` delete last line of the file -* `sed '2,5d' story.txt` delete lines 2,3,4,5 of the file -* `sed '1,/test/d' dir_list.txt` delete all lines from beginning of file to first occurrence of line containing test (the matched line is also deleted) -* `sed '/test/,$d' dir_list.txt` delete all lines from line containing test to end of file - -**Examples for selective printing(p)** - -* `sed -n '5p' story.txt` print 5th line, `-n` option overrides default print behavior of sed - * use `sed '5q;d' story.txt` on large files. [Read more](https://stackoverflow.com/questions/191364/quick-unix-command-to-display-specific-lines-in-the-middle-of-a-file/17367226#17367226) -* `sed -n '/cat/p' story.txt` print every line containing the text cat - * equivalent to `sed '/cat/!d' story.txt` -* `sed -n '4,8!p' story.txt` print all lines except lines 4 to 8 -* `man grep | sed -n '/^\s*exit status/I,/^$/p'` extract exit status information of a command from manual - * `/^\s*exit status/I` checks for line starting with 'exit status' in case insensitive way, white-space may be present at start of line - * `/^$/` empty line -* `man ls | sed -n '/^\s*-F/,/^$/p'` extract information on command option from manual - * `/^\s*-F/` line starting with option '-F', white-space may be present at start of line - -**Examples for search and replace(s)** - -* `sed -i 's/cat/dog/g' story.txt` search and replace every occurrence of cat with dog in story.txt -* `sed -i.bkp 's/cat/dog/g' story.txt` in addition to inplace file editing, create backup file story.txt.bkp, so that if a mistake happens, original file can be restored - * `sed -i.bkp 's/cat/dog/g' *.txt` to perform operation on all files ending with .txt in current directory -* `sed -i '5,10s/cat/dog/gI' story.txt` search and replace every occurrence of cat (case insensitive due to modifier I) with dog in story.txt only in line numbers 5 to 10 -* `sed '/cat/ s/animal/mammal/g' story.txt` replace animal with mammal in all lines containing cat - * Since `-i` option is not used, output is displayed on standard output and story.txt is not changed - * spacing between range and command is optional, `sed '/cat/s/animal/mammal/g' story.txt` can also be used -* `sed -i -e 's/cat/dog/g' -e 's/lion/tiger/g' story.txt` search and replace every occurrence of cat with dog and lion with tiger - * any number of `-e` option can be used - * `sed -i 's/cat/dog/g ; s/lion/tiger/g' story.txt` alternative syntax, spacing around ; is optional -* `sed -r 's/(.*)/abc: \1 :xyz/' list.txt` add prefix 'abc: ' and suffix ' :xyz' to every line of list.txt -* `sed -i -r "s/(.*)/$(basename $PWD)\/\1/" dir_list.txt` add current directory name and forward-slash character at the start of every line - * Note the use of double quotes to perform command substitution -* `sed -i -r "s|.*|$HOME/\0|" dir_list.txt` add home directory and forward-slash at the start of every line - * Since the value of '$HOME' itself contains forward-slash characters, we cannot use `/` as delimiter - * Any character other than backslash or newline can be used as delimiter, for example `| # ^` [see this link for more info](https://stackoverflow.com/questions/33914360/what-delimiters-can-you-use-in-sed) - * `\0` back-reference contains entire matched string - -
- -**Example input file** - -```bash -$ cat mem_test.txt -mreg2 = 1200 # starting address -mreg4 = 2180 # ending address - -dreg5 = get(mreg2) + get(mreg4) -print dreg5 -``` - -* replace all **reg** with **register** - -```bash -$ sed 's/reg/register/g' mem_test.txt -mregister2 = 1200 # starting address -mregister4 = 2180 # ending address - -dregister5 = get(mregister2) + get(mregister4) -print dregister5 -``` - -* change start and end address - -```bash -$ sed 's/1200/1530/; s/2180/1870/' mem_test.txt -mreg2 = 1530 # starting address -mreg4 = 1870 # ending address - -dreg5 = get(mreg2) + get(mreg4) -print dreg5 - -$ # to make changes only on mreg initializations, use -$ # sed '/mreg[0-9] *=/ s/1200/1530/; s/2180/1870/' mem_test.txt -``` - -* Using `bash` variables - -```bash -$ s_add='1760'; e_add='2500' -$ sed "s/1200/$s_add/; s/2180/$e_add/" mem_test.txt -mreg2 = 1760 # starting address -mreg4 = 2500 # ending address - -dreg5 = get(mreg2) + get(mreg4) -print dreg5 -``` - -* split inline commented code to comment + code - -```bash -$ sed -E 's/^([^#]+)(#.*)/\2\n\1/' mem_test.txt -# starting address -mreg2 = 1200 -# ending address -mreg4 = 2180 - -dreg5 = get(mreg2) + get(mreg4) -print dreg5 -``` - -* range of lines matching pattern - -```bash -$ seq 20 | sed -n '/3/,/5/p' -3 -4 -5 -13 -14 -15 - -``` - -* inplace editing - -```bash -$ sed -i -E 's/([md]r)eg/\1/g' mem_test.txt -$ cat mem_test.txt -mr2 = 1200 # starting address -mr4 = 2180 # ending address - -dr5 = get(mr2) + get(mr4) -print dr5 - -$ # more than one input files can be given -$ # use glob pattern if files share commonality, ex: *.txt -``` - -**Further Reading** - -* [sed basics](http://code.snipcademy.com/tutorials/shell-scripting/sed/introduction) -* [sed detailed tutorial](http://www.grymoire.com/Unix/Sed.html) -* [sed-book](http://www.catonmat.net/blog/sed-book/) -* [cheat sheet](http://www.catonmat.net/download/sed.stream.editor.cheat.sheet.txt) -* [sed examples](http://how-to.linuxcareer.com/learning-linux-commands-sed) -* [sed one-liners explained](http://www.catonmat.net/series/sed-one-liners-explained) -* [common search and replace examples with sed](https://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files) -* [sed Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/sed?sort=votes&pageSize=15) -* [sed Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/sed?sort=votes&pageSize=15) - -
- -### awk - ->pattern scanning and text processing language - -`awk` derives its name from authors Alfred Aho, Peter Weinberger and Brian Kernighan. - -**syntax** - -* `awk 'BEGIN {initialize} condition1 {stmts} condition2 {stmts}... END {finish}'` - * `BEGIN {initialize}` used to initialize variables (could be user defined or awk variables or both), executed once - optional block - * `condition1 {stmts} condition2 {stmts}...` action performed for every line of input, condition is optional, more than one block {} can be used with/without condition - * `END {finish}` perform action once at end of program - optional block -* commands can be written in a file and passed using the `-f` option instead of writing it all on command line - * for examples and details, refer to links given below - -
- -**Example input file** - -```bash -$ cat test.txt -abc : 123 : xyz -3 : 32 : foo --2.3 : bar : bar -``` - -* Just printing something, no input - -```bash -$ awk 'BEGIN{print "Hello!\nTesting awk one-liner"}' -Hello! -Testing awk one-liner -``` - -* search and replace -* when the `{stmts}` portion of `condition {stmts}` is not specified, by default `{print $0}` is executed if the `condition` evaluates to true - * `1` is a generally used `awk` idiom to print contents of `$0` after performing some processing - * `print` statement without argument will print the content of `$0` - -```bash -$ # sub will replace only first occurrence -$ # third argument to sub specifies variable to change, defaults to $0 -$ awk '{sub("3", "%")} 1' test.txt -abc : 12% : xyz -% : 32 : foo --2.% : bar : bar - -$ # gsub will replace all occurrences -$ awk '{gsub("3", "%")} 1' test.txt -abc : 12% : xyz -% : %2 : foo --2.% : bar : bar - -$ # add a condition to restrict processing only to those records -$ awk '/foo/{gsub("3", "%")} 1' test.txt -abc : 123 : xyz -% : %2 : foo --2.3 : bar : bar - -$ # using shell variables -$ r="@" -$ awk -v r_str="$r" '{sub("3", r_str)} 1' test.txt -abc : 12@ : xyz -@ : 32 : foo --2.@ : bar : bar - -$ # bash environment variables like PWD, HOME is also accessible via ENVIRON -$ s="%" awk '{sub("3", ENVIRON["s"])} 1' test.txt -abc : 12% : xyz -% : 32 : foo --2.% : bar : bar -``` - -* filtering content - -```bash -$ # regex pattern, by default tested against $0 -$ awk '/a/' test.txt -abc : 123 : xyz --2.3 : bar : bar - -$ # use ! to invert condition -$ awk '!/abc/' test.txt -3 : 32 : foo --2.3 : bar : bar - -$ seq 30 | awk 'END{print}' -30 - -$ # generic, length(var) - default is $0 -$ seq 8 13 | awk 'length==1' -8 -9 -``` - -* selecting based on line numbers -* `NR` is record number - -```bash -$ seq 123 135 | awk 'NR==7' -129 - -$ seq 123 135 | awk 'NR>=3 && NR<=5' -125 -126 -127 - -$ seq 5 | awk 'NR>=3' -3 -4 -5 - -$ # for large input, use exit to avoid unnecessary record processing -$ seq 14323 14563435 | awk 'NR==234{print; exit}' -14556 -``` - -* selecting based on start and end condition -* for following examples - * numbers 1 to 20 is input - * regex pattern `/4/` is start condition - * regex pattern `/6/` is end condition -* `f` is idiomatically used to represent a flag variable - -```bash -$ # records between start and end -$ seq 20 | awk '/4/{f=1; next} /6/{f=0} f' -5 -15 - -$ # records between start and end and also includes start -$ seq 20 | awk '/4/{f=1} /6/{f=0} f' -4 -5 -14 -15 - -$ # records between start and end and also includes end -$ seq 20 | awk '/4/{f=1; next} f; /6/{f=0}' -5 -6 -15 -16 - -$ # records from start to end -$ seq 20 | awk '/4/{f=1} f{print} /6/{f=0}' -4 -5 -6 -14 -15 -16 - -$ # records excluding start to end -$ seq 10 | awk '/4/{f=1} !f; /6/{f=0}' -1 -2 -3 -7 -8 -9 -10 -``` - -* column manipulations -* by default, one or more consecutive spaces/tabs are considered as field separators - -```bash -$ echo -e "1 3 4\na b c" -1 3 4 -a b c - -$ # second column -$ echo -e "1 3 4\na b c" | awk '{print $2}' -3 -b - -$ # last column -$ echo -e "1 3 4\na b c" | awk '{print $NF}' -4 -c - -$ # default output field separator is single space character -$ echo -e "1 3 4\na b c" | awk '{print $1, $3}' -1 4 -a c - -$ # condition for specific field -$ echo -e "1 3 4\na b c" | awk '$2 ~ /[0-9]/' -1 3 4 -``` - -* specifying a different input/output field separator -* can be string alone or regex, multiple separators can be specified using `|` in regex pattern - -```bash -$ awk -F' *: *' '$1 == "3"' test.txt -3 : 32 : foo - -$ awk -F' *: *' '{print $1 "," $2}' test.txt -abc,123 -3,32 --2.3,bar - -$ awk -F' *: *' -v OFS="::" '{print $1, $2}' test.txt -abc::123 -3::32 --2.3::bar - -$ awk -F: -v OFS="\t" '{print $1 OFS $2}' test.txt -abc 123 -3 32 --2.3 bar -``` - -* dealing with duplicates, line/field wise - -```bash -$ cat duplicates.txt -abc 123 ijk -foo 567 xyz -abc 123 ijk -bar 090 pqr -tst 567 zzz - -$ # whole line -$ awk '!seen[$0]++' duplicates.txt -abc 123 ijk -foo 567 xyz -bar 090 pqr -tst 567 zzz - -$ # particular column -$ awk '!seen[$2]++' duplicates.txt -abc 123 ijk -foo 567 xyz -bar 090 pqr -``` - -* inplace editing - -```bash -$ awk -i inplace '{print NR ") " $0}' test.txt -$ cat test.txt -1) abc : 123 : xyz -2) 3 : 32 : foo -3) -2.3 : bar : bar -``` - -**Further Reading** - -* [awk basics](http://code.snipcademy.com/tutorials/shell-scripting/awk/introduction) -* [Gawk: Effective AWK Programming](https://www.gnu.org/software/gawk/manual/) -* [awk detailed tutorial](http://www.grymoire.com/Unix/Awk.html) -* [basic tutorials for grep, awk, sed](https://unix.stackexchange.com/questions/2434/is-there-a-basic-tutorial-for-grep-awk-and-sed) -* [awk one-liners explained](http://www.catonmat.net/series/awk-one-liners-explained) -* [awk book](http://www.catonmat.net/blog/awk-book/) -* [awk cheat-sheet](http://www.catonmat.net/download/awk.cheat.sheet.txt) for awk variables, statements, functions, etc -* [awk examples](http://www.thegeekstuff.com/tag/unix-awk-examples/) -* [awk Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/awk?sort=votes&pageSize=15) -* [awk Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/awk?sort=votes&pageSize=15) - -
- -### perl - ->The Perl 5 language interpreter - -[Larry Wall](https://en.wikipedia.org/wiki/Larry_Wall) wrote Perl as a **general purpose scripting language**, borrowing features from **C, shell scripting, awk, sed, grep, cut, sort** etc - -Reference tables given below for frequently used constructs with **perl one-liners**. Resource links given at end for further reading. - -
- -Descriptions adapted from [perldoc - command switches](http://perldoc.perl.org/perlrun.html#Command-Switches) - -| Option | Description | -| ------------- | ----------- | -| -e | execute perl code | -| -n | iterate over input files in a loop, lines are NOT printed by default | -| -p | iterate over input files in a loop, lines are printed by default | -| -l | chomp input line, $\ gets value of $/ if no argument given | -| -a | autosplit input lines on space, implicitly sets -n for Perl version 5.20.0 and above | -| -F | specifies the pattern to split input lines, implicitly sets -a and -n for Perl version 5.20.0 and above | -| -i | edit files inplace, if extension provided make a backup copy | -| -0777 | slurp entire file as single string, not advisable for large input files | - -
- -Descriptions adapted from [perldoc - Special Variables](http://perldoc.perl.org/perlvar.html#SPECIAL-VARIABLES) - -| Variable | Description | -| ------------- | ----------- | -| $_ | The default input and pattern-searching space | -| $. | Current line number | -| $/ | input record separator, newline by default | -| $\ | output record separator, empty string by default | -| @F | contains the fields of each line read, applicable with -a or -F option | -| %ENV | contains current environment variables | -| $ARGV | contains the name of the current file | - -
- -| Function | Description | -| ------------- | ----------- | -| length | Returns the length in characters of the value of EXPR. If EXPR is omitted, returns the length of $_ | -| eof | Returns 1 if the next read on FILEHANDLE will return end of file | - -
- -**Simple Perl program** - -```bash -$ perl -e 'print "Hello!\nTesting Perl one-liner\n"' -Hello! -Testing Perl one-liner -``` - -
- -**Example input file** - -```bash -$ cat test.txt -abc : 123 : xyz -3 : 32 : foo --2.3 : bar : bar -``` - -
- -* Search and replace - -```bash -$ perl -pe 's/3/%/' test.txt -abc : 12% : xyz -% : 32 : foo --2.% : bar : bar - -$ # use g flag to replace all occurrences, not just first match in line -$ perl -pe 's/3/%/g' test.txt -abc : 12% : xyz -% : %2 : foo --2.% : bar : bar - -$ # conditional replacement -$ perl -pe 's/3/@/g if /foo/' test.txt -abc : 123 : xyz -@ : @2 : foo --2.3 : bar : bar - -$ # using shell variables -$ r="@" -$ perl -pe "s/3/$r/" test.txt -abc : 12@ : xyz -@ : 32 : foo --2.@ : bar : bar - -$ # preferred approach is to use ENV hash variable -$ export s="%" -$ perl -pe 's/3/$ENV{s}/' test.txt -abc : 12% : xyz -% : 32 : foo --2.% : bar : bar -``` - -
- -* Search and replace special characters - -The `\Q` and `q()` constructs are helpful to nullify regex meta characters - -```bash -$ # if not properly escaped or quoted, it can lead to errors -$ echo '*.^[}' | perl -pe 's/*.^[}/abc/' -Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE .^[}/ at -e line 1. - -$ echo '*.^[}' | perl -pe 's/\*\.\^\[}/abc/' -abc - -$ echo '*.^[}' | perl -pe 's/\Q*.^[}/abc/' -abc - -$ echo '*.^[}' | perl -pe 's/\Q*.^[}/\$abc\$/' -$abc$ - -$ echo '*.^[}' | perl -pe 's/\Q*.^[}/q($abc$)/e' -$abc$ -``` - -
- -* Print lines based on line number or pattern - -```bash -$ perl -ne 'print if /a/' test.txt -abc : 123 : xyz --2.3 : bar : bar - -$ perl -ne 'print if !/abc/' test.txt -3 : 32 : foo --2.3 : bar : bar - -$ seq 123 135 | perl -ne 'print if $. == 7' -129 - -$ seq 1 30 | perl -ne 'print if eof' -30 - -$ # Use exit to save time on large input files -$ seq 14323 14563435 | perl -ne 'if($. == 234){print; exit}' -14556 - -$ # length() can also be used instead of length $_ -$ seq 8 13 | perl -lne 'print if length $_ == 1' -8 -9 -``` - -
- -* Print range of lines based on line number or pattern - -```bash -$ seq 123 135 | perl -ne 'print if $. >= 3 && $. <= 5' -125 -126 -127 - -$ # $. is default variable compared against when using .. -$ seq 123 135 | perl -ne 'print if 3..5' -125 -126 -127 - -$ # can use many alternatives, eof looks more readable -$ seq 5 | perl -ne 'print if 3..eof' -3 -4 -5 - -$ # matching regex specified by /pattern/ is checked against $_ -$ seq 5 | perl -ne 'print if 3../4/' -3 -4 - -$ seq 1 30 | perl -ne 'print if /4/../6/' -4 -5 -6 -14 -15 -16 -24 -25 -26 - -$ seq 2 8 | perl -ne 'print if !(/4/../6/)' -2 -3 -7 -8 -``` - -
- -* `..` vs `...` - -```bash -$ echo -e '10\n11\n10' | perl -ne 'print if /10/../10/' -10 -10 - -$ echo -e '10\n11\n10' | perl -ne 'print if /10/.../10/' -10 -11 -10 -``` - -
- -* Column manipulations - -```bash -$ echo -e "1 3 4\na b c" | perl -nale 'print $F[1]' -3 -b - -$ echo -e "1,3,4,8\na,b,c,d" | perl -F, -lane 'print $F[$#F]' -8 -d - -$ perl -F: -lane 'print "$F[0] $F[2]"' test.txt -abc xyz -3 foo --2.3 bar - -$ perl -F: -lane '$sum+=$F[1]; END{print $sum}' test.txt -155 - -$ perl -F: -lane '$F[2] =~ s/\w(?=\w)/$&,/g; print join ":", @F' test.txt -abc : 123 : x,y,z -3 : 32 : f,o,o --2.3 : bar : b,a,r - -$ perl -F'/:\s*[a-z]+/i' -lane 'print $F[0]' test.txt -abc : 123 -3 : 32 --2.3 - -$ perl -F'\s*:\s*' -lane 'print join ",", grep {/[a-z]/i} @F' test.txt -abc,xyz -foo -bar,bar - -$ perl -F: -ane 'print if (grep {/\d/} @F) < 2' test.txt -abc : 123 : xyz --2.3 : bar : bar -``` - -
- -* Dealing with duplicates - -```bash -$ cat duplicates.txt -abc 123 ijk -foo 567 xyz -abc 123 ijk -bar 090 pqr -tst 567 zzz - -$ # whole line -$ perl -ne 'print if !$seen{$_}++' duplicates.txt -abc 123 ijk -foo 567 xyz -bar 090 pqr -tst 567 zzz - -$ # particular column -$ perl -ane 'print if !$seen{$F[1]}++' duplicates.txt -abc 123 ijk -foo 567 xyz -bar 090 pqr -``` - -
- -* Multiline processing - -```bash -$ # save previous lines to make it easier for multiline matching -$ perl -ne 'print if /3/ && $p =~ /abc/; $p = $_' test.txt -3 : 32 : foo - -$ perl -ne 'print "$p$_" if /3/ && $p =~ /abc/; $p = $_' test.txt -abc : 123 : xyz -3 : 32 : foo - -$ # with multiline matching, -0777 slurping not advisable for very large files -$ perl -0777 -ne 'print $1 if /.*abc.*\n(.*3.*\n)/' test.txt -3 : 32 : foo -$ perl -0777 -ne 'print $1 if /(.*abc.*\n.*3.*\n)/' test.txt -abc : 123 : xyz -3 : 32 : foo - -$ # use s flag to allow .* to match across lines -$ perl -0777 -pe 's/(.*abc.*32)/ABC/s' test.txt -ABC : foo --2.3 : bar : bar - -$ # use m flag if ^$ anchors are needed to match individual lines -$ perl -0777 -pe 's/(.*abc.*3)/ABC/s' test.txt -ABC : bar : bar -$ perl -0777 -pe 's/(.*abc.*^3)/ABC/sm' test.txt -ABC : 32 : foo --2.3 : bar : bar - -$ # print multiple lines after matching line -$ perl -ne 'if(/abc/){ print; foreach (1..2){$n = <>; print $n} }' test.txt -abc : 123 : xyz -3 : 32 : foo --2.3 : bar : bar -``` - -
- -* Using modules - -```bash -$ echo 'a,b,a,c,d,1,d,c,2,3,1,b' | perl -MList::MoreUtils=uniq -F, -lane 'print join ",",uniq(@F)' -a,b,c,d,1,2,3 - -$ base64 test.txt -YWJjICA6IDEyMyA6IHh5egozICAgIDogMzIgIDogZm9vCi0yLjMgOiBiYXIgOiBiYXIK -$ base64 test.txt | base64 -d -abc : 123 : xyz -3 : 32 : foo --2.3 : bar : bar -$ base64 test.txt | perl -MMIME::Base64 -ne 'print decode_base64($_)' -abc : 123 : xyz -3 : 32 : foo --2.3 : bar : bar - -$ perl -MList::MoreUtils=indexes -nale '@i = indexes { /[a-z]/i } @F if $. == 1; print join ",", @F[@i]' test.txt -abc,xyz -3,foo --2.3,bar -``` - -
- -* In place editing - -```bash -$ perl -i -pe 's/\d/*/g' test.txt -$ cat test.txt -abc : *** : xyz -* : ** : foo --*.* : bar : bar - -$ perl -i.bak -pe 's/\*/^/g' test.txt -$ cat test.txt -abc : ^^^ : xyz -^ : ^^ : foo --^.^ : bar : bar -$ cat test.txt.bak -abc : *** : xyz -* : ** : foo --*.* : bar : bar -``` - -
- -**Further Reading** - -* [Perl Introduction](https://github.com/learnbyexample/Perl_intro) - Introductory course for Perl 5 through examples -* [Perl curated resources](https://github.com/learnbyexample/scripting_course/blob/master/Perl_curated_resources.md) -* [Handy Perl regular expressions](http://www.catonmat.net/blog/perl-one-liners-explained-part-seven/) -* [What does this regex mean?](http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean) -* [Perl one-liners](http://www.catonmat.net/series/perl-one-liners-explained) -* [Perl command line switches](http://perl101.org/command-line-switches.html) -* [Env](http://perldoc.perl.org/Env.html) - -
- -### cut - ->remove sections from each line of files - -For columns operations with well defined delimiters, `cut` command is handy - -**Examples** - -* `ls -l | cut -d' ' -f1` first column of `ls -l` - * `-d` option specifies delimiter character, in this case it is single space character (Default delimiter is TAB character) - * `-f` option specifies which fields to print separated by commas, in this case field 1 -* `cut -d':' -f1 /etc/passwd` prints first column of /etc/passwd file -* `cut -d':' -f1,7 /etc/passwd` prints 1st and 7th column of /etc/passwd file with : character in between -* `cut -d':' --output-delimiter=' ' -f1,7 /etc/passwd` use space as delimiter between 1st and 7th column while printing -* [cut Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cut?sort=votes&pageSize=15) - -
- -### paste - ->merge lines of files - -**Examples** - -* `paste list1.txt list2.txt list3.txt > combined_list.txt` combines the three files column-wise into single file, the entries separated by TAB character -* `paste -d':' list1.txt list2.txt list3.txt > combined_list.txt` the entries are separated by : character instead of TAB - * See [pr](#pr) command for multiple character delimiter -* [paste Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/paste?sort=votes&pageSize=15) - -```bash -$ # joining multiple files -$ paste -d, <(seq 5) <(seq 6 10) -1,6 -2,7 -3,8 -4,9 -5,10 - -$ paste -d, <(seq 3) <(seq 4 6) <(seq 7 10) -1,4,7 -2,5,8 -3,6,9 -,,10 -``` - -* Single column to multiple columns - -```bash -$ seq 5 | paste - - -1 2 -3 4 -5 - -$ # specifying different output delimiter, default is tab -$ seq 5 | paste -d, - - -1,2 -3,4 -5, - -$ # if number of columns to specify is large, use the printf trick -$ seq 5 | paste $(printf -- "- %.s" {1..3}) -1 2 3 -4 5 -``` - -* Combine all lines to single line - -```bash -$ seq 10 | paste -sd, -1,2,3,4,5,6,7,8,9,10 - -$ # for multiple character delimiter, perl can be used -$ seq 10 | perl -pe 's/\n/ : / if(!eof)' -1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 -``` - -
- -### column - ->columnate lists - -```bash -$ cat dishes.txt -North alootikki baati khichdi makkiroti poha -South appam bisibelebath dosa koottu sevai -West dhokla khakhra modak shiro vadapav -East handoguri litti momo rosgulla shondesh - -$ column -t dishes.txt -North alootikki baati khichdi makkiroti poha -South appam bisibelebath dosa koottu sevai -West dhokla khakhra modak shiro vadapav -East handoguri litti momo rosgulla shondesh -``` - -* More examples [here](http://www.commandlinefu.com/commands/using/column/sort-by-votes) - -
- -### pr - ->convert text files for printing - -```bash -$ pr sample.txt - - -2016-05-29 11:00 sample.txt Page 1 - - -This is an example of adding text to a new file using cat command. -Press Ctrl+d on a newline to save and quit. -Adding a line of text at end of file -``` - -* Options include converting text files for printing with header, footer, page numbers, double space a file, combine multiple files column wise, etc -* More examples [here](http://docstore.mik.ua/orelly/unix3/upt/ch21_15.htm) - -```bash -$ # single column to multiple column, split vertically -$ # for example, in command below, output of seq is split into two -$ seq 5 | pr -2t -1 4 -2 5 -3 - -$ # different output delimiter can be used by passing string to -s option -$ seq 5 | pr -2ts' ' -1 4 -2 5 -3 - -$ seq 15 | pr -5ts, -1,4,7,10,13 -2,5,8,11,14 -3,6,9,12,15 -``` - -* Use `-a` option to split across - -```bash -$ seq 5 | pr -2ats' : ' -1 : 2 -3 : 4 -5 - -$ seq 15 | pr -5ats, -1,2,3,4,5 -6,7,8,9,10 -11,12,13,14,15 - -$ # use $ to expand characters denoted by escape characters like \t for tab -$ seq 5 | pr -3ts$'\t' -1 3 5 -2 4 - -$ # or leave the argument to -s empty as tab is default -$ seq 5 | pr -3ts -1 3 5 -2 4 -``` - -* The default PAGE_WIDTH is 72 -* The formula `(col-1)*len(delimiter) + col` seems to work in determining minimum PAGE_WIDTH required for multiple column output -* The `-J` option will help in turning off line truncation - -```bash -$ seq 74 | pr -36ats, -1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36 -37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72 -73,74 -$ seq 74 | pr -37ats, -pr: page width too narrow - -$ # (37-1)*1 + 37 = 73 -$ seq 74 | pr -Jw 73 -37ats, -1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37 -38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74 - -$ # (3-1)*4 + 3 = 11 -$ seq 6 | pr -Jw 10 -3ats'::::' -pr: page width too narrow -$ seq 6 | pr -Jw 11 -3ats'::::' -1::::2::::3 -4::::5::::6 -``` - -* Use `-m` option to combine multiple files in parallel - -```bash -$ pr -mts', ' <(seq 3) <(seq 4 6) <(seq 7 9) -1, 4, 7 -2, 5, 8 -3, 6, 9 -``` - -
- -We can use a combination of different commands for complicated operations. For example, transposing a table - -```bash -$ tr ' ' '\n' < dishes.txt | pr -$(wc -l < dishes.txt)t -North South West East -alootikki appam dhokla handoguri -baati bisibelebath khakhra litti -khichdi dosa modak momo -makkiroti koottu shiro rosgulla -poha sevai vadapav shondesh -``` - -Notice how `pr` neatly arranges the columns. If spacing is too much, we can use `column` - -```bash -$ tr ' ' '\n' < dishes.txt | pr -$(wc -l < dishes.txt)ts | column -t -North South West East -alootikki appam dhokla handoguri -baati bisibelebath khakhra litti -khichdi dosa modak momo -makkiroti koottu shiro rosgulla -poha sevai vadapav shondesh -``` diff --git a/Working_with_Files_and_Directories.md b/Working_with_Files_and_Directories.md deleted file mode 100644 index c81d0f2..0000000 --- a/Working_with_Files_and_Directories.md +++ /dev/null @@ -1,1075 +0,0 @@ -# Working with Files and Directories - -* [cat](#cat) -* [less](#less) -* [tail](#tail) -* [head](#head) -* [Text Editors](#text-editors) -* [grep](#grep) -* [find](#find) -* [locate](#locate) -* [wc](#wc) -* [du](#du) -* [df](#df) -* [touch](#touch) -* [file](#file) -* [basename](#basename) -* [dirname](#dirname) -* [chmod](#chmod) - -In this chapter, we will see how to display contents of a file, search within files, search for files, get file properties and information, what are the permissions for files/directories and how to change them to our requirements - -
- -### cat - ->concatenate files and print on the standard output - -**Options** - -* `-n` number output lines -* `-s` squeeze repeated empty lines into single empty line -* `-e` show non-printing characters and end of line -* `-A` in addition to `-e`, also shows tab characters - -**Examples** - -* One or more files can be given as input and hence a lot of times, `cat` is used to quickly see contents of small single file on terminal - * But not needed to simply pass file content as stdin to other commands. See [Useless Use of Cat Award](http://porkmail.org/era/unix/award.html) -* To save the output of concatenation, just redirect stdout - -```bash -$ ls -marks_2015.txt marks_2016.txt marks_2017.txt - -$ cat marks_201* -Name Maths Science -foo 67 78 -bar 87 85 -Name Maths Science -foo 70 75 -bar 85 88 -Name Maths Science -foo 68 76 -bar 90 90 - -$ # save stdout to a file -$ cat marks_201* > all_marks.txt -``` - -* often used option is `-A` to see various non-printing characters and end of line - -```bash -$ printf 'foo\0bar\tbaz \r\n' -foobar baz - -$ printf 'foo\0bar\tbaz \r\n' | cat -A -foo^@bar^Ibaz ^M$ -``` - -* use `tac` to reverse input line wise - -```bash -$ tac marks_2015.txt -bar 87 85 -foo 67 78 -Name Maths Science - -$ seq 3 | tac -3 -2 -1 -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [cat from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#cat) -* [cat Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/cat?sort=votes&pageSize=15) -* [cat Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/cat?sort=votes&pageSize=15) - -
- -### less - ->opposite of more - -`cat` command is not suitable for viewing contents of large files on the Terminal. `less` displays contents of a file, automatically fits to size of Terminal, allows scrolling in either direction and other options for effective viewing. Usually, `man` command uses `less` command to display the help page. The navigation options are similar to `vi` editor - -Commonly used commands are given below, press `h` for summary of options - -* `g` go to start of file -* `G` go to end of file -* `q` quit -* `/pattern` search for the given pattern in forward direction -* `?pattern` search for the given pattern in backward direction -* `n` go to next pattern -* `N` go to previous pattern - -**Example and Further Reading** - -* `less -s large_filename` display contents of file large_filename using less command, consecutive blank lines are squeezed as single blank line - * Use `-N` option to prefix line number -* `less` command is an [improved version](https://unix.stackexchange.com/questions/604/isnt-less-just-more) of `more` command -* [differences between most, more and less](https://unix.stackexchange.com/questions/81129/what-are-the-differences-between-most-more-and-less) -* [less Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/less?sort=votes&pageSize=15) - -
- -### tail - ->output the last part of files - -**Examples** - -* By default, `tail` displays last 10 lines -* Use `-n` option to change how many lines are needed - -```bash -$ # last two lines -$ tail -n2 report.log -Error: something seriously went wrong -blah blah blah - -$ # all lines starting from 3rd line i.e all lines except first two lines -$ seq 13 17 | tail -n +3 -15 -16 -17 -``` - -* multiple file input - -```bash -$ # use -q option to avoid filename in output -$ tail -n2 report.log sample.txt -==> report.log <== -Error: something seriously went wrong -blah blah blah - -==> sample.txt <== -He he he -Adios amigo -``` - -* characterwise extraction - * Note that this works byte wise and not suitable for multi-byte character encodings - -```bash -$ # last three characters including the newline character -$ echo 'Hi there!' | tail -c3 -e! - -$ # excluding the first character -$ echo 'Hi there!' | tail -c +2 -i there! -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [tail from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#tail) -* [tail Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/tail?sort=votes&pageSize=15) -* [tail Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/tail?sort=votes&pageSize=15) - -
- -### head - ->output the first part of files - -**Examples** - -* By default, `head` displays first 10 lines -* Use `-n` option to change how many lines are needed - -```bash -$ head -n3 report.log -blah blah -Warning: something went wrong -more blah - -$ # tail gives last 10 lines, head then gives first 2 from tail output -$ tail sample.txt | head -n2 -Just do-it -Believe it - -$ # except last 2 lines -$ seq 13 17 | head -n -2 -13 -14 -15 -``` - -* multiple file input - -```bash -$ # use -q option to avoid filename in output -$ head -n3 report.log sample.txt -==> report.log <== -blah blah -Warning: something went wrong -more blah - -==> sample.txt <== -Hello World! - -Good day -``` - -* characterwise extraction - * Note that this works byte wise and not suitable for multi-byte character encodings - -```bash -$ # first two characters -$ echo 'Hi there!' | head -c2 -Hi - -$ # excluding last four characters -$ echo 'Hi there!' | head -c -4 -Hi the -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [head from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/tail_less_cat_head.md#head) -* [head Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/head?sort=votes&pageSize=15) - -
- -### Text Editors - -For editing text files, the following applications can be used. Of these, `gedit`, `nano`, `vi` and/or `vim` are available in most distros by default - -Easy to use - -* [gedit](https://wiki.gnome.org/Apps/Gedit) -* [geany](https://www.geany.org/) -* [nano](https://nano-editor.org/) - -Powerful text editors - -* [vim](https://github.com/vim/vim) - * [vim learning resources](https://github.com/learnbyexample/scripting_course/blob/master/Vim_curated_resources.md) and [vim reference](https://github.com/learnbyexample/vim_reference) for further info -* [emacs](https://www.gnu.org/software/emacs/) -* [atom](https://atom.io/) -* [sublime](https://www.sublimetext.com/) - -
- -### grep - ->print lines matching a pattern - -`grep` stands for **Global Regular Expression Print**. Used to search for a pattern in given files - whether a particular word or pattern is present (or not present), name of files containing the pattern, etc. By default, matching is performed in any part of a line, options and regular expressions can be used to match only the desired part - -**Options** - -* `--color=auto` display the matched pattern, file names, line numbers etc with color distinction -* `-i` ignore case while matching -* `-v` print non-matching lines, i.e it inverts the selection -* `-n` print also line numbers of matched pattern -* `-c` display only the count of number of lines matching the pattern -* `-l` print only the filenames with matching pattern -* `-L` print filenames NOT matching the pattern -* `-w` match pattern against whole word -* `-x` match pattern against whole line -* `-F` interpret pattern to search as fixed string (i.e not a regular expression). Faster as well -* `-o` print only matching parts -* `-A number` print matching line and 'number' of lines after the matched line -* `-B number` print matching line and 'number' of lines before the matched line -* `-C number` print matching line and 'number' of lines before and after the matched line -* `-m number` restrict printing to upper limit of matched lines specified by 'number' -* `-q` no standard output, quit immediately if match found. Useful in scripts to check if a file contains search pattern or not -* `-s` suppress error messages if file doesn't exist or not readable. Again, more useful in scripts -* `-r` recursively search all files in specified folders -* `-h` do not prefix filename for matching lines (default behavior for single file search) -* `-H` prefix filename for matching lines (default behavior for multiple file search) - -**Examples** - -* `grep 'area' report.log` will print all lines containing the word area in report.log -* `grep 'adder power' report.log` will print lines containing adder power -* `man grep | grep -i -A 5 'exit status'` will print matched line and 5 lines after containing the words 'exit status' independent of case - * See **Context Line Control** topic in `info grep` for related options like `--no-group-separator` -* `grep -m 5 'error' report.log` will print maximum of 5 lines containing the word error -* `grep "$HOME" /etc/passwd` will print lines matching the value of environment variable HOME - * Note the use of double quotes for variable substitution -* `grep -w 'or' story.txt` match whole word or, not part of word like for, thorn etc -* `grep -x 'power' test_list.txt` match whole line containing the pattern power - -*Note:* All of the above examples would be suited for `-F` option as these do not use regular expressions and will be faster with `-F` option - -**Regular Expressions** - -Regular Expressions help in defining precise patterns, like extracting only alphabets or numbers, matching at start of line, end of line, character sequence, etc -The following reference is for **ERE - Extended Regular Expressions** - -Anchors - -* `^` match from start of line -* `$` match end of line -* `\<` match beginning of word -* `\>` match end of word -* `\b` match edge of word -* `\B` match other than edge of word - -Character Quantifiers - -* `.` match any single character -* `*` match preceding character 0 or more times -* `+` match preceding character 1 or more times -* `?` match preceding character 0 or 1 times -* `{n}` match preceding character exactly n times -* `{n,}` match preceding character n or more times -* `{n,m}` match preceding character n to m times, including n and m -* `{,m}` match preceding character up to m times - -Character classes - -* `[aeiou]` match any of these characters -* `[^aeiou]` do not match any of these characters -* `[a-z]` match any lowercase alphabet -* `[0-9]` match any digit character -* `\w` match alphabets, digits and underscore character, short cut for `[a-zA-Z0-9_]` -* `\W` opposite of `\w` , short cut for `[^a-zA-Z0-9_]` -* `\s` match white-space characters: tab, newline, vertical tab, form feed, carriage return, and space -* `\S` match other than white-space characters - -Pattern groups - -* `|` matches either of the given patterns -* `()` patterns within `()` are grouped and treated as one pattern, useful in conjunction with `|` -* `\1` backreference to first grouped pattern within `()` -* `\2` backreference to second grouped pattern within `()` and so on - -**Basic vs Extended Regular Expressions** - -By default, the pattern passed to `grep` is treated as Basic Regular Expressions(BRE), which can be overridden using options like `-E` for ERE and `-P` for Perl Compatible Regular Expression(PCRE) -Paraphrasing from `info grep` - ->In Basic Regular Expressions the meta-characters `? + { | ( )` lose their special meaning, instead use the backslashed versions `\? \+ \{ \| \( \)` - -**Examples** - -* `grep -i '[a-z]' report.log` will print all lines having atleast one alphabet character -* `grep '[0-9]' report.log` will print all lines having atleast one number -* `grep 'area\|power' report.log` will match lines containing area or power -* `grep -E 'area|power' report.log` will match lines containing area or power -* `grep -E 'hand(y|ful)' short_story.txt` match handy or handful -* `grep -E '(Th)?is' short_story.txt` match This or is -* `grep -iE '([a-z])\1' short_story.txt` match same alphabet appearing consecutively like 'aa', 'FF', 'Ee' etc - -**Perl Compatible Regular Expression** - -* `grep -P '\d' report.log` will print all lines having atleast one number -* `grep -P '(Th)?is' short_story.txt` match This or is -* `grep -oP 'file\K\d+' report.log` print only digits that are preceded by the string 'file' -* `man pcrepattern` syntax and semantics of the regular expressions that are supported by PCRE -* [look-around assertions example](https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match) - -**Example input files** -```bash -$ cat ip.txt -Roses are red, -Violets are blue, -Sugar is sweet, -And so are you. - -$ echo -e 'Red\nGreen\nBlue\nBlack\nWhite' > colors.txt -$ cat colors.txt -Red -Green -Blue -Black -White -``` - -* string search, use `-F` for faster results - -```bash -$ grep -F 'are' ip.txt -Roses are red, -Violets are blue, -And so are you. - -$ grep -Fv 'are' ip.txt -Sugar is sweet, - -$ grep -Fc 'are' ip.txt -3 - -$ grep -F -m2 'are' ip.txt -Roses are red, -Violets are blue, - -$ grep -F 'rose' ip.txt -$ grep -Fi 'rose' ip.txt -Roses are red, -``` - -* regular expression, cannot use `-F` - -```bash -$ # lines with words starting with s or S -$ grep -iE '\bs' ip.txt -Sugar is sweet, -And so are you. - -$ # get only the words starting with s or S -$ grep -ioE '\bs[a-z]+' ip.txt -Sugar -sweet -so -``` - -* using file input to specify search terms - -```bash -$ grep -Fif colors.txt ip.txt -Roses are red, -Violets are blue, - -$ echo -e 'Brown\nRed\nGreen\nBlue\nYellow\nBlack\nWhite' > more_colors.txt - -$ # get common lines between two files -$ grep -Fxf colors.txt more_colors.txt -Red -Green -Blue -Black -White - -$ # get lines present in more_colors.txt but not colors.txt -$ grep -Fxvf colors.txt more_colors.txt -Brown -Yellow -``` - -**Further Reading** - -* For more detailed examples and discussion, see [GNU grep chapter from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/gnu_grep.md) -* [how grep command was born](https://medium.com/@rualthanzauva/grep-was-a-private-command-of-mine-for-quite-a-while-before-i-made-it-public-ken-thompson-a40e24a5ef48) -* [why GNU grep is fast](https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html) -* [Difference between grep, egrep and fgrep](https://unix.stackexchange.com/questions/17949/what-is-the-difference-between-grep-egrep-and-fgrep) -* [grep Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/grep?sort=votes&pageSize=15) -* [grep Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/grep?sort=votes&pageSize=15) - -
- -### find - ->search for files in a directory hierarchy - -**Examples** - -Filtering based on file name - -* `find . -iname 'power.log'` search and print path of file named power.log (ignoring case) in current directory and its sub-directories -* `find -name '*log'` search and print path of all files whose name ends with log in current directory - using `.` is optional when searching in current directory -* `find -not -name '*log'` print path of all files whose name does NOT end with log in current directory -* `find -regextype egrep -regex '.*/\w+'` use extended regular expression to match filename containing only `[a-zA-Z_]` characters - * `.*/` is needed to match initial part of file path - -Filtering based on file type - -* `find /home/guest1/proj -type f` print path of all regular files found in specified directory -* `find /home/guest1/proj -type d` print path of all directories found in specified directory -* `find /home/guest1/proj -type f -name '.*'` print path of all hidden files - -Filtering based on depth - -The relative path `.` is considered as depth 0 directory, files and folders immediately contained in a directory are at depth 1 and so on - -* `find -maxdepth 1 -type f` all regular files (including hidden ones) from current directory (without going to sub-directories) -* `find -maxdepth 1 -type f -name '[!.]*'` all regular files (but not hidden ones) from current directory (without going to sub-directories) - * `-not -name '.*'` can be also used -* `find -mindepth 1 -maxdepth 1 -type d` all directories (including hidden ones) in current directory (without going to sub-directories) - -Filtering based on file properties - -* `find -mtime -2` print files that were modified within last two days in current directory - * Note that day here means 24 hours -* `find -mtime +7` print files that were modified more than seven days back in current directory -* `find -daystart -type f -mtime -1` files that were modified from beginning of day (not past 24 hours) -* `find -size +10k` print files with size greater than 10 kilobytes in current directory -* `find -size -1M` print files with size less than 1 megabytes in current directory -* `find -size 2G` print files of size 2 gigabytes in current directory - -Passing filtered files as input to other commands - -* `find report -name '*log*' -exec rm {} \;` delete all filenames containing log in report folder and its sub-folders - * here `rm` command is called for every file matching the search conditions - * since `;` is a special character for shell, it needs to be escaped using `\` -* `find report -name '*log*' -delete` delete all filenames containing log in report folder and its sub-folders -* `find -name '*.txt' -exec wc {} +` list of files ending with txt are all passed together as argument to `wc` command instead of executing wc command for every file - * no need to use escape the `+` character in this case - * also note that number of invocations of command specified is not necessarily once if number of files found is too large -* `find -name '*.log' -exec mv {} ../log/ \;` move files ending with .log to log directory present in one hierarchy above. `mv` is executed once per each filtered file -* `find -name '*.log' -exec mv -t ../log/ {} +` the `-t` option allows to specify target directory and then provide multiple files to be moved as argument - * Similarly, one can use `-t` for `cp` command - -**Further Reading** - -* [using find](https://mywiki.wooledge.org/UsingFind) -* [Collection of find examples](https://alvinalexander.com/unix/edu/examples/find.shtml) -* [find Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/find?sort=votes&pageSize=15) -* [find and tar example](https://unix.stackexchange.com/questions/282762/find-mtime-1-print-xargs-tar-archives-all-files-from-directory-ignoring-t/282885#282885) -* [find Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/find?sort=votes&pageSize=15) -* [Why is looping over find's output bad practice?](https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-output-bad-practice) - -
- -### locate - ->find files by name - -Faster alternative to `find` command when searching for a file by its name. It is based on a database, which gets updated by a `cron` job. So, newer files may be not present in results. Use this command if it is available in your distro and you remember some part of filename. Very useful if one has to search entire filesystem in which case `find` command might take a very long time compared to `locate` - -**Examples** - -* `locate 'power'` print path of files containing power in the whole filesystem - * matches anywhere in path, ex: '/home/learnbyexample/lowpower_adder/result.log' and '/home/learnbyexample/power.log' are both a valid match - * implicitly, `locate` would change the string to `*power*` as no globbing characters are present in the string specified -* `locate -b '\power.log'` print path matching the string power.log exactly at end of path - * '/home/learnbyexample/power.log' matches but not '/home/learnbyexample/lowpower.log' - * since globbing character '\' is used while specifying search string, it doesn't get implicitly replaced by `*power.log*` -* `locate -b '\proj_adder'` the `-b` option also comes in handy to print only the path of directory name, otherwise every file under that folder would also be displayed -* [find vs locate - pros and cons](https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-each-other) - -
- -### wc - ->print newline, word, and byte counts for each file - -**Examples** - -```bash -$ # by default, gives newline/word/byte count (in that order) -$ wc sample.txt - 5 17 78 sample.txt - -$ # options to get only newline/word/byte count -$ wc -l sample.txt -5 sample.txt -$ wc -w sample.txt -17 sample.txt -$ wc -c sample.txt -78 sample.txt - -$ # use shell input redirection if filename is not needed -$ wc -l < sample.txt -5 -``` - -* multiple file input - -```bash -$ # automatically displays total at end -$ wc *.txt - 5 10 57 fruits.txt - 2 6 32 greeting.txt - 5 17 78 sample.txt - 12 33 167 total -``` - -* other options - -```bash -$ # use -L to get length of longest line -$ # won't count non-printable characters, tabs are converted to equivalent spaces -$ wc -L < sample.txt -24 -$ printf 'foo\tbar\0baz' | wc -L -14 -$ printf 'foo\tbar\0baz' | awk '{print length()}' -11 - -$ # -c gives byte count, -m gives character count -$ printf 'hi👍' | wc -m -3 -$ printf 'hi👍' | wc -c -6 -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [wc from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#wc) -* [wc Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/wc?sort=votes&pageSize=15) -* [wc Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/wc?sort=votes&pageSize=15) - -
- -### du - ->estimate file space usage - -**Examples** - -```bash -$ # By default, size is given in size of 1024 bytes -$ # Files are ignored, all directories and sub-directories are recursively reported -$ # add -a option if files are also needed and -L if links should be dereferenced -$ du -17920 ./projs/full_addr -14316 ./projs/half_addr -32952 ./projs -33880 . - -$ # use -s to show total directory size without descending into sub-directories -$ # add -c to also show total size at end -$ du -s projs words.txt -32952 projs -924 words.txt -``` - -* different size formatting options - -```bash -$ # number of bytes -$ du -b words.txt -938848 words.txt - -$ # kilobytes = 1024 bytes -$ du -sk projs -32952 projs - -$ # megabytes = 1024 kilobytes -$ du -sm projs -33 projs - -$ # human readable, use --si for powers of 1000 instead of 1024 -$ du -h words.txt -924K words.txt - -$ # sorting -$ du -sh projs/* words.txt | sort -h -712K projs/report.log -924K words.txt -14M projs/half_addr -18M projs/full_addr -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [du from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#du) -* [du Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/disk-usage?sort=votes&pageSize=15) -* [du Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/du?sort=votes&pageSize=15) - -
- -### df - ->report file system disk space usage - -**Examples** - -```bash -$ # use df without arguments to get information on all currently mounted file systems -$ df . -Filesystem 1K-blocks Used Available Use% Mounted on -/dev/sda1 98298500 58563816 34734748 63% / - -$ # use -B option for custom size -$ # use --si for size in powers of 1000 instead of 1024 -$ df -h . -Filesystem Size Used Avail Use% Mounted on -/dev/sda1 94G 56G 34G 63% / -``` - -* Use `--output` to report only specific fields of interest - -```bash -$ df -h --output=size,used,file / /media/learnbyexample/projs - Size Used File - 94G 56G / - 92G 35G /media/learnbyexample/projs - -$ df -h --output=pcent . -Use% - 63% - -$ df -h --output=pcent,fstype | awk -F'%' 'NR>2 && $1>=40' - 63% ext3 - 40% ext4 - 51% ext4 -``` - - -**Further Reading** - -* For more detailed examples and discussion, see section [df from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#df) -* [df Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/df?sort=votes&pageSize=15) - -
- -### touch - ->change file timestamps - -**Examples** - -```bash -$ # last access and modification time -$ stat -c $'%x\n%y' fruits.txt -2017-07-19 17:06:01.523308599 +0530 -2017-07-13 13:54:03.576055933 +0530 - -$ # Updating both access and modification timestamp to current time -$ # add -a to change only access timestamp and -m to change only modification -$ touch fruits.txt -$ stat -c $'%x\n%y' fruits.txt -2017-07-21 10:11:44.241921229 +0530 -2017-07-21 10:11:44.241921229 +0530 - -$ # copy both access and modification timestamp from power.log to report.log -$ # add -a or -m as needed -$ # See also -d and -t options -$ touch -r power.log report.log -``` - -* If file doesn't exist, an empty one gets created unless -c is used - -```bash -$ ls foo.txt -ls: cannot access 'foo.txt': No such file or directory - -$ touch foo.txt -$ ls foo.txt -foo.txt -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [touch from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#touch) -* [touch Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/touch?sort=votes&pageSize=15) - -
- -### file - ->determine file type - -**Examples** - -```bash -$ file sample.txt -sample.txt: ASCII text -$ printf 'hi👍\n' | file - -/dev/stdin: UTF-8 Unicode text -$ file ch -ch: Bourne-Again shell script, ASCII text executable - -$ printf 'hi\r\n' | file - -/dev/stdin: ASCII text, with CRLF line terminators - -$ file sunset.jpg moon.png -sunset.jpg: JPEG image data -moon.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced -``` - -* find all files of particular type in current directory, for example `image` files - -```bash -$ find -type f -exec bash -c '(file -b "$0" | grep -wq "image data") && echo "$0"' {} \; -./sunset.jpg -./moon.png - -$ # if filenames do not contain : or newline characters -$ find -type f -exec file {} + | awk -F: '/\/{print $1}' -./sunset.jpg -./moon.png -``` - -**Further Reading** - -* For more detailed examples and discussion, see section [file from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/file_attributes.md#file) -* See also `identify` command which `describes the format and characteristics of one or more image files` - -
- -### basename - ->strip directory and suffix from filenames - -**Examples** - -```bash -$ # same as using pwd command -$ echo "$PWD" -/home/learnbyexample - -$ basename "$PWD" -learnbyexample - -$ # use -a option if there are multiple arguments -$ basename -a foo/a/report.log bar/y/power.log -report.log -power.log - -$ # use single quotes if arguments contain space and other special shell characters -$ # use suffix option -s to strip file extension from filename -$ basename -s '.log' '/home/learnbyexample/proj adder/power.log' -power -$ # -a is implied when using -s option -$ basename -s'.log' foo/a/report.log bar/y/power.log -report -power -``` - -* For more detailed examples and discussion, see section [basename from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/miscellaneous.md#basename) - -
- -### dirname - ->strip last component from file name - -**Examples** - -```bash -$ echo "$PWD" -/home/learnbyexample - -$ dirname "$PWD" -/home - -$ # use single quotes if arguments contain space and other special shell characters -$ dirname '/home/learnbyexample/proj adder/power.log' -/home/learnbyexample/proj adder - -$ # unlike basename, by default dirname handles multiple arguments -$ dirname foo/a/report.log bar/y/power.log -foo/a -bar/y - -$ # if no / in argument, output is . to indicate current directory -$ dirname power.log -. -``` - -* For more detailed examples and discussion, see section [dirname from command line text processing repo](https://github.com/learnbyexample/Command-line-text-processing/blob/master/miscellaneous.md#dirname) - -
- -### chmod - ->change file mode bits - -```bash -$ ls -l sample.txt --rw-rw-r-- 1 learnbyexample learnbyexample 111 May 25 14:47 sample.txt -``` - -In the output of `ls -l` command, the first 10 characters displayed are related to type of file and its permissions. - -First character indicates the **file type** The most common are - -* `-` regular file -* `d` directory -* `l` symbolic link -* for complete list, see `-l` option in `info ls` - -The other 9 characters represent three sets of **file permissions** for 'user', 'group' and 'others' - in that order - -* `user` file properties for owner of file - `u` -* `group` file properties for the group the file belongs to - `g` -* `others` file properties for everyone else - `o` - -We'll be seeing only `rwx` file properties in this section, for other types of properties, [refer this detailed doc](https://www.mkssoftware.com/docs/man1/ls.1.asp#Long_Output_Format) - -**Permission characters and values** - -| Character | Meaning | Value | File | Directory | -| ------- | ------- | ------- | ------- | ------ | -| r | read | 4 | file can be read | can see contents of directory | -| w | write | 2 | file can be modified | can add/remove files in directory | -| x | execute | 1 | file can be run as a program | can access contents of directory | -| - | no permission | 0 | permission is disabled | permission is disabled | - -**File Permissions** - -```bash -$ pwd -/home/learnbyexample/linux_tutorial -$ ls -lF -total 8 --rw-rw-r-- 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl --rw-rw-r-- 1 learnbyexample learnbyexample 111 May 25 14:47 sample.txt - -$ #Files need execute permission to be run as program -$ ./hello_world.pl -bash: ./hello_world.pl: Permission denied -$ chmod +x hello_world.pl -$ ls -lF hello_world.pl --rwxrwxr-x 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl* -$ ./hello_world.pl -Hello World - -$ #Read permission -$ cat sample.txt -This is an example of adding text to a new file using cat command. -Press Ctrl+d on a newline to save and quit. -$ chmod -r sample.txt -$ ls -lF sample.txt ---w--w---- 1 learnbyexample learnbyexample 111 May 25 14:47 sample.txt -$ cat sample.txt -cat: sample.txt: Permission denied - -$ #Files need write permission to modify its content -$ cat >> sample.txt -Adding a line of text at end of file -^C -$ cat sample.txt -cat: sample.txt: Permission denied -$ chmod +r sample.txt -$ ls -lF sample.txt --rw-rw-r-- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt -$ cat sample.txt -This is an example of adding text to a new file using cat command. -Press Ctrl+d on a newline to save and quit. -Adding a line of text at end of file -$ chmod -w sample.txt -$ ls -lF sample.txt --r--r--r-- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt -$ cat >> sample.txt -bash: sample.txt: Permission denied -``` - -**Directory Permissions** - -```bash -$ ls -ld linux_tutorial/ -drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ - -$ #Read Permission -$ ls linux_tutorial/ -hello_world.pl sample.txt -$ chmod -r linux_tutorial/ -$ ls -ld linux_tutorial/ -d-wx-wx--x 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ -$ ls linux_tutorial/ -ls: cannot open directory linux_tutorial/: Permission denied -$ chmod +r linux_tutorial/ - -$ #Execute Permission -$ chmod -x linux_tutorial/ -$ ls -ld linux_tutorial/ -drw-rw-r-- 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ -$ ls linux_tutorial/ -ls: cannot access linux_tutorial/hello_world.pl: Permission denied -ls: cannot access linux_tutorial/sample.txt: Permission denied -hello_world.pl sample.txt -$ chmod +x linux_tutorial/ - -$ #Write Permission -$ chmod -w linux_tutorial/ -$ ls -ld linux_tutorial/ -dr-xr-xr-x 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ -$ touch linux_tutorial/new_file.txt -touch: cannot touch ‘linux_tutorial/new_file.txt’: Permission denied -$ chmod +w linux_tutorial/ -$ ls -ld linux_tutorial/ -drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 10:59 linux_tutorial/ -$ touch linux_tutorial/new_file.txt -$ ls linux_tutorial/ -hello_world.pl new_file.txt sample.txt -``` - -**Changing multiple permissions at once** - -```bash -$ # r(4) + w(2) + 0 = 6 -$ # r(4) + 0 + 0 = 4 -$ chmod 664 sample.txt -$ ls -lF sample.txt --rw-rw-r-- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt - -$ # r(4) + w(2) + x(1) = 7 -$ # r(4) + 0 + x(1) = 5 -$ chmod 755 hello_world.pl -$ ls -lF hello_world.pl --rwxr-xr-x 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl* - -$ chmod 775 report/ -$ ls -ld report/ -drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 14:01 report/ -``` - -**Changing single permission selectively** - -```bash -$ chmod o-r sample.txt -$ ls -lF sample.txt --rw-rw---- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt - -$ chmod go-x hello_world.pl -$ ls -lF hello_world.pl --rwxr--r-- 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl* - -$ chmod go+x hello_world.pl -$ ls -lF hello_world.pl --rwxr-xr-x 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl* -``` - -**Recursively changing permission for directory** - -```bash -$ ls -lR linux_tutorial/ -linux_tutorial/: -total 12 --rwxr-xr-x 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl -drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 14:32 report --rw-rw---- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt - -linux_tutorial/report: -total 0 --rw-rw-r-- 1 learnbyexample learnbyexample 0 May 29 11:46 new_file.txt -$ ls -ld linux_tutorial/ -drwxrwxr-x 3 learnbyexample learnbyexample 4096 May 29 14:32 linux_tutorial/ - -$ #adding/removing files to a directory depends only on parent directory permissions -$ chmod -w linux_tutorial/ -$ ls -ld linux_tutorial/ -dr-xr-xr-x 3 learnbyexample learnbyexample 4096 May 29 14:32 linux_tutorial/ -$ ls -ld linux_tutorial/report/ -drwxrwxr-x 2 learnbyexample learnbyexample 4096 May 29 14:32 linux_tutorial/report/ -$ rm linux_tutorial/sample.txt -rm: cannot remove ‘linux_tutorial/sample.txt’: Permission denied -$ touch linux_tutorial/report/power.log -$ ls linux_tutorial/report/ -new_file.txt power.log -$ rm linux_tutorial/report/new_file.txt -$ ls linux_tutorial/report/ -power.log - -$ chmod +w linux_tutorial/ -$ ls -ld linux_tutorial/ -drwxrwxr-x 3 learnbyexample learnbyexample 4096 May 29 14:32 linux_tutorial/ -$ chmod -w -R linux_tutorial/ -$ ls -lR linux_tutorial/ -linux_tutorial/: -total 12 --r-xr-xr-x 1 learnbyexample learnbyexample 40 May 28 13:25 hello_world.pl -dr-xr-xr-x 2 learnbyexample learnbyexample 4096 May 29 14:40 report --r--r----- 1 learnbyexample learnbyexample 148 May 29 11:00 sample.txt - -linux_tutorial/report: -total 0 --r--r--r-- 1 learnbyexample learnbyexample 0 May 29 14:39 power.log -$ rm linux_tutorial/report/power.log -rm: remove write-protected regular empty file ‘linux_tutorial/report/power.log’? y -rm: cannot remove ‘linux_tutorial/report/power.log’: Permission denied -``` - -* What permissions are affected by `+-/rwx` depends on `umask` value as well. It is usually `002` which means - * `+r -r +x -x` without `u g o` qualifier affects all the three categories - * `+w -w` without `u g o` qualifier affects only user and group categories - -**Further Reading** - -* [Linux File Permissions](https://www.linux.com/learn/getting-know-linux-file-permissions) -* [Linux Permissions Primer](https://danielmiessler.com/study/unixlinux_permissions/) -* [unix.stackexchange - Why chmod +w filename not giving write permission to other](https://unix.stackexchange.com/questions/429421/why-chmod-w-filename-not-giving-write-permission-to-othero) -* [chmod Q&A on unix stackexchange](https://unix.stackexchange.com/questions/tagged/chmod?sort=votes&pageSize=15) -* [chmod Q&A on stackoverflow](https://stackoverflow.com/questions/tagged/chmod?sort=votes&pageSize=15) - diff --git a/images/become_a_patron_button.png b/images/become_a_patron_button.png deleted file mode 100644 index 291b7bcf265521a3d062024bc4f7df927ae60e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 S8x99PkF}+}MV*;%;{O2Ee#b2U diff --git a/images/ls_color.png b/images/ls_color.png deleted file mode 100644 index 5a95ebf7ac6efbcc8c15331d706fb0436cd6408a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4091 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 P+dRNf&qTLe+bQNhwZ|}g From 3d443e723375eb772994704319a0ab7561a3f74a Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 18 Jun 2022 14:18:09 +0530 Subject: [PATCH 58/76] added example files --- README.md | 6 +- example_files/scripts/cp.sh | 11 +++ example_files/scripts/du.sh | 14 ++++ example_files/scripts/file.sh | 78 +++++++++++++++++++ example_files/scripts/find.sh | 33 ++++++++ example_files/scripts/ls.sh | 38 +++++++++ example_files/scripts/mv.sh | 12 +++ example_files/scripts/rm.sh | 13 ++++ example_files/scripts/stat.sh | 15 ++++ example_files/scripts/tar.sh | 14 ++++ example_files/scripts/touch.sh | 17 ++++ example_files/shell_scripting/bad_script.sh | 4 + .../shell_scripting/command_line_arguments.sh | 2 + example_files/shell_scripting/for_loop.sh | 3 + example_files/shell_scripting/functions.sh | 28 +++++++ example_files/shell_scripting/greeting.sh | 2 + example_files/shell_scripting/hello.sh | 5 ++ example_files/shell_scripting/if_then_else.sh | 11 +++ example_files/shell_scripting/prev_cmd.sh | 2 + .../shell_scripting/read_file_fields.sh | 3 + .../shell_scripting/read_file_lines.sh | 4 + example_files/shell_scripting/search.sh | 7 ++ example_files/shell_scripting/user_input.sh | 3 + example_files/shell_scripting/while_loop.sh | 5 ++ example_files/text_files/c1.txt | 7 ++ example_files/text_files/c2.txt | 7 ++ example_files/text_files/colors_1.txt | 4 + example_files/text_files/colors_2.txt | 4 + example_files/text_files/f1.txt | 4 + example_files/text_files/f2.txt | 4 + example_files/text_files/file_size.txt | 5 ++ example_files/text_files/fruits.txt | 3 + example_files/text_files/greeting.txt | 2 + example_files/text_files/ip.txt | 3 + example_files/text_files/purchases.txt | 8 ++ example_files/text_files/sample.txt | 15 ++++ example_files/text_files/scores.csv | 4 + example_files/text_files/shopping_feb.txt | 4 + example_files/text_files/shopping_jan.txt | 4 + example_files/text_files/timings.txt | 5 ++ example_files/text_files/uniform.txt | 14 ++++ 41 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 example_files/scripts/cp.sh create mode 100644 example_files/scripts/du.sh create mode 100644 example_files/scripts/file.sh create mode 100644 example_files/scripts/find.sh create mode 100644 example_files/scripts/ls.sh create mode 100644 example_files/scripts/mv.sh create mode 100644 example_files/scripts/rm.sh create mode 100644 example_files/scripts/stat.sh create mode 100644 example_files/scripts/tar.sh create mode 100644 example_files/scripts/touch.sh create mode 100644 example_files/shell_scripting/bad_script.sh create mode 100644 example_files/shell_scripting/command_line_arguments.sh create mode 100644 example_files/shell_scripting/for_loop.sh create mode 100644 example_files/shell_scripting/functions.sh create mode 100644 example_files/shell_scripting/greeting.sh create mode 100644 example_files/shell_scripting/hello.sh create mode 100644 example_files/shell_scripting/if_then_else.sh create mode 100644 example_files/shell_scripting/prev_cmd.sh create mode 100644 example_files/shell_scripting/read_file_fields.sh create mode 100644 example_files/shell_scripting/read_file_lines.sh create mode 100644 example_files/shell_scripting/search.sh create mode 100644 example_files/shell_scripting/user_input.sh create mode 100644 example_files/shell_scripting/while_loop.sh create mode 100644 example_files/text_files/c1.txt create mode 100644 example_files/text_files/c2.txt create mode 100644 example_files/text_files/colors_1.txt create mode 100644 example_files/text_files/colors_2.txt create mode 100644 example_files/text_files/f1.txt create mode 100644 example_files/text_files/f2.txt create mode 100644 example_files/text_files/file_size.txt create mode 100644 example_files/text_files/fruits.txt create mode 100644 example_files/text_files/greeting.txt create mode 100644 example_files/text_files/ip.txt create mode 100644 example_files/text_files/purchases.txt create mode 100644 example_files/text_files/sample.txt create mode 100644 example_files/text_files/scores.csv create mode 100644 example_files/text_files/shopping_feb.txt create mode 100644 example_files/text_files/shopping_jan.txt create mode 100644 example_files/text_files/timings.txt create mode 100644 example_files/text_files/uniform.txt diff --git a/README.md b/README.md index 8f95e6f..aba16fc 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ ⚠️ ⚠️ ⚠️ This is a **work-in-progress** book on Linux command line and Shell Scripting for beginner to intermediate level users. -[Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an earlier version of the book on this repo. +[Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an earlier version of the book in this repo. -See also my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources. +See my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources.
@@ -13,7 +13,7 @@ See also my curated list on [Linux CLI and Shell scripting](https://learnbyexamp For web version of the book, visit https://learnbyexample.github.io/cli-computing/ * Links to pdf/epub versions of the book will be added once they are done -* See https://learnbyexample.github.io/books/ for list of other books +* See https://learnbyexample.github.io/books/ for a list of my other books
diff --git a/example_files/scripts/cp.sh b/example_files/scripts/cp.sh new file mode 100644 index 0000000..cf05759 --- /dev/null +++ b/example_files/scripts/cp.sh @@ -0,0 +1,11 @@ +dir_name='cp_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p backups/reports reference +echo 'apple banana cherry' > backups/ip.txt +touch backups/reports/jan.log diff --git a/example_files/scripts/du.sh b/example_files/scripts/du.sh new file mode 100644 index 0000000..a86fa27 --- /dev/null +++ b/example_files/scripts/du.sh @@ -0,0 +1,14 @@ +dir_name='du_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p projects/scripts todos + + report.log + projects/errors.log + projects/scripts/calc.sh + todos/books.txt diff --git a/example_files/scripts/file.sh b/example_files/scripts/file.sh new file mode 100644 index 0000000..5b3332f --- /dev/null +++ b/example_files/scripts/file.sh @@ -0,0 +1,78 @@ +dir_name='file_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +printf 'long\nshot\n' > ip.txt + +printf '#!/bin/bash\n\necho hi\n' > hi.sh +chmod +x hi.sh + +echo 'iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAMAAADwSaEZAAADAFBMVEX///8cI4AdJIA0TryopsIe +JIHCw9z/5Vh9WFYjJIY0KJMgJIMnJYn/7otmhCT/5lvc4fSddWCXpTuig5c0Srj/7oY0RrM0Qa80 +SLb/6Gc0RLHo4eI0Oqc0QKwwJ5AuJo7/6W7/63crJot0UlSSksL/6nP///7/7YL//e7/++f/983/ +/vWkjaP/4VX/5l41LJhIR5pUPU5qS1L+7o+jh53/6305OoSZlMqPnEORn0E1MJv/52JgfDJCRZRL +TIexdENSSqKNmUanmLE1PqkpK4U7Q50vMIVkgSj/8rH/9br/8aD/+dmWlMZuU2iopL+mnLX//vtK +WFWFkU2jgpL/0EP/2Fb89OiNhpH/8alifiz46ZH/7pbRxZXm23qBjVKVoj2aothrSkQiISGam9H/ +1Uu1scfTztZUacZEPplbWYs1N6M4R61FWIL/9L//9cf++OBdeED/9tRuaZRAPI9SZkVUYl9XbD6l +bkg3OJc6OppDVrpPS5z/5G9UX7vv4ZFNZG5WcFBKXI41M595hWBtfWhUVrI0OnNUT6nSy1X/4nZY +Wnl5VVNYPjqCYm6TZE3s6t3/206hk6fp6eSsqsS8spM8VajZzZRCQKA7SWAyO25kZIf/98NFR4G7 +vU9fYnGKlUhtc15yeVnGyuWHXVKPYUz4+fwxKSfu8Pne4e6RZ12CfZV+eLXPlVP/3V++uM307eaw +g17b09csMnc4UbT/32pAVZsxMZFlYJZZZYDEupHY0XRDQIZbczdzfWGirUGwtkpCSGpUZUk9Liyg +q95ASaTX1eB1gslwX4JWTpJ3bZSllKzs0bn/8Xb463aWkX3WwcDn2pL549exp5aroro6SZ9le09S +THm+ubCjmphhcXt4dIo+TpFmc3OelZHt21qJiKTm47erm6ZFRY1IUGjj1Vf55GVna2S3dz+AV0lb +YKRUOzd3g8l3hMq6prWNnNjTtbH46Zzhuq1oYa2xn7J8en3ywVfUpFv81oainHt2c33opkzt577h +1ZNlht2PkGrd1GEc7EGzAAAGeElEQVRYw+3Xd1gTZxwH8FNij5DcRQ8DBrAm0Vwm0TaEJiaASSAE +ohIiexbKkCVbBS27VFDqFhEE3HvvrbWPda86Hveodu+92/cuKChtLn36Xx++f9ybvC/3ed7fe++b +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' | \ + base64 --decode > moon.png + +echo '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf +IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 +Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABMAEwDASIA +AhEBAxEB/8QAGwABAAIDAQEAAAAAAAAAAAAAAAQFAQIDBgf/xAAyEAABAwIEAggFBQEAAAAAAAAB +AAIDBBEFEiExBkETFBZRVZGT0hVCUmGBIiNxgrKh/8QAGgEBAAMBAQEAAAAAAAAAAAAAAAEDBQQC +Bv/EACgRAAICAQMBBwUAAAAAAAAAAAABAgMRBBIhkQUiQlFSYYEUFUHR8P/aAAwDAQACEQMRAD8A ++zIiIAiIgCwsOe1lszgLmwvzK2UZQCIikBERAEREBznmbTxGVwJa3ewUDEqodSbU08gOR4NwVmqx +RlM90VTTvDToCNQQvPhjqipkipZD0DtXE8gsPX69QThF5z1TO7T0bu9LjHQscRxZk0VK+M65szh3 +EKRJiIqsQgpoXfoBDnEHfmoLMLpmts4Oee8uK4zUT6XNPSPdcDUE62+xWPHtK3c3L84z8fs6VVS+ +6vc9N1uHrAgDs0h5DW38ruvNYTX0tJEXvLpJn72Gy9BTzOniDzG6O+wduvpdHq1fHLfPl5GfdS63 +g6oiLvKDC1lkEUTpHbALdQ8UeI8PkedgW/6Ch5xwM45K2ur56mIxiiBB+rVR8OgfDAc8Za5ziSLL +p8QtsSthiLOcixr+zHdLdOTb/vYtjrYqOxLB017j5LNj3HyWra8OOhPksurHDbX8rm+zQ82PqyDS +RS0dY+QUXStzHKTyV/SVvWDldC6J1tjzVWa2T6f+regqzNiUbCflctHSaSWn4i+Pgi3VK18rkvER +FpFYVZxFKIMDqJD8uX/QVmqniakqa7h+qp6SPpZ35crLgXs4Hc6bBeoY3LJXZnY8HiziQJ1cSO4l +YOIC+ht+VG7McS+Fv9aP3J2Y4l8Lf60fuWtsp9SMDN/pfQk/Ejze7zXVmLMj1AcT93KD2Y4l8Lf6 +0fuTsxxL4W/1o/codVD8SJUtQvC+hLkxQP2Fv7Eqy4aq+mx2Jt7/ALb1RdmOJfC3+tH7lccKYHjV +DjsdRW0LoYWxuBcZGHU7bEquyFSg9rRbQ7nat0We8REWYboREQBERAEREAREQBERAf/Z' | \ + base64 --decode > sunrise.jpg + diff --git a/example_files/scripts/find.sh b/example_files/scripts/find.sh new file mode 100644 index 0000000..4e03f2e --- /dev/null +++ b/example_files/scripts/find.sh @@ -0,0 +1,33 @@ +dir_name='find_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p backups/dot_files projects/{.venv,tictactoe,calculator} todos +ln -s ../../scripts + +printf 'long\nshot\n' > ip.txt +touch -a -d "$(date '+%Y-%m-%d %H:%M:%S' -d '-1 days')" ip.txt + +printf '#!/usr/bin/python3\n\nprint("Hello World!")\n' > hello_world.py + +printf '#!/bin/bash\n\necho hi\n' > hi.sh +touch -d "$(date '+%Y-%m-%d %H:%M:%S' -d '-10 days')" hi.sh + +echo 'ghost' > .hidden +touch -d '2018-12-21 22:33:44' .hidden + + report.log + errors.log +touch -d '2022-01-01 01:01:01' report.log +touch -d '2022-01-01 03:30:33' errors.log + +touch backups/bookmarks.html backups/{jan,aug}.log +touch backups/dot_files/{.bashrc,.inputrc,.vimrc} +touch projects/tictactoe/game.py projects/calculator/calc.sh +touch todos/{books,TRIP,wow}.txt + +chmod +x hello_world.py hi.sh diff --git a/example_files/scripts/ls.sh b/example_files/scripts/ls.sh new file mode 100644 index 0000000..d2850e5 --- /dev/null +++ b/example_files/scripts/ls.sh @@ -0,0 +1,38 @@ +dir_name='ls_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p backups/dot_files projects/{tictactoe,calculator} todos +ln -s ../../scripts + +printf 'long\nshot\n' > ip.txt +touch -d '2017-07-21 10:11:44' ip.txt + +printf '#!/usr/bin/python3\n\nprint("Hello World!")\n' > hello_world.py +touch -d '2020-02-29 20:20:20' hello_world.py + +printf '#!/bin/bash\n\necho hi\n' > hi +touch -d '2019-12-05 15:10:05' hi + +echo 'ghost' > .hidden +touch -d '2018-12-21 22:33:44' .hidden + + report.log + errors.log +touch -d '2022-01-01 01:01:01' report.log +touch -d '2022-01-01 03:30:33' errors.log + +touch backups/bookmarks.html backups/dot_files/{.bashrc,.inputrc,.vimrc} +touch projects/tictactoe/game.py projects/calculator/calc.sh +touch todos/{books,outing}.txt + +touch -d '2022-02-04 09:23:25' backups +touch -d '2022-03-05 11:21:27' projects +touch -d '2022-04-06 13:19:29' todos +touch -hd '2022-05-07 15:17:31' scripts + +chmod +x hello_world.py hi diff --git a/example_files/scripts/mv.sh b/example_files/scripts/mv.sh new file mode 100644 index 0000000..e91a11a --- /dev/null +++ b/example_files/scripts/mv.sh @@ -0,0 +1,12 @@ +dir_name='mv_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p backups/projects dot_files manuals +touch hello.py loops.py ip.txt +touch backups/projects/game.py manuals/mv.info + diff --git a/example_files/scripts/rm.sh b/example_files/scripts/rm.sh new file mode 100644 index 0000000..97d39d3 --- /dev/null +++ b/example_files/scripts/rm.sh @@ -0,0 +1,13 @@ +dir_name='rm_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p reports projects/{tictactoe,calculator} empty_dir +touch hello.py loops.py read_only.txt reports/jan.log +touch projects/tictactoe/game.py projects/calculator/calc.sh +chmod -w read_only.txt + diff --git a/example_files/scripts/stat.sh b/example_files/scripts/stat.sh new file mode 100644 index 0000000..f4ee313 --- /dev/null +++ b/example_files/scripts/stat.sh @@ -0,0 +1,15 @@ +dir_name='stat_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +printf 'long\nshot\n' > ip.txt +touch -a -d '2022-06-01 13:25:18.693823117' ip.txt +touch -m -d '2022-05-24 14:39:41.285714934' ip.txt + +ln -s /usr/share/dict/words words.txt + +printf '#!/bin/bash\n\necho hi\n' > hi.sh diff --git a/example_files/scripts/tar.sh b/example_files/scripts/tar.sh new file mode 100644 index 0000000..25aa20c --- /dev/null +++ b/example_files/scripts/tar.sh @@ -0,0 +1,14 @@ +dir_name='tar_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p projects/scripts todos + + report.log + projects/errors.log + projects/scripts/calc.sh + todos/books.txt diff --git a/example_files/scripts/touch.sh b/example_files/scripts/touch.sh new file mode 100644 index 0000000..599432c --- /dev/null +++ b/example_files/scripts/touch.sh @@ -0,0 +1,17 @@ +dir_name='touch_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +printf 'apple\nbanana\ncherry\n' > fruits.txt +touch -a -d '2017-07-19 17:06:01.523308599' fruits.txt +touch -m -d '2017-07-13 13:54:03.576055933' fruits.txt + +printf 'long\nshot\n' > ip.txt +touch -a -d '2022-06-01 13:25:18.693823117' ip.txt +touch -m -d '2022-05-24 14:39:41.285714934' ip.txt + +printf '#!/bin/bash\n\necho hi\n' > hi.sh diff --git a/example_files/shell_scripting/bad_script.sh b/example_files/shell_scripting/bad_script.sh new file mode 100644 index 0000000..b579cfd --- /dev/null +++ b/example_files/shell_scripting/bad_script.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +greeting = 'hello world' +echo "$greeting" diff --git a/example_files/shell_scripting/command_line_arguments.sh b/example_files/shell_scripting/command_line_arguments.sh new file mode 100644 index 0000000..7f13a58 --- /dev/null +++ b/example_files/shell_scripting/command_line_arguments.sh @@ -0,0 +1,2 @@ +echo "No. of lines in '$1' is $(wc -l < "$1")" +echo "No. of lines in '$2' is $(wc -l < "$2")" diff --git a/example_files/shell_scripting/for_loop.sh b/example_files/shell_scripting/for_loop.sh new file mode 100644 index 0000000..b1f6487 --- /dev/null +++ b/example_files/shell_scripting/for_loop.sh @@ -0,0 +1,3 @@ +for file in "$@"; do + echo mv "$file" "$file.bkp" +done diff --git a/example_files/shell_scripting/functions.sh b/example_files/shell_scripting/functions.sh new file mode 100644 index 0000000..912ec67 --- /dev/null +++ b/example_files/shell_scripting/functions.sh @@ -0,0 +1,28 @@ +add_border () +{ + size='10' + color='grey' + if (( $# == 1 )) ; then + ip="$1" + elif (( $# == 2 )) ; then + if [[ $1 =~ ^[0-9]+$ ]] ; then + size="$1" + else + color="$1" + fi + ip="$2" + else + size="$1" + color="$2" + ip="$3" + fi + + op="${ip%.*}_border.${ip##*.}" + echo convert -border "$size" -bordercolor "$color" "$ip" "$op" +} + +add_border flower.png +add_border 5 insect.png +add_border red lake.png +add_border 20 blue sky.png + diff --git a/example_files/shell_scripting/greeting.sh b/example_files/shell_scripting/greeting.sh new file mode 100644 index 0000000..662f03f --- /dev/null +++ b/example_files/shell_scripting/greeting.sh @@ -0,0 +1,2 @@ +echo 'hello' +echo 'have a nice day' diff --git a/example_files/shell_scripting/hello.sh b/example_files/shell_scripting/hello.sh new file mode 100644 index 0000000..d884b28 --- /dev/null +++ b/example_files/shell_scripting/hello.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo "Hello $USER" +echo "Today is $(date -u +%A)" +echo 'Have a nice day' diff --git a/example_files/shell_scripting/if_then_else.sh b/example_files/shell_scripting/if_then_else.sh new file mode 100644 index 0000000..6aeee15 --- /dev/null +++ b/example_files/shell_scripting/if_then_else.sh @@ -0,0 +1,11 @@ +if (( $# != 1 )) ; then + echo 'Error! One file argument expected.' 1>&2 + exit 1 +else + if [[ ! -f $1 ]] ; then + echo "Error! '$1' is not a valid file" 1>&2 + exit 1 + else + echo "No. of lines in '$1' is $(wc -l < "$1")" + fi +fi diff --git a/example_files/shell_scripting/prev_cmd.sh b/example_files/shell_scripting/prev_cmd.sh new file mode 100644 index 0000000..ee2d997 --- /dev/null +++ b/example_files/shell_scripting/prev_cmd.sh @@ -0,0 +1,2 @@ +prev=$(fc -ln -2 | sed 's/^\s*//; q') +echo "$prev" diff --git a/example_files/shell_scripting/read_file_fields.sh b/example_files/shell_scripting/read_file_fields.sh new file mode 100644 index 0000000..f1ae381 --- /dev/null +++ b/example_files/shell_scripting/read_file_fields.sh @@ -0,0 +1,3 @@ +while IFS=' : ' read -r field1 field2; do + echo "$field2,$field1" +done < "$1" diff --git a/example_files/shell_scripting/read_file_lines.sh b/example_files/shell_scripting/read_file_lines.sh new file mode 100644 index 0000000..efb2f8e --- /dev/null +++ b/example_files/shell_scripting/read_file_lines.sh @@ -0,0 +1,4 @@ +while IFS= read -r line; do + # do something with each line + echo "$line" +done < "$1" diff --git a/example_files/shell_scripting/search.sh b/example_files/shell_scripting/search.sh new file mode 100644 index 0000000..49a9bde --- /dev/null +++ b/example_files/shell_scripting/search.sh @@ -0,0 +1,7 @@ +read -p 'Enter a search pattern: ' search + +if grep -q "$search" hello.sh ; then + echo "match found" +else + echo "match not found" +fi diff --git a/example_files/shell_scripting/user_input.sh b/example_files/shell_scripting/user_input.sh new file mode 100644 index 0000000..806960c --- /dev/null +++ b/example_files/shell_scripting/user_input.sh @@ -0,0 +1,3 @@ +read -p 'Enter two integers separated by spaces: ' num1 num2 +sum=$(( num1 + num2 )) +echo "$num1 + $num2 = $sum" diff --git a/example_files/shell_scripting/while_loop.sh b/example_files/shell_scripting/while_loop.sh new file mode 100644 index 0000000..c803c88 --- /dev/null +++ b/example_files/shell_scripting/while_loop.sh @@ -0,0 +1,5 @@ +i="$1" +while (( i > 0 )) ; do + echo "$i" + (( i-- )) +done diff --git a/example_files/text_files/c1.txt b/example_files/text_files/c1.txt new file mode 100644 index 0000000..cbe0d28 --- /dev/null +++ b/example_files/text_files/c1.txt @@ -0,0 +1,7 @@ +Blue +Brown +Orange +Purple +Red +Teal +White diff --git a/example_files/text_files/c2.txt b/example_files/text_files/c2.txt new file mode 100644 index 0000000..b045096 --- /dev/null +++ b/example_files/text_files/c2.txt @@ -0,0 +1,7 @@ +Black +Blue +Green +Orange +Pink +Red +White diff --git a/example_files/text_files/colors_1.txt b/example_files/text_files/colors_1.txt new file mode 100644 index 0000000..47a232c --- /dev/null +++ b/example_files/text_files/colors_1.txt @@ -0,0 +1,4 @@ +Blue +Brown +Orange +Purple diff --git a/example_files/text_files/colors_2.txt b/example_files/text_files/colors_2.txt new file mode 100644 index 0000000..ae390be --- /dev/null +++ b/example_files/text_files/colors_2.txt @@ -0,0 +1,4 @@ +Black +Blue +Green +Orange diff --git a/example_files/text_files/f1.txt b/example_files/text_files/f1.txt new file mode 100644 index 0000000..50bdfe2 --- /dev/null +++ b/example_files/text_files/f1.txt @@ -0,0 +1,4 @@ +1 +2 +3 +world diff --git a/example_files/text_files/f2.txt b/example_files/text_files/f2.txt new file mode 100644 index 0000000..f9fe683 --- /dev/null +++ b/example_files/text_files/f2.txt @@ -0,0 +1,4 @@ +1 +hello +3 +4 diff --git a/example_files/text_files/file_size.txt b/example_files/text_files/file_size.txt new file mode 100644 index 0000000..95d5d8c --- /dev/null +++ b/example_files/text_files/file_size.txt @@ -0,0 +1,5 @@ +104K power.log +316M projects +746K report.log +20K sample.txt +1.4G games diff --git a/example_files/text_files/fruits.txt b/example_files/text_files/fruits.txt new file mode 100644 index 0000000..9d5887f --- /dev/null +++ b/example_files/text_files/fruits.txt @@ -0,0 +1,3 @@ +banana +papaya +mango diff --git a/example_files/text_files/greeting.txt b/example_files/text_files/greeting.txt new file mode 100644 index 0000000..8b44ccd --- /dev/null +++ b/example_files/text_files/greeting.txt @@ -0,0 +1,2 @@ +Hi there +Have a nice day diff --git a/example_files/text_files/ip.txt b/example_files/text_files/ip.txt new file mode 100644 index 0000000..e84275e --- /dev/null +++ b/example_files/text_files/ip.txt @@ -0,0 +1,3 @@ +deep blue +light orange +blue delight diff --git a/example_files/text_files/purchases.txt b/example_files/text_files/purchases.txt new file mode 100644 index 0000000..0d0e6a4 --- /dev/null +++ b/example_files/text_files/purchases.txt @@ -0,0 +1,8 @@ +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea diff --git a/example_files/text_files/sample.txt b/example_files/text_files/sample.txt new file mode 100644 index 0000000..ed94ff9 --- /dev/null +++ b/example_files/text_files/sample.txt @@ -0,0 +1,15 @@ + 1) Hello World + 2) + 3) Hi there + 4) How are you + 5) + 6) Just do-it + 7) Believe it + 8) + 9) banana +10) papaya +11) mango +12) +13) Much ado about nothing +14) He he he +15) Adios amigo diff --git a/example_files/text_files/scores.csv b/example_files/text_files/scores.csv new file mode 100644 index 0000000..04437c7 --- /dev/null +++ b/example_files/text_files/scores.csv @@ -0,0 +1,4 @@ +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 diff --git a/example_files/text_files/shopping_feb.txt b/example_files/text_files/shopping_feb.txt new file mode 100644 index 0000000..374573f --- /dev/null +++ b/example_files/text_files/shopping_feb.txt @@ -0,0 +1,4 @@ +banana 15 +fig 100 +pen 2 +soap 1 diff --git a/example_files/text_files/shopping_jan.txt b/example_files/text_files/shopping_jan.txt new file mode 100644 index 0000000..5c19410 --- /dev/null +++ b/example_files/text_files/shopping_jan.txt @@ -0,0 +1,4 @@ +apple 10 +banana 20 +soap 3 +tshirt 3 diff --git a/example_files/text_files/timings.txt b/example_files/text_files/timings.txt new file mode 100644 index 0000000..3898b16 --- /dev/null +++ b/example_files/text_files/timings.txt @@ -0,0 +1,5 @@ +5m35.363s +3m20.058s +4m11.130s +3m42.833s +4m3.083s diff --git a/example_files/text_files/uniform.txt b/example_files/text_files/uniform.txt new file mode 100644 index 0000000..fc17b7a --- /dev/null +++ b/example_files/text_files/uniform.txt @@ -0,0 +1,14 @@ +mango +icecream +--start 1-- +1234 +6789 +**end 1** +how are you +have a nice day +--start 2-- +a +b +c +**end 2** +par,far,mar,tar From aa6f8a9e5d69932bc45514b5bc95db762a2a0be2 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 23 Jun 2022 16:19:30 +0530 Subject: [PATCH 59/76] added script for globs section --- example_files/scripts/globs.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 example_files/scripts/globs.sh diff --git a/example_files/scripts/globs.sh b/example_files/scripts/globs.sh new file mode 100644 index 0000000..beeeecf --- /dev/null +++ b/example_files/scripts/globs.sh @@ -0,0 +1,14 @@ +dir_name='globs_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +touch ip.txt notes.txt 42.txt +touch f1.txt f2.txt f2_old.txt f4.txt f7.txt +touch report-{98,0{0,2,4}}.log +touch calc.py hello.py hi.sh 100.sh +touch main.c math.h +touch .hidden .somerc From b04fdf4ccddd1ec122e912c83842962d03253d85 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 18 Jul 2022 13:58:59 +0530 Subject: [PATCH 60/76] updated shell scripts --- example_files/shell_scripting/comments.sh | 2 ++ example_files/shell_scripting/if_then_else.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 example_files/shell_scripting/comments.sh diff --git a/example_files/shell_scripting/comments.sh b/example_files/shell_scripting/comments.sh new file mode 100644 index 0000000..d8bf8a9 --- /dev/null +++ b/example_files/shell_scripting/comments.sh @@ -0,0 +1,2 @@ +# this is a comment on its own line +echo 'hello' # and this is a comment after a command diff --git a/example_files/shell_scripting/if_then_else.sh b/example_files/shell_scripting/if_then_else.sh index 6aeee15..7165d76 100644 --- a/example_files/shell_scripting/if_then_else.sh +++ b/example_files/shell_scripting/if_then_else.sh @@ -3,7 +3,7 @@ if (( $# != 1 )) ; then exit 1 else if [[ ! -f $1 ]] ; then - echo "Error! '$1' is not a valid file" 1>&2 + printf 'Error! %q is not a valid file\n' "$1" 1>&2 exit 1 else echo "No. of lines in '$1' is $(wc -l < "$1")" From 3488583ed8b456b3ddc9c3e3817f8a31ecd75dd1 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 19 Jul 2022 12:34:58 +0530 Subject: [PATCH 61/76] updated command used for file reading example --- example_files/shell_scripting/read_file_lines.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_files/shell_scripting/read_file_lines.sh b/example_files/shell_scripting/read_file_lines.sh index efb2f8e..5a815c9 100644 --- a/example_files/shell_scripting/read_file_lines.sh +++ b/example_files/shell_scripting/read_file_lines.sh @@ -1,4 +1,4 @@ while IFS= read -r line; do # do something with each line - echo "$line" + wc -l "$line" done < "$1" From 8c66616066ecd861bf3554676246acf12296acda Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 13 Aug 2022 15:26:12 +0530 Subject: [PATCH 62/76] added script for grep section --- example_files/scripts/grep.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 example_files/scripts/grep.sh diff --git a/example_files/scripts/grep.sh b/example_files/scripts/grep.sh new file mode 100644 index 0000000..4de0afd --- /dev/null +++ b/example_files/scripts/grep.sh @@ -0,0 +1,21 @@ +dir_name='grep_examples' +if [[ -e "$dir_name" ]] ; then + cd "$dir_name" + return +fi + +mkdir "$dir_name" && cd $_ + +mkdir -p backups/dot_files projects/{python,shell} + +printf 'teal\nlight blue\nbrown\nyellow\n' > colors_1 +printf 'blue\nblack\ndark green\nyellow\n' > colors_2 +printf 'ghost\nclear blue sky\n' > .hidden + +echo 'print("Hello, Python!")' > projects/python/hello.py +echo 'echo "Hello, Bash!"' > projects/shell/hello.sh + +printf 'alias p=pwd\nalias c=clear\n' > backups/dot_files/.bash_aliases +echo 'set completion-ignore-case on' > backups/dot_files/.inputrc +printf 'red\ngreen\nblue\n' > 'backups/color list.txt' + From 23ab63078fccf38339772dbe12806ebe59407390 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 29 Aug 2022 15:55:31 +0530 Subject: [PATCH 63/76] added blocks.txt --- example_files/text_files/blocks.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 example_files/text_files/blocks.txt diff --git a/example_files/text_files/blocks.txt b/example_files/text_files/blocks.txt new file mode 100644 index 0000000..e870492 --- /dev/null +++ b/example_files/text_files/blocks.txt @@ -0,0 +1,6 @@ +%=%= +apple +banana +%=%= +brown +green From 4422c2b4476439cb1a49a962dcaf1a99230f22a5 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 9 Sep 2022 16:37:24 +0530 Subject: [PATCH 64/76] added three more text files --- example_files/text_files/anchors.txt | 3 +++ example_files/text_files/para.txt | 10 ++++++++++ example_files/text_files/table.txt | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 example_files/text_files/anchors.txt create mode 100644 example_files/text_files/para.txt create mode 100644 example_files/text_files/table.txt diff --git a/example_files/text_files/anchors.txt b/example_files/text_files/anchors.txt new file mode 100644 index 0000000..a23ac0b --- /dev/null +++ b/example_files/text_files/anchors.txt @@ -0,0 +1,3 @@ +# Regular Expressions +## Subexpression calls +## The dot meta character diff --git a/example_files/text_files/para.txt b/example_files/text_files/para.txt new file mode 100644 index 0000000..a9fc33b --- /dev/null +++ b/example_files/text_files/para.txt @@ -0,0 +1,10 @@ +hi there +how are you + +2 apples +12 bananas + + +blue sky +yellow sun +brown earth diff --git a/example_files/text_files/table.txt b/example_files/text_files/table.txt new file mode 100644 index 0000000..167619a --- /dev/null +++ b/example_files/text_files/table.txt @@ -0,0 +1,3 @@ +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 From 97ee6973690e8ca07deed5d086030c3ee4738f4c Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 12 Sep 2022 15:05:33 +0530 Subject: [PATCH 65/76] added duplicates.txt --- example_files/text_files/duplicates.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 example_files/text_files/duplicates.txt diff --git a/example_files/text_files/duplicates.txt b/example_files/text_files/duplicates.txt new file mode 100644 index 0000000..2777215 --- /dev/null +++ b/example_files/text_files/duplicates.txt @@ -0,0 +1,7 @@ +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +yellow,toy,flower,333 +white,sky,bread,111 +light red,purse,rose,333 From 24a3422deca89c064df437d1abbf30edb21d5ec0 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 13 Oct 2022 17:06:07 +0530 Subject: [PATCH 66/76] updated modified timestamp for hi.sh --- example_files/scripts/touch.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/example_files/scripts/touch.sh b/example_files/scripts/touch.sh index 599432c..38bad29 100644 --- a/example_files/scripts/touch.sh +++ b/example_files/scripts/touch.sh @@ -15,3 +15,4 @@ touch -a -d '2022-06-01 13:25:18.693823117' ip.txt touch -m -d '2022-05-24 14:39:41.285714934' ip.txt printf '#!/bin/bash\n\necho hi\n' > hi.sh +touch -m -d '2022-06-14 13:00:46.170416890' hi.sh From 77fdad7fe34dd370925fcb510d9104c43d9aecfc Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 21 Oct 2022 15:23:48 +0530 Subject: [PATCH 67/76] added files for exercises, images, version --- Version_changes.md | 5 + exercises/exercise-solutions.md | 3108 +++++++++++++++++++++++++++++++ exercises/exercises.md | 2421 ++++++++++++++++++++++++ images/cli_computing_ls.png | Bin 0 -> 47711 bytes images/explainshell_tar.png | Bin 0 -> 28149 bytes images/grep_color.png | Bin 0 -> 7924 bytes images/info.svg | 1 + images/ls_color.png | Bin 0 -> 12837 bytes images/man_cat.png | Bin 0 -> 46897 bytes images/top_example.png | Bin 0 -> 69092 bytes images/tree_example.png | Bin 0 -> 15362 bytes images/warning.svg | 1 + 12 files changed, 5536 insertions(+) create mode 100644 Version_changes.md create mode 100644 exercises/exercise-solutions.md create mode 100644 exercises/exercises.md create mode 100644 images/cli_computing_ls.png create mode 100644 images/explainshell_tar.png create mode 100644 images/grep_color.png create mode 100644 images/info.svg create mode 100644 images/ls_color.png create mode 100644 images/man_cat.png create mode 100644 images/top_example.png create mode 100644 images/tree_example.png create mode 100644 images/warning.svg diff --git a/Version_changes.md b/Version_changes.md new file mode 100644 index 0000000..257de74 --- /dev/null +++ b/Version_changes.md @@ -0,0 +1,5 @@ +
+ +### 1.0 + +* First version diff --git a/exercises/exercise-solutions.md b/exercises/exercise-solutions.md new file mode 100644 index 0000000..8aa2c82 --- /dev/null +++ b/exercises/exercise-solutions.md @@ -0,0 +1,3108 @@ +# Exercise Solutions + +## Command Line Overview + +**1)** By default, is `echo` a shell builtin or external command on your system? What command could you use to get an answer for this question? + +On my system, `echo` is both a shell builtin and an external command. + +```bash +$ type -a echo +echo is a shell builtin +echo is /bin/echo +``` + +As seen in the above result, the builtin command takes priority, so that is the default version. + +**2)** What output do you get for the command shown below? Does the documentation help understand the result? + +```bash +$ echo apple 42 'banana 100' +apple 42 banana 100 +``` + +Yes, the documentation helps to understand the above result. From `help echo` (since the builtin version is the default): + +>Display the ARGs, separated by a single space character and followed by a newline, on the standard output. + +In the above command, there are three arguments passed to the `echo` command — `apple`, `42` and `'banana 100'`. The string represented by these arguments are displayed in the output separated by a single space character. + +**3)** Go through [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html). Is `~/projects` a relative or an absolute path? See [this unix.stackexchange thread](https://unix.stackexchange.com/q/221970/109046) for answers. + +I do not much care if it is correct to call it a relative or absolute path. More importantly, I want to highlight this gotcha from the above unix.stackexchange thread: + +>`~` is syntax implemented by the shell (and other programs which imitate it for convenience) which expands it into a real pathname. To illustrate, `~/Documents` is approximately the same thing as `$HOME/Documents` (again, shell syntax). Since `$HOME` should be an absolute path, the value of `$HOME/Documents` is also an absolute path. But the text `$HOME/Documents` or `~/Documents` has to be expanded by the shell in order to become the path we mean. + +I spent a frustrating few hours trying to debug why one of my [autostart](https://wiki.archlinux.org/title/Autostarting) script wasn't working. Yup, you guessed it. I used `~` while providing a file path. + +**4)** Which key would you use to get help while the `less` command is active? + +`h` + +**5)** How would you bring the 50th line to the top of the screen while viewing a `man` page (assume `less` command is the `pager`)? + +`50g` + +**6)** What does the `Ctrl+k` shortcut do? + +Deletes from the current character to the end of the command line. + +**7)** Briefly explain the role of the following shell operators: + +*a)* `|` — redirects output from a command as input to another command +*b)* `>` — redirects output from a command to a file (overwrites if the file already exists) +*c)* `>>` — redirects output from a command to a file (appends if the file already exists) + +**8)** The `whatis` command displays one-line descriptions about commands. But it doesn't seem to work for `whatis type`. What should you use instead? + +```bash +$ whatis cat +cat (1) - concatenate files and print on the standard output + +$ whatis type +type: nothing appropriate. + +# need to use 'help -d' since 'type' is a shell builtin +$ help -d type +type - Display information about command type. +``` + +**9)** What is the role of the `/tmp` directory? + +From `man hier`: + +>This directory contains temporary files which may be deleted with no notice, such as by a regular job or at system boot up. + +See [wikipedia: Temporary folder](https://en.wikipedia.org/wiki/Temporary_folder) for more details. + +**10)** Give an example each for absolute and relative paths. + +* absolute path: `/usr/share/dict/words` +* relative path: `../../projects` + +**11)** When would you use the `man -k` command? + +From `man man`: + +>`-k, --apropos` +> +>Equivalent to apropos. Search the short manual page descriptions +>for keywords and display any matches. See apropos(1) for details. + +For example: + +```bash +# same as: apropos column +$ man -k column +colrm (1) - remove columns from a file +column (1) - columnate lists +git-column (1) - Display data in columns +``` + +**12)** Are there any differences between `man` and `info` pages? + +The Linux manual pages are usually shortened version of the full documentation. You can use the `info` command to view the complete documentation for GNU tools. `info` is also a TUI application, but with different key configuration compared to the `man` command. See [GNU Manuals Online](https://www.gnu.org/manual/manual.html) if you'd prefer to read them from a web browser. You can also download them in formats like PDF for offline usage. + +
+ +## Managing Files and Directories + +>![info](../images/info.svg) The `ls.sh` script will be used for some of the exercises. + +**1)** Which of these commands will always display the absolute path of the home directory? + +*a)* `pwd` +*b)* `echo "$PWD"` +*c)* `echo "$HOME"` + +Answer: *c)* `echo "$HOME"` + +**2)** The current working directory has a folder named `-dash`. How would you switch to that directory? + +*a)* `cd -- -dash` +*b)* `cd -dash` +*c)* `cd ./-dash` +*d)* `cd \-dash` +*e)* `cd '-dash'` +*f)* all of the above +*g)* only *a)* and *c)* + +Answer: *g)* only *a)* and *c)* + +**3)** Given the directory structure as shown below, how would you change to the `todos` directory? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi* projects/ scripts@ +$ cd projects +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/projects + +$ cd ../todos +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/todos +``` + +**4)** As per the scenario shown below, how would you change to the `cli-computing` directory under the user's home directory? And then, how would you go back to the previous working directory? + +```bash +$ pwd +/home/learnbyexample/all/projects/square_tictactoe + +$ cd ~/cli-computing +$ pwd +/home/learnbyexample/cli-computing + +$ cd - +$ pwd +/home/learnbyexample/all/projects/square_tictactoe +``` + +**5)** How'd you list the contents of the current directory, one per line, along with the size of the entries in human readable format? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +$ ls -1sh +total 7.4M +4.0K backups + 16K errors.log +4.0K hello_world.py +4.0K hi +4.0K ip.txt +4.0K projects +7.4M report.log + 0 scripts +4.0K todos +``` + +**6)** Which `ls` command option would you use for version based sorting of entries? + +From `man ls`: + +>`-v` +> +>natural sort of (version) numbers within text + +**7)** Which `ls` command option would you use for sorting based on entry size? + +>`-S` +> +>sort by file size, largest first + +**8)** Which `ls` command option would you use for sorting based on file extension? + +>`-X` +> +>sort alphabetically by entry extension + +**9)** What does the `-G` option of `ls` command do? + +>`-G, --no-group` +> +>in a long listing, don't print group names + +**10)** What does the `-i` option of `ls` command do? + +>`-i, --inode` +> +>print the index number of each file + +**11)** List only the directories as one entry per line. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +$ ls -1d */ +backups/ +projects/ +scripts/ +todos/ +``` + +**12)** Assume that a regular file named `notes` already exists. What would happen if you use the `mkdir -p notes` command? + +```bash +$ ls -1F notes +notes + +# what would happen here? +$ mkdir -p notes +mkdir: cannot create directory ‘notes’: File exists +``` + +**13)** Use one or more commands to match the scenario shown below: + +```bash +$ ls -1F +cost.txt + +# can also use: mkdir {gho,que,toa}st +# brace expansion is covered in the "Shell Features" chapter +$ mkdir ghost quest toast + +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ +``` + +**14)** Use one or more commands to match the scenario shown below: + +```bash +# start with an empty directory +$ ls -l +total 0 + +# can also use: mkdir -p hobbies/{painting,trekking,writing} shopping +# or: mkdir -p hobbies/{paint,trekk,writ}ing shopping +$ mkdir -p hobbies/painting hobbies/trekking hobbies/writing shopping +$ touch hobbies/painting/waterfall.bmp hobbies/trekking/himalayas.txt +$ touch shopping/festival.xlsx + +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files +``` + +>![info](../images/info.svg) Don't delete this directory, will be needed in a later exercise. + +**15)** If directories to create already exist, which `mkdir` command option would you use to not show an error? + +>`-p, --parents` +> +>no error if existing, make parent directories as needed + +**16)** Use one or more commands to match the scenario given below: + +```bash +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ + +$ rm -r cost.txt ghost toast + +$ ls -1F +quest/ +``` + +**17)** What does the `-f` option of `rm` command do? + +>`-f, --force` +> +>ignore nonexistent files and arguments, never prompt + +It also helps to remove write protected files (provided you have appropriate permissions to delete those files). + +**18)** Which option would you use to interactively delete files using the `rm` command? + +>`-i` +> +>prompt before every removal +> +>`-I` +> +>prompt once before removing more than three files, or when removing +>recursively; less intrusive than `-i`, while still giving protection +>against most mistakes + +**19)** Can the files removed by `rm` easily be restored? Do you need to take some extra steps or use special commands to make the files more difficult to recover? + +* Files removed using `rm` can still be recovered with time and skill + * [unix.stackexchange: recover deleted files](https://unix.stackexchange.com/q/80270/109046) + * [unix.stackexchange: recovering accidentally deleted files](https://unix.stackexchange.com/q/2677/109046) +* Use commands like `shred` if you want to make it harder to recover deleted files + * [wiki.archlinux: Securely wipe disk](https://wiki.archlinux.org/title/Securely_wipe_disk) + +**20)** Does your Linux distribution provide a tool to send deleted files to the trash (which would help to recover deleted files)? + +On Ubuntu, you can use `sudo apt install trash-cli` to install the `trash` command. See also [wiki.archlinux: Trash management](https://wiki.archlinux.org/title/Trash_management). + +**21)** Which option would you use to interactively accept/prevent the `cp` command from overwriting a file of the same name? And which option would prevent overwriting without needing manual confirmation? + +>`-i, --interactive` +> +>prompt before overwrite (overrides a previous -n option) +> +>`-n, --no-clobber` +> +>do not overwrite an existing file (overrides a previous -i option) + +**22)** Does the `cp` command allow you to rename the file or directory being copied? If so, can you rename multiple files/directories being copied? + +`cp` allows renaming single file or directory by specifying a different name in the destination path. You can't rename multiple files or directories. + +**23)** What do the `-u`, `-b` and `-t` options of `cp` command do? + +>`-u, --update` +> +>copy only when the SOURCE file is newer than the destination file +>or when the destination file is missing +> +>`--backup[=CONTROL]` +> +>make a backup of each existing destination file +> +>`-b` +> +>like `--backup` but does not accept an argument +> +>`-t, --target-directory=DIRECTORY` +> +>copy all SOURCE arguments into DIRECTORY + +**24)** What's the difference between the two commands shown below? + +```bash +$ cp ip.txt op.txt + +$ mv ip.txt op.txt +``` + +* `cp` makes a new copy of `ip.txt` named as `op.txt` — two files having the same content +* `mv` renames `ip.txt` as `op.txt` — there's only one file + +**25)** Which option would you use to interactively accept/prevent the `mv` command from overwriting a file of the same name? + +>`-i, --interactive` +> +>prompt before overwrite + +**26)** Use one or more commands to match the scenario shown below. You should have already created this directory structure in an earlier exercise. + +```bash +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files + +$ mv hobbies/*/* hobbies/ +$ rm -r hobbies/*/ + +$ tree -F +. +├── hobbies/ +│   ├── himalayas.txt +│   └── waterfall.bmp +└── shopping/ + └── festival.xlsx + +2 directories, 3 files +``` + +**27)** What does the `-t` option of `mv` command do? + +>`-t, --target-directory=DIRECTORY` +> +>move all SOURCE arguments into DIRECTORY + +**28)** Determine and implement the `rename` logic based on the filenames and expected output shown below. + +```bash +$ touch '(2020) report part 1.txt' 'analysis part 3 (2018).log' +$ ls -1 +'(2020) report part 1.txt' +'analysis part 3 (2018).log' + +# can also use: rename 's/[()]//g; y/ /_/' * +$ rename 's/ /_/g; s/[()]//g' * + +$ ls -1 +2020_report_part_1.txt +analysis_part_3_2018.log +``` + +**29)** Does the `ln` command follow the same order to specify source and destination as the `cp` and `mv` commands? + +Yes. + +**30)** Which `tar` option helps to compress archives based on filename extension? This option can be used instead of `-z` for `gzip`, `-j` for `bzip2` and `-J` for `xz`. + +>`-a, --auto-compress` +> +>Use archive suffix to determine the compression program. + +
+ +## Shell Features + +>![info](../images/info.svg) Use the `globs.sh` script for wildcards related exercises, unless otherwise mentioned. + +>![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files. You can delete such practice directories afterwards. + +**1)** Use the `echo` command to display the text as shown below. Use appropriate quoting as necessary. + +```nohighlight +# can also use: echo "that's"' great! $x = $y + $z' +$ echo 'that'\''s great! $x = $y + $z' +that's great! $x = $y + $z +``` + +**2)** Use the `echo` command to display the values of the three variables in the format as shown below. + +```bash +$ n1=10 +$ n2=90 +$ op=100 + +$ echo "$n1 + $n2 = $op" +10 + 90 = 100 +``` + +**3)** What will be the output of the command shown below? + +```bash +$ echo $'\x22apple\x22: \x2710\x27' +"apple": '10' +``` + +**4)** List filenames starting with a digit character. + +```bash +# change to the 'scripts' directory and source the 'globs.sh' script +$ source globs.sh + +$ ls [0-9]* +100.sh 42.txt +``` + +**5)** List filenames whose extension do not begin with `t` or `l`. Assume extensions will have at least one character. + +```bash +# can also use: ls *.[!tl]* +$ ls *.[^tl]* +100.sh calc.py hello.py hi.sh main.c math.h +``` + +**6)** List filenames whose extension only have a single character. + +```bash +$ ls *.? +main.c math.h +``` + +**7)** List filenames whose extension is not `txt`. + +```bash +$ shopt -s extglob +$ ls *.!(txt) +100.sh hello.py main.c report-00.log report-04.log +calc.py hi.sh math.h report-02.log report-98.log +``` + +**8)** Describe the wildcard pattern used in the command shown below. + +```bash +$ ls *[^[:word:]]*.* +report-00.log report-02.log report-04.log report-98.log +``` + +List files that have at least one non-word character (`-` for example) before a `.` character. + +**9)** List filenames having only lowercase alphabets before the extension. + +```bash +$ ls +([a-z]).* +calc.py hello.py hi.sh ip.txt main.c math.h notes.txt +``` + +**10)** List filenames starting with `ma` or `he` or `hi`. + +```bash +$ ls ma* he* hi* +hello.py hi.sh main.c math.h + +# alternate solutions +$ ls @(ma|h[ei])* +$ ls @(ma|he|hi)* +``` + +**11)** What commands would you use to get the outputs shown below? Assume that you do not know the depth of sub-directories. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# filenames ending with '.txt' +$ shopt -s globstar +$ ls **/*.txt +ip.txt todos/books.txt todos/outing.txt + +# directories starting with 'c' or 'd' or 'g' or 'r' or 't' +$ ls -1d **/[cdgrt]*/ +backups/dot_files/ +projects/calculator/ +projects/tictactoe/ +todos/ +``` + +**12)** Create and change to an empty directory. Then, use brace expansion along with relevant commands to get the results shown below. + +```bash +$ mkdir practice_brace && cd $_ +$ touch report_202{0..2}.txt +$ ls report* +report_2020.txt report_2021.txt report_2022.txt + +# use 'cp' command here +$ cp report_2021.txt{,.bkp} +$ ls report* +report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt +``` + +**13)** What does the `set` builtin command do? + +From `help set`: + +>Change the value of shell attributes and positional parameters, or +>display the names and values of shell variables. + +**14)** What does the `|` pipe operator do? And when would you add the `tee` command? + +`|` redirects the output of a command as input to another command. The `tee` command will help to save the output of a command to a file as well as display it on the terminal. + +**15)** Can you infer what the following command does? *Hint*: see `help printf`. + +```bash +$ printf '%s\n' apple car dragon +apple +car +dragon +``` + +From `help printf`: + +>The format is re-used as necessary to consume all of the arguments. If +>there are fewer arguments than the format requires, extra format +>specifications behave as if a zero value or null string, as appropriate, +>had been supplied. + +In the above example, the format `%s\n` is applied to all the three arguments. + +**16)** Use brace expansion along with relevant commands and shell features to get the result shown below. *Hint*: see previous question. + +```bash +$ ls ip.txt +ls: cannot access 'ip.txt': No such file or directory + +# can also use: printf '%s\n' item_{10..20..2} > ip.txt +$ printf 'item_%s\n' {10..20..2} > ip.txt +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +``` + +**17)** With `ip.txt` containing text as shown in the previous question, use brace expansion and relevant commands to get the result shown below. + +```bash +$ printf '%s\n' apple_{1..3}_banana_{6..8} >> ip.txt +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +apple_1_banana_6 +apple_1_banana_7 +apple_1_banana_8 +apple_2_banana_6 +apple_2_banana_7 +apple_2_banana_8 +apple_3_banana_6 +apple_3_banana_7 +apple_3_banana_8 +``` + +**18)** What are the differences between `<` and `|` shell operators, if any? + +* the `<` redirection operator helps you to pass data from a file as input to a command +* the `|` operator redirects output of a command as input to another command + +**19)** Which character is typically used to represent `stdin` data as a file argument? + +`-` + +**20)** What do the following operators do? + +*a)* `1>` — redirect the standard output of a command to a file +*b)* `2>` — redirect the standard error of a command to a file +*c)* `&>` — redirect both `stdout` and `stderr` (overwrites an existing file) +*d)* `&>>` — redirect both `stdout` and `stderr` (appends to existing file) +*e)* `|&` — pipe both `stdout` and `stderr` as input to another command + +**21)** What will be the contents of `op.txt` if you use the following `grep` command? + +```bash +# press Ctrl+d after the line containing 'histogram' +$ grep 'hi' > op.txt +hi there +this is a sample line +have a nice day +histogram + +# you'll get lines containing 'hi' +$ cat op.txt +hi there +this is a sample line +histogram +``` + +**22)** What will be the contents of `op.txt` if you use the following commands? + +```bash +$ qty=42 +$ cat << end > op.txt +> dragon +> unicorn +> apple $qty +> ice cream +> end + +$ cat op.txt +dragon +unicorn +apple 42 +ice cream +``` + +Note that the value of `qty` variable was substituted for `$qty`. You'll have to use `'end'` or `\end` to avoid shell interpolation. + +**23)** Correct the command to get the expected output shown below. + +```bash +$ books='cradle piranesi soulhome bastion' + +# something is wrong with this command +$ sed 's/\b\w/\u&/g' <<< '$books' +$Books + +# double quotes is needed for variable interpolation +$ sed 's/\b\w/\u&/g' <<< "$books" +Cradle Piranesi Soulhome Bastion +``` + +**24)** Correct the command to get the expected output shown below. + +```bash +# something is wrong with this command +$ echo 'hello' ; seq 3 > op.txt +hello +$ cat op.txt +1 +2 +3 + +# can also use: { echo 'hello' ; seq 3 ; } > op.txt +$ (echo 'hello' ; seq 3) > op.txt +$ cat op.txt +hello +1 +2 +3 +``` + +**25)** What will be the output of the following commands? + +```bash +$ printf 'hello' | tr 'a-z' 'A-Z' && echo ' there' +HELLO there + +$ printf 'hello' | tr 'a-z' 'A-Z' || echo ' there' +HELLO +``` + +In both cases, the first command succeeds (exit status `0`). The `&&` and `||` are short-circuit operators. Their second operands will be executed only if the first one was success and failure respectively. + +**26)** Correct the command(s) to get the expected output shown below. + +```bash +# something is wrong with these commands +$ nums=$(seq 3) +$ echo $nums +1 2 3 + +$ echo "$nums" +1 +2 +3 +``` + +**27)** Will the following two commands produce equivalent output? If not, why not? + +```bash +$ paste -d, <(seq 3) <(printf '%s\n' item_{1..3}) +1,item_1 +2,item_2 +3,item_3 + +$ printf '%s\n' {1..3},item_{1..3} +1,item_1 +1,item_2 +1,item_3 +2,item_1 +2,item_2 +2,item_3 +3,item_1 +3,item_2 +3,item_3 +``` + +The outputs are not equivalent because brace expansion creates all combinations when multiple braces are used. + +
+ +## Viewing Part or Whole File Contents + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which option(s) would you use to get the output shown below? + +```bash +$ printf '\n\n\ndragon\n\n\nunicorn\n\n\n' | cat -bs + + 1 dragon + + 2 unicorn + +``` + +**2)** Pass appropriate arguments to the `cat` command to get the output shown below. + +```bash +$ cat greeting.txt +Hi there +Have a nice day + +$ echo '42 apples and 100 bananas' | cat - greeting.txt +42 apples and 100 bananas +Hi there +Have a nice day +``` + +**3)** Will the two commands shown below produce the same output? If not, why not? + +```bash +$ cat fruits.txt ip.txt | tac +blue delight +light orange +deep blue +mango +papaya +banana + +$ tac fruits.txt ip.txt +mango +papaya +banana +blue delight +light orange +deep blue +``` + +No, the output are not same because `tac` reverses content separately for each input file. + +**4)** Go through the manual for the `tac` command and use appropriate options and arguments to get the output shown below. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +$ tac -bs '%=%=' blocks.txt +%=%= +brown +green +%=%= +apple +banana +``` + +>`-b, --before` +> +>attach the separator before instead of after +> +>`-s, --separator=STRING` +> +>use STRING as the separator instead of newline + +**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? + +`less -N` enables line numbering and `less -n` disables numbering. `cat -n` enables line numbering, so it doesn't function similar to `less -n`. + +**6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? + +You can use `:e filename` to open another file (similar to the Vim text editor). You can use `:p` and `:n` to switch between previous and next files. + +**7)** Use appropriate commands and shell features to get the output shown below. + +```bash +$ printf 'carpet\njeep\nbus\n' +carpet +jeep +bus + +# use the above 'printf' command for input data +$ c=$(printf 'carpet\njeep\nbus\n' | head -c3) +$ echo "$c" +car +``` + +**8)** How would you display all the input lines except the first one? + +```bash +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | tail -n +2 +fig +carpet +jeep +bus +``` + +**9)** Which command(s) would you use to get the output shown below? + +```bash +$ cat fruits.txt +banana +papaya +mango +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +$ head -q -n2 fruits.txt blocks.txt +banana +papaya +%=%= +apple +``` + +**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. + +```bash +# can also use: tail -c +11 | head -c4 +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | head -c14 | tail -c +11 +carp +``` + +**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. + +```bash +$ head -q -c6 table.txt fruits.txt +brown banana +``` + +**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. + +```bash +$ tail -q -c6 fruits.txt table.txt +mango + 3.14 +``` + +
+ +## Searching Files and Filenames + +>![info](../images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. + +>![info](../images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. + +**1)** Display lines containing `an` from the input files `blocks.txt`, `ip.txt` and `uniform.txt`. Show the results with and without filename prefix. + +```bash +$ grep 'an' blocks.txt ip.txt uniform.txt +blocks.txt:banana +ip.txt:light orange +uniform.txt:mango + +$ grep -h 'an' blocks.txt ip.txt uniform.txt +banana +light orange +mango +``` + +**2)** Display lines containing the whole word `he` from the `sample.txt` input file. + +```bash +$ grep -w 'he' sample.txt +14) He he he +``` + +**3)** Match only whole lines containing `car` irrespective of case. The matching lines should be displayed with line number prefix as well. + +```bash +$ printf 'car\nscared\ntar car par\nCar\n' | grep -nix 'car' +1:car +4:Car +``` + +**4)** Display all lines from `purchases.txt` except those that contain `tea`. + +```bash +$ grep -v 'tea' purchases.txt +coffee +washing powder +coffee +toothpaste +soap +``` + +**5)** Display all lines from `sample.txt` that contain `do` but not `it`. + +```bash +# can also use: grep -P '^(?!.*it).*do' sample.txt +$ grep 'do' sample.txt | grep -v 'it' +13) Much ado about nothing +``` + +**6)** For the input file `sample.txt`, filter lines containing `do` and also display the line that comes after such a matching line. + +```bash +$ grep -A1 'do' sample.txt + 6) Just do-it + 7) Believe it +-- +13) Much ado about nothing +14) He he he +``` + +**7)** For the input file `sample.txt`, filter lines containing `are` or `he` as whole words as well as the line that comes before such a matching line. Go through `info grep` or the [online manual](https://www.gnu.org/software/grep/manual/grep.html) and use appropriate options such that there's no separator between the groups of matching lines in the output. + +```bash +$ grep --no-group-separator -B1 -wE 'are|he' sample.txt + 3) Hi there + 4) How are you +13) Much ado about nothing +14) He he he +``` + +>`--no-group-separator` +> +>When `-A`, `-B` or `-C` are in use, do not print a separator +>between groups of lines. + +**8)** Extract all pairs of `()` with/without text inside them, provided they do not contain `()` characters inside. + +```bash +$ echo 'I got (12) apples' | grep -o '([^()]*)' +(12) + +$ echo '((2 +3)*5)=25 and (4.3/2*()' | grep -o '([^()]*)' +(2 +3) +() +``` + +**9)** For the given input, match all lines that start with `den` or end with `ly`. + +```bash +$ lines='reply\n1 dentist\n2 lonely\neden\nfly away\ndent\n' + +$ printf '%b' "$lines" | grep -E '^den|ly$' +reply +2 lonely +dent +``` + +**10)** Extract words starting with `s` and containing both `e` and `t` in any order. + +```bash +$ words='sequoia subtle exhibit sets tests sit store_2' + +$ echo "$words" | grep -owP 's(?=\w*t)(?=\w*e)\w+' +subtle +sets +store_2 + +# alternate solutions, but these won't scale well with more conditions +$ echo "$words" | grep -ow 's\w*t\w*' | grep 'e' +$ echo "$words" | grep -owE 's\w*(t\w*e|e\w*t)\w*' +``` + +**11)** Extract all whole words having the same first and last word character. + +```bash +$ echo 'oreo not a _oh_ pip roar took 22' | grep -owE '\w|(\w)\w*\1' +oreo +a +_oh_ +pip +roar +22 +``` + +**12)** Match all input lines containing `*[5]` literally. + +```bash +$ printf '4*5]\n(9-2)*[5]\n[5]*3\nr*[5\n' | grep -F '*[5]' +(9-2)*[5] +``` + +**13)** Match whole lines that start with `hand` and immediately followed by `s` or `y` or `le` or no further character. + +```bash +$ lines='handed\nhand\nhandy\nunhand\nhands\nhandle\nhandss\n' + +$ printf '%b' "$lines" | grep -xE 'hand([sy]|le)?' +hand +handy +hands +handle +``` + +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. + +```bash +$ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep -oP ',\K.+(?=,)' +fig +dog + +$ echo 'dragon,42,unicorn,3.14,shapeshifter\n' | grep -oP ',\K.+(?=,)' +42,unicorn,3.14 +``` + +**15)** Recursively search for files containing `ello`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +$ grep -rl 'ello' +projects/python/hello.py +projects/shell/hello.sh +colors_1 +colors_2 +``` + +**16)** Search for files containing `blue` recursively, but do not search within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +$ grep -rl --exclude-dir='backups' 'blue' +.hidden +colors_1 +colors_2 +``` + +**17)** Search for files containing `blue` recursively, but not if the file also contains `teal`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +$ grep -rlZ 'blue' | xargs -r0 grep -L 'teal' +.hidden +colors_2 +backups/color list.txt +``` + +**18)** Find all regular files within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'find.sh' script +$ source find.sh + +$ find backups -type f +backups/dot_files/.bashrc +backups/dot_files/.inputrc +backups/dot_files/.vimrc +backups/aug.log +backups/bookmarks.html +backups/jan.log +``` + +**19)** Find all regular files whose extension starts with `p` or `s` or `v`. + +```bash +$ find -type f -name '*.[psv]*' +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./hi.sh +./backups/dot_files/.vimrc +./hello_world.py +``` + +**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. + +```bash +# can also use: find -type f ! -name '*[g-l]*' +$ find -type f -not -name '*[g-l]*' +./todos/TRIP.txt +./todos/wow.txt +``` + +**21)** Find all regular files whose path has at least one directory name starting with `p` or `d`. + +```bash +# can also use: find -type f -regex '.*/[pd].*' +$ find -type f -path '*/[pd]*' +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**22)** Find all directories whose name contains `b` or `d`. + +```bash +$ find -type d -name '*[bd]*' +./todos +./backups +./backups/dot_files +``` + +**23)** Find all hidden directories. + +```bash +$ find -type d -name '.?*' +./projects/.venv +``` + +**24)** Find all regular files at exact depth of `2`. + +```bash +$ find -mindepth 2 -maxdepth 2 -type f +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**25)** What's the difference between `find -mtime` and `find -atime`? And, what is the time period these options work with? + +`m` is for modified timestamp and `a` is for accessed timestamp. These options work with `24` hour periods. + +>`-atime n` +> +>File was last accessed `n*24` hours ago. When find figures out how +>many 24-hour periods ago the file was last accessed, any fractional +>part is ignored, so to match `-atime +1`, a file has to have been +>accessed at least two days ago. +> +>`-mtime n` +> +>File's data was last modified `n*24` hours ago. See the comments for +>`-atime` to understand how rounding affects the interpretation of +>file modification times. + +**26)** Find all empty regular files. + +```bash +# can also use: find -type f -size 0 +$ find -type f -empty +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**27)** Create a directory named `filtered_files`. Then, copy all regular files that are greater than `1` byte in size but whose name don't end with `.log` to this directory. + +```bash +$ mkdir filtered_files +$ find -type f -size +1c -not -name '*.log' -exec cp -t filtered_files {} + +$ ls -A filtered_files +hello_world.py .hidden hi.sh ip.txt +``` + +**28)** Find all hidden files, but not if they are part of the `filtered_files` directory created earlier. + +```bash +$ find -type f -not -path './filtered_files/*' -prune -name '.*' +./.hidden +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**29)** Delete the `filtered_files` directory created earlier. Then, go through the `find` manual and figure out how to list only executable files. + +```bash +$ rm -r filtered_files +$ find -type f -executable +./hi.sh +./hello_world.py +``` + +>`-executable` +> +>Matches files which are executable and directories which are +>searchable (in a file name resolution sense) by the current user. + +**30)** List at least one use case for piping the `find` output to the `xargs` command instead of using the `find -exec` option. + +`xargs -P` (or the [parallel](https://www.gnu.org/software/parallel/) command) can be handy if you need parallel execution for performance reasons. + +**31)** How does the `locate` command work faster than the equivalent `find` command? + +From [unix.stackexchange: pros and cons of find and locate](https://unix.stackexchange.com/q/60205/109046): + +>`locate` uses a prebuilt database, which should be regularly updated, while `find` iterates over a filesystem to locate files. +> +>Thus, `locate` is much faster than `find`, but can be inaccurate if the database -can be seen as a cache- is not updated (see `updatedb` command). + +
+ +## File Properties + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. + +>![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. + +**1)** Save the number of lines in the `greeting.txt` input file to the `lines` shell variable. + +```bash +$ lines=$(wc -l `--files0-from=F` +> +>read input from the files specified by NUL-terminated names in file +>F; If F is - then read names from standard input + +**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? + +>`-c, --bytes` +> +>print the byte counts +> +>`-m, --chars` +> +>print the character counts +> +>`-L, --max-line-length` +> +>print the maximum display width + +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +$ find -type f -name '*.log' -exec du -h {} + +16K ./projects/errors.log +7.4M ./report.log + +$ shopt -s globstar +$ ls -1sh **/*.log + 16K projects/errors.log +7.4M report.log +``` + +**7)** Report sizes of files/directories in the current path in powers of `1000` without descending into sub-directories. Also, show a total at the end. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +$ du -sc --si * +50k projects +7.7M report.log +8.2k todos +7.8M total +``` + +**8)** What does the `du --apparent-size` option do? + +>`--apparent-size` +> +>print apparent sizes, rather than disk usage; although the apparent +>size is usually smaller, it may be larger due to holes in +>('sparse') files, internal fragmentation, indirect blocks, and the +>like + +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? + +`df` gives space usage for the entire file system whereas `du` is useful to get space estimate for specific files and directories. + +```bash +$ whatis du df +du (1) - estimate file space usage +df (1) - report file system disk space usage +``` + +To get only specific fields of interest: + +>`--output[=FIELD_LIST]` +> +>use the output format defined by FIELD_LIST, or print all fields if +>FIELD_LIST is omitted. + +**10)** Display the size of `scores.csv` and `timings.txt` files in the format shown below. + +```bash +$ stat -c '%n: %s' scores.csv timings.txt +scores.csv: 70 +timings.txt: 49 +``` + +**11)** Which `touch` option will help you prevent file creation if it doesn't exist yet? + +>`-c, --no-create` +> +>do not create any files + +**12)** Assume `new_file.txt` doesn't exist in the current working directory. What would be the output of the `stat` command shown below? + +```bash +$ touch -t '202010052010.05' new_file.txt +$ stat -c '%y' new_file.txt +2020-10-05 20:10:05.000000000 +0530 +``` + +>`-t STAMP` +> +>use [[CC]YY]MMDDhhmm[.ss] instead of current time + +**13)** Is the following `touch` command valid? If so, what would be the output of the `stat` command that follows? + +Yes, it is valid as multiple file arguments are allowed. The `-r` option helps to copy the timestamp details from the given file to the target files. + +```bash +# change to the 'scripts' directory and source the 'touch.sh' script +$ source touch.sh + +$ stat -c '%n: %y' fruits.txt +fruits.txt: 2017-07-13 13:54:03.576055933 +0530 + +$ touch -r fruits.txt f{1..3}.txt +$ stat -c '%n: %y' f*.txt +f1.txt: 2017-07-13 13:54:03.576055933 +0530 +f2.txt: 2017-07-13 13:54:03.576055933 +0530 +f3.txt: 2017-07-13 13:54:03.576055933 +0530 +fruits.txt: 2017-07-13 13:54:03.576055933 +0530 +``` + +**14)** Use appropriate option(s) to get the output shown below. + +```bash +$ printf 'αλεπού\n' | file - +/dev/stdin: UTF-8 Unicode text + +$ printf 'αλεπού\n' | file -b - +UTF-8 Unicode text +``` + +**15)** Is the following command valid? If so, what would be the output? + +Yes, it is valid. Multiple slashes will be considered as a single slash. + +```bash +$ basename -s.txt ~///test.txt/// +test +``` + +**16)** Given the file path in the shell variable `p`, how'd you obtain the output shown below? + +```bash +$ p='~/projects/square_tictactoe/python/game.py' +$ dirname $(dirname "$p") +~/projects/square_tictactoe +``` + +**17)** Explain what each of the characters mean in the following `stat` command's output. + +```bash +$ stat -c '%A' ../scripts/ +drwxrwxr-x +``` + +The 10 characters displayed are related to file type and permissions. First character indicates the **file type**. The most common ones are: + +* `-` regular file +* `d` directory +* `l` symbolic link + +The other nine characters represent three sets of **file permissions** for *user* (`u`), *group* (`g`) and *others* (`o`), in that order. + +* *user* — file owner +* *group* — users having file access as part of a group +* *others* — everyone else + +**Permission reference table:** + +| Character | Meaning | Value | +| --------- | ------------- | ----- | +| `r` | read | `4` | +| `w` | write | `2` | +| `x` | execute | `1` | +| `-` | no permission | `0` | + +**18)** What would be the output of the second `stat` command shown below? + +```bash +$ touch new_file.txt +$ stat -c '%a %A' new_file.txt +664 -rw-rw-r-- + +$ chmod 546 new_file.txt +$ stat -c '%a %A' new_file.txt +546 -r-xr--rw- +``` + +**19)** How would you specify directory permissions using the `mkdir` command? + +```bash +# instead of this +$ mkdir back_up +$ chmod 750 back_up +$ stat -c '%a %A' back_up +750 drwxr-x--- +$ rm -r back_up + +# do this +$ mkdir -m 750 back_up +$ stat -c '%a %A' back_up +750 drwxr-x--- +``` + +**20)** Change the file permission of `book_list.txt` to match the output of the second `stat` command shown below. Don't use the number `220`, specify the changes in terms of `rwx` characters. + +```bash +$ touch book_list.txt +$ stat -c '%a %A' book_list.txt +664 -rw-rw-r-- + +# can also use: chmod -r book_list.txt +$ chmod =w book_list.txt +$ stat -c '%a %A' book_list.txt +220 --w--w---- +``` + +**21)** Change the permissions of `test_dir` to match the output of the second `stat` command shown below. Don't use the number `757`, specify the changes in terms of `rwx` characters. + +```bash +$ mkdir test_dir +$ stat -c '%a %A' test_dir +775 drwxrwxr-x + +$ chmod g-w,o+w test_dir +$ stat -c '%a %A' test_dir +757 drwxr-xrwx +``` + +
+ +## Managing Processes + +**1)** How would you invoke a command to be executed in the background? And what would you do to push a job to the background after it has already been launched? What commands can you use to track active jobs? + +* appending an `&` character to the command will execute it in the background +* `Ctrl+z` (suspend the current running job) followed by `bg` (push the recently suspended job to the background) +* `jobs` or `ps` will help to track active jobs + +**2)** What do `+` and `-` symbols next to job numbers indicate? + +From `info bash` (section *Job Control Basics*): + +>In output pertaining to jobs (e.g., the output of the `jobs` +>command), the current job is always flagged with a `+`, and the previous +>job with a `-`. + +**3)** When would you use `fg %n` and `bg %n` instead of just `fg` and `bg` respectively? + +From `info bash` (section *Job Control Basics*): + +>There are a number of ways to refer to a job in the shell. The +>character `%` introduces a job specification (JOBSPEC). +> +>Job number `n` may be referred to as `%n`. + +**4)** Which option will help you customize the output fields needed for the `ps` command? + +>`-o format` +> +>User-defined format. format is a single argument in the form of a +>blank-separated or comma-separated list, which offers a way to +>specify individual output columns. + +**5)** What's the difference between `pgrep -a` and `pgrep -l` options? + +>`-a, --list-full` +> +>List the full command line as well as the process ID. +> +>`-l, --list-name` +> +>List the process name as well as the process ID. + +**6)** If the job number is `2`, would you use `kill %2` or `kill 2` to send `SIGTERM` to that process? + +`kill %2` + +**7)** Which signal does the `Ctrl+c` shortcut send to the currently running process? + +Pressing `Ctrl+c` sends the `SIGINT` (`2`) signal, usually used to abort a process. + +**8)** Which command helps you to continuously monitor processes, along with details like PID, memory usage, etc? + +`top` (or alternatives like `btop` and `htop`) + +**9)** Which key will help you manipulate kill tasks from within the `top` session? + +`k` + +**10)** What does the `free` command do? + +```bash +$ whatis free +free (1) - Display amount of free and used memory in the system +``` + +
+ +## Multipurpose Text Processing Tools + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. + +```bash +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' +a1:0xA0, a2:0xA0A1 +b1:0xFF, b2:0xBE + +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' | sed 's/0xA0/0x50/g; s/0xFF/0x7F/g' +a1:0x50, a2:0x50A1 +b1:0x7F, b2:0xBE +``` + +**2)** Remove only the third line from the given input. + +```bash +$ seq 34 37 | sed '3d' +34 +35 +37 + +# alternate solutions +$ seq 34 37 | awk 'NR!=3' +$ seq 34 37 | perl -ne 'print if $.!=3' +``` + +**3)** For the input file `sample.txt`, display all lines that contain `it` but not `do`. + +```bash +$ sed -n '/it/{/do/!p}' sample.txt + 7) Believe it + +# alternate solutions +$ awk '/it/ && !/do/' sample.txt +$ perl -ne 'print if /it/ && !/do/' sample.txt +``` + +**4)** For the input file `purchases.txt`, delete all lines containing `tea`. Also, replace all occurrences of `coffee` with `milk`. Write back the changes to the input file itself. The original contents should get saved to `purchases.txt.orig`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +$ sed -i.orig '/tea/d; s/coffee/milk/g' purchases.txt + +$ ls purchases* +purchases.txt purchases.txt.orig +$ cat purchases.txt +milk +washing powder +milk +toothpaste +soap + +# restore the contents +$ mv purchases.txt.orig purchases.txt +$ ls purchases* +purchases.txt +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea + +# alternate solutions +$ sed -i.orig -n '/tea/b; s/coffee/milk/g; p' purchases.txt +$ perl -i.orig -pe '$_="" if /tea/; s/coffee/milk/g' purchases.txt +$ perl -i.orig -ne 'next if /tea/; s/coffee/milk/g; print' purchases.txt +``` + +**5)** For the input file `sample.txt`, display all lines from the start of the file till the first occurrence of `are`. + +```bash +$ sed '/are/q' sample.txt + 1) Hello World + 2) + 3) Hi there + 4) How are you + +# alternate solutions +$ awk '1; /are/{exit}' sample.txt +$ perl -ne 'print; exit if /are/' sample.txt +``` + +**6)** Delete all groups of lines from a line containing `start` to a line containing `end` for the `uniform.txt` input file. + +```bash +$ sed '/start/,/end/d' uniform.txt +mango +icecream +how are you +have a nice day +par,far,mar,tar + +# alternate solutions +$ awk '/start/{f=1} !f; /end/{f=0}' uniform.txt +$ perl -ne '$f=1 if /start/; print if !$f; $f=0 if /end/' uniform.txt +``` + +**7)** Replace all occurrences of `42` with `[42]` unless it is at the edge of a word. + +```bash +$ echo 'hi42bye nice421423 bad42 cool_4242a 42c' | sed 's/\B42\B/[&]/g' +hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c +``` + +**8)** Replace all whole words with `X` that start and end with the same word character. + +```bash +$ echo 'oreo not a _a2_ roar took 22' | sed -E 's/\b(\w|(\w)\w*\2)\b/X/g' +X not X X X took X +``` + +**9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. + +```bash +$ cat anchors.txt +# Regular Expressions +## Subexpression calls +## The dot meta character + +$ sed -E 's|[^"]+"([^"]+)">(.+)|[\2](#\1)|' anchors.txt +[Regular Expressions](#regular-expressions) +[Subexpression calls](#subexpression-calls) +[The dot meta character](#the-dot-meta-character) +``` + +**10)** Replace all occurrences of `e` with `3` except the first two matches. + +```bash +$ echo 'asset sets tests site' | sed 's/e/3/3g' +asset sets t3sts sit3 + +$ echo 'sample item teem eel' | sed 's/e/3/3g' +sample item t33m 33l +``` + +**11)** The below sample strings use `,` as the delimiter and the field values can be empty as well. Use `sed` to replace only the third field with `42`. + +```bash +$ echo 'lion,,ant,road,neon' | sed 's/[^,]*/42/3' +lion,,42,road,neon +$ echo ',,,' | sed 's/[^,]*/42/3' +,,42, +``` + +**12)** For the input file `table.txt`, calculate and display the product of numbers in the last field of each line. Consider space as the field separator for this file. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +$ awk 'BEGIN{p = 1} {p *= $NF} END{print p}' table.txt +-923.16 + +# alternate solutions +$ perl -lane 'BEGIN{$p = 1} {$p *= $F[-1]} END{print $p}' table.txt +``` + +**13)** Extract the contents between `()` or `)(` from each of the input lines. Assume that the `()` characters will be present only once every line. + +```bash +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' +apple(ice)pie +(almond)pista +yo)yoyo(yo + +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' | awk -F'[()]' '{print $2}' +ice +almond +yoyo +``` + +**14)** For the input file `scores.csv`, display the `Name` and `Physics` fields in the format shown below. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +$ awk -F, '{print $1 ":" $3}' scores.csv +Name:Physics +Ith:100 +Cy:98 +Lin:83 + +# alternate solutions +$ awk -F, -v OFS=: '{print $1, $3}' scores.csv +$ perl -F, -lane 'print "$F[0]:$F[2]"' scores.csv +$ perl -F, -lane 'print join ":", @F[0,2]' scores.csv +``` + +**15)** Extract and display third and first words in the format shown below. + +```bash +$ echo '%whole(Hello)--{doubt}==ado==' | awk -v FPAT='\\w+' '{print $3 ":" $1}' +doubt:whole + +$ echo 'just,\joint*,concession_42<=nice' | awk -v FPAT='\\w+' '{print $3 ":" $1}' +concession_42:just + +# alternate solutions +$ echo '%whole(Hello)--{doubt}==ado==' | perl -lne '@F = /\w+/g; print "$F[2]:$F[0]"' +$ echo 'just,\joint*,concession_42<=nice' | perl -lne '@F = /\w+/g; print "$F[2]:$F[0]"' +``` + +**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. + +```bash +$ awk -F, -v OFS=, '{$(NF+1) = NR==1 ? "GP" : ($2/2 + ($3+$4)/4)} 1' scores.csv +Name,Maths,Physics,Chemistry,GP +Ith,100,100,100,100 +Cy,97,98,95,96.75 +Lin,78,83,80,79.75 +``` + +**17)** From the `para.txt` input file, display all paragraphs containing any digit character. + +```bash +$ cat para.txt +hi there +how are you + +2 apples +12 bananas + + +blue sky +yellow sun +brown earth + +$ awk -v RS= '/[0-9]/' para.txt +2 apples +12 bananas +``` + +**18)** Input has the ASCII NUL character as the record separator. Change it to dot and newline characters as shown below. + +```bash +$ printf 'apple\npie\0banana\ncherry\0' | awk -v RS='\0' -v ORS='.\n' '1' +apple +pie. +banana +cherry. +``` + +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. + +```bash +$ awk 'p2 ~ /you/ && /do/; {p2=p1; p1=$0}' sample.txt + 6) Just do-it + +# alternate solutions +$ perl -ne 'print if $p2 =~ /you/ && /do/; $p2=$p1; $p1=$_' sample.txt +``` + +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +$ awk -v n=1 '$0 == "%=%="{c++} c==n' blocks.txt +%=%= +apple +banana +$ awk -v n=2 '$0 == "%=%="{c++} c==n' blocks.txt +%=%= +brown +green +``` + +**21)** Display lines present in `c1.txt` but not in `c2.txt` using the `awk` command. + +```bash +$ awk 'NR==FNR{a[$0]; next} !($0 in a)' c2.txt c1.txt +Brown +Purple +Teal +``` + +**22)** Display lines from `scores.csv` by matching the first field based on a list of names from the `names.txt` file. + +```bash +$ printf 'Ith\nLin\n' > names.txt + +$ awk -F, 'NR==FNR{a[$1]; next} $1 in a' names.txt scores.csv +Ith,100,100,100 +Lin,78,83,80 + +$ rm names.txt +``` + +**23)** Retain only the first copy of duplicate lines from the `duplicates.txt` input file. Use only the contents of the last field for determining duplicates. + +```bash +$ cat duplicates.txt +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +yellow,toy,flower,333 +white,sky,bread,111 +light red,purse,rose,333 + +$ awk -F, '!seen[$NF]++' duplicates.txt +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 + +# alternate solutions +$ perl -F, -lane 'print if !$seen{$F[-1]}++' duplicates.txt +``` + +**24)** For the input file `table.txt`, print input lines if the second field starts with `b`. Construct solutions using `awk` and `perl`. + +```bash +$ awk '$2 ~ /^b/' table.txt +brown bread mat hair 42 +yellow banana window shoes 3.14 + +$ perl -lane 'print if $F[1] =~ /^b/' table.txt +brown bread mat hair 42 +yellow banana window shoes 3.14 +``` + +**25)** For the input file `table.txt`, retain only the second last field. Write back the changes to the input file itself. The original contents should get saved to `table.txt.bkp`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +$ perl -i.bkp -lane 'print $F[-2]' table.txt +$ ls table* +table.txt table.txt.bkp +$ cat table.txt +hair +shirt +shoes + +# restore the contents +$ mv table.txt.bkp table.txt +$ ls table* +table.txt +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**26)** Reverse the first field contents of `table.txt` input file. + +```bash +$ perl -lane '$F[0] = reverse $F[0]; print "@F"' table.txt +nworb bread mat hair 42 +eulb cake mug shirt -7 +wolley banana window shoes 3.14 +``` + +**27)** Sort the given comma separated input lexicographically. Change the output field separator to a `:` character. + +```bash +$ ip='floor,bat,to,dubious,four' +$ echo "$ip" | perl -F, -lane 'print join ":", sort @F' +bat:dubious:floor:four:to +``` + +**28)** Filter fields containing digit characters. + +```bash +$ ip='5pearl 42 east 1337 raku_6 lion 3.14' +$ echo "$ip" | perl -lane 'print join " ", grep {/\d/} @F' +5pearl 42 1337 raku_6 3.14 +``` + +**29)** The input shown below has several words ending with digit characters. Change the words containing `test` to match the output shown below. That is, renumber the matching portions to `1`, `2`, etc. Words not containing `test` should not be changed. + +```bash +$ ip='test_12:test123\nanother_test_4,no_42\n' +$ printf '%b' "$ip" +test_12:test123 +another_test_4,no_42 + +$ printf '%b' "$ip" | perl -pe 's/test\w*?\K\d+/++$i/ge' +test_1:test2 +another_test_3,no_42 +``` + +**30)** For the input file `table.txt`, change contents of the third field to all uppercase. Construct solutions using `sed`, `awk` and `perl`. + +```bash +$ sed 's/[^ ]*/\U&/3' table.txt +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ awk '{$3 = toupper($3)} 1' table.txt +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ perl -lane '$F[2] = uc $F[2]; print "@F"' table.txt +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 +``` + +
+ +## Sorting Stuff + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Default `sort` doesn't work for numbers. Correct the command used below: + +```bash +# wrong output +$ printf '100\n10\n20\n3000\n2.45\n' | sort +10 +100 +20 +2.45 +3000 + +# expected output +$ printf '100\n10\n20\n3000\n2.45\n' | sort -n +2.45 +10 +20 +100 +3000 +``` + +**2)** Which `sort` option will help you ignore case? + +```bash +$ printf 'Super\nover\nRUNE\ntea\n' | LC_ALL=C sort -f +over +RUNE +Super +tea +``` + +**3)** Go through the `sort` manual and use appropriate options to get the output shown below. + +```bash +# wrong output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort -n +-1.53 ++120 +3.14e+4 +42.1e-2 + +# expected output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort -g +-1.53 +42.1e-2 ++120 +3.14e+4 +``` + +>`-g, --general-numeric-sort` +> +>compare according to general numerical value + +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](./shell-features.md) chapter. + +```bash +$ (sed -u '1q' ; sort -t, -k2,2n) < scores.csv +Name,Maths,Physics,Chemistry +Lin,78,83,80 +Cy,97,98,95 +Ith,100,100,100 +``` + +**5)** Sort the contents of `duplicates.txt` by the fourth column numbers in descending order. Retain only the first copy of lines with the same number. + +```bash +$ sort -t, -k4,4nr -u duplicates.txt +dark red,sky,rose,555 +blue,ruby,water,333 +dark red,ruby,rose,111 +brown,toy,bread,42 +``` + +**6)** Will `uniq` throw an error if the input is not sorted? What do you think will be the output for the following input? + +`uniq` doesn't necessarily require the input to be sorted. Adjacent lines are used for comparison purposes. + +```bash +$ printf 'red\nred\nred\ngreen\nred\nblue\nblue' | uniq +red +green +red +blue +``` + +**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. + +```bash +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' +3) cherry +1) apple +2) banana +1) almond + +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' | sort | uniq -u -w2 +2) banana +3) cherry +``` + +**8)** Count the number of times input lines are repeated and display the results in the format shown below. + +```bash +$ printf 'brown\nbrown\nbrown\ngreen\nbrown\nblue\nblue' | sort | uniq -c | sort -n + 1 green + 2 blue + 4 brown +``` + +**9)** Display lines present in `c1.txt` but not in `c2.txt` using the `comm` command. Assume that the input files are already sorted. + +```bash +# can also use: comm -13 c2.txt c1.txt +$ comm -23 c1.txt c2.txt +Brown +Purple +Teal +``` + +**10)** Use appropriate options to get the expected output shown below. + +```bash +# wrong usage, no output +$ join <(printf 'apple 2\nfig 5') <(printf 'Fig 10\nmango 4') + +# expected output +$ join -i <(printf 'apple 2\nfig 5') <(printf 'Fig 10\nmango 4') +fig 5 10 +``` + +**11)** What are the differences between `sort -u` and `uniq -u` options, if any? + +`sort -u` retains first copy of duplicates deemed to be equal. `uniq -u` retains only the unique copies (i.e. not even a single copy of the duplicates will be part of the output). + +
+ +## Comparing Files + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? + +>`-s, --quiet, --silent` +> +>suppress all normal output + +**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. + +```bash +$ echo '1) apple' > x1.txt +$ echo '2. apple' > x2.txt +$ cmp x1.txt x2.txt +x1.txt x2.txt differ: byte 1, line 1 + +$ cmp -i2 x1.txt x2.txt +$ echo $? +0 + +$ rm x[12].txt +``` + +>`-i, --ignore-initial=SKIP` +> +>skip first SKIP bytes of both inputs + +**3)** What does the `diff -d` option do? + +>`-d, --minimal` +> +>try hard to find a smaller set of changes + +**4)** Which option will help you get colored output with `diff`? + +>`--color[=WHEN]` +> +>colorize the output; WHEN can be `never`, `always`, or `auto` (the +>default) + +**5)** Use appropriate options to get the desired output shown below. + +```bash +# instead of this output +$ diff -W 40 --suppress-common-lines -y f1.txt f2.txt +2 | hello +world | 4 + +# get this output +$ diff -W 40 --left-column -y f1.txt f2.txt +1 ( +2 | hello +3 ( +world | 4 +``` + +>`--left-column` +> +>output only the left column of common lines + +**6)** Use appropriate options to get the desired output shown below. + +```bash +$ echo 'hello' > d1.txt +$ echo 'Hello' > d2.txt + +# instead of this output +$ diff d1.txt d2.txt +1c1 +< hello +--- +> Hello + +# get this output +$ diff -si d1.txt d2.txt +Files d1.txt and d2.txt are identical + +$ rm d[12].txt +``` + +
+ +## Assorted Text Processing Tools + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Generate the following sequence. + +```bash +$ seq 100 -5 80 +100 +95 +90 +85 +80 +``` + +**2)** Is the sequence shown below possible to generate with `seq`? If so, how? + +```bash +$ seq -w -s, 01.5 6 +01.5,02.5,03.5,04.5,05.5 +``` + +**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. + +```bash +$ grep -P '^(?=.*s)(?=.*e).*t' /usr/share/dict/words | shuf -n3 +supplemental +foresight +underestimates +``` + +**4)** Briefly describe the purpose of the `shuf` command options `-i`, `-e` and `-r`. + +>`-i, --input-range=LO-HI` +> +>treat each number LO through HI as an input line +> +>`-e, --echo` +> +>treat each ARG as an input line +> +>`-r, --repeat` +> +>output lines can be repeated + +**5)** Why does the below command not work as expected? What other tools can you use in such cases? + +`cut` ignores all repeated fields and output field order always follows the same order as input fields. + +```bash +# not working as expected +$ echo 'apple,banana,cherry,dates' | cut -d, -f3,1,3 +apple,cherry + +# expected output +$ echo 'apple,banana,cherry,dates' | awk -F, -v OFS=, '{print $3, $1, $3}' +cherry,apple,cherry + +# alternate solutions +$ echo 'apple,banana,cherry,dates' | perl -F, -lane 'print join ",", @F[2,0,2]' +``` + +**6)** Display except the second field in the format shown below. Can you construct two different solutions? + +```bash +$ echo 'apple,banana,cherry,dates' | cut -d, --output-delimiter=' ' -f1,3- +apple cherry dates + +$ echo '2,3,4,5,6,7,8' | cut -d, --output-delimiter=' ' --complement -f2 +2 4 5 6 7 8 +``` + +**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? + +```bash +$ printf 'apple\nbanana\ncherry\ndates\n' | cut -c-3 +app +ban +che +dat +``` + +`head` cannot be used because it acts on the input as a whole, whereas `cut` works line wise. + +**8)** Display only the first and third columns of the `scores.csv` input file in the format as shown below. Note that only space characters are present between the two columns, not tab. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +$ cut -d, -f1,3 scores.csv | column -s, -t +Name Physics +Ith 100 +Cy 98 +Lin 83 +``` + +**9)** Display the contents of `table.txt` in the format shown below. + +```bash +$ column -t table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**10)** Implement [ROT13](https://en.wikipedia.org/wiki/ROT13) cipher using the `tr` command. + +```bash +$ echo 'Hello World' | tr 'a-zA-Z' 'n-za-mN-ZA-M' +Uryyb Jbeyq +$ echo 'Uryyb Jbeyq' | tr 'a-zA-Z' 'n-za-mN-ZA-M' +Hello World +``` + +**11)** Retain only alphabets, digits and whitespace characters. + +```bash +$ echo 'Apple_42 cool,blue Dragon:army' | tr -dc '[:alnum:][:space:]' +Apple42 coolblue Dragonarmy +``` + +**12)** Use `tr` to get the output shown below. + +```bash +$ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr -sd '!' 'a-z' +how are you +``` + +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? + +```bash +# this works individually for each input file +$ paste -sd, fruits.txt ip.txt +banana,papaya,mango +deep blue,light orange,blue delight + +# expected output +$ cat fruits.txt ip.txt | paste -sd, +banana,papaya,mango,deep blue,light orange,blue delight + +# alternate solutions +$ awk '{printf s $0; s=","} END{print ""}' fruits.txt ip.txt +``` + +**14)** Use appropriate options to get the expected output shown below. + +```bash +# default output +$ paste fruits.txt ip.txt +banana deep blue +papaya light orange +mango blue delight + +# expected output +$ paste -d'\n' fruits.txt ip.txt +banana +deep blue +papaya +light orange +mango +blue delight +``` + +**15)** Use the `pr` command to get the expected output shown below. + +```bash +$ seq -w 16 | pr -4ats, +01,02,03,04 +05,06,07,08 +09,10,11,12 +13,14,15,16 + +$ seq -w 16 | pr -4ts, +01,05,09,13 +02,06,10,14 +03,07,11,15 +04,08,12,16 +``` + +**16)** Use the `pr` command to join the input files `fruits.txt` and `ip.txt` as shown below. + +```bash +$ pr -mts' : ' fruits.txt ip.txt +banana : deep blue +papaya : light orange +mango : blue delight +``` + +**17)** The `cut` command doesn't support a way to choose the last `N` fields. Which tool presented in this chapter can be combined to work with `cut` to get the output shown below? + +```bash +# last two characters from each line +$ printf 'apple\nbanana\ncherry\ndates\n' | rev | cut -c-2 | rev +le +na +ry +es +``` + +**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. + +```bash +# split input by 3 lines (max) at a time +$ split -l3 purchases.txt + +$ head xa? +==> xaa <== +coffee +tea +washing powder + +==> xab <== +coffee +toothpaste +tea + +==> xac <== +soap +tea + +$ rm xa? +``` + +>`-l, --lines=NUMBER` +> +>put NUMBER lines/records per output file + +**19)** Go through `split` documentation and use appropriate options to get the output shown below. + +```bash +$ echo 'apple,banana,cherry,dates' | split -t, -l1 + +$ head xa? +==> xaa <== +apple, +==> xab <== +banana, +==> xac <== +cherry, +==> xad <== +dates + +$ rm xa? +``` + +>`-t, --separator=SEP` +> +>use SEP instead of newline as the record separator; `\0` (zero) +>specifies the NUL character + +**20)** Split the input file `purchases.txt` such that the text before a line containing `powder` is part of the first file and the rest are part of the second file as shown below. + +```bash +$ csplit -q purchases.txt '/powder/' + +$ head xx0? +==> xx00 <== +coffee +tea + +==> xx01 <== +washing powder +coffee +toothpaste +tea +soap +tea + +$ rm xx0? +``` + +**21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +$ tr ',' '\n' + +## Shell Scripting + +>![info](../images/info.svg) Use a temporary working directory before attempting the exercises. You can delete such practice directories afterwards. + +**1)** What's wrong with the script shown below? Also, will the error go away if you use `bash try.sh` instead? + +`!#` should be `#!`. If you get confused which one should be used, remember that shebang is a **comment** that is treated specially at the start of the script. And no, the error won't go away if you call the script using the `bash` command. + +```bash +$ printf ' \n!#/bin/bash\n\necho hello\n' > try.sh +$ chmod +x try.sh +$ ./try.sh +./try.sh: line 2: !#/bin/bash: No such file or directory +hello + +# expected output +$ printf ' \n#!/bin/bash\n\necho hello\n' > try.sh +$ ./try.sh +hello +``` + +**2)** Will the command shown below work? If so, what would be the output? + +Yes, it will work. `echo hello` is being passed as the script to be executed by the `bash` command. + +```bash +$ echo echo hello | bash +hello +``` + +**3)** When would you `source` a script instead of using `bash` or creating an executable using shebang? + +Using `source` to execute scripts helps when you want to affect the current working environment. + +**4)** How would you display the contents of a variable with `shake` appended? + +```bash +$ fruit='banana' + +$ echo "${fruit}shake" +bananashake +``` + +**5)** What changes would you make to the code shown below to get the expected output? + +```bash +# default behavior +$ n=100 +$ n+=100 +$ echo "$n" +100100 + +# expected output +$ declare -i n=100 +$ n+=100 +$ echo "$n" +200 +``` + +**6)** Is the following code valid? If so, what would be the output of the `echo` command? + +Yes, it is valid. Array index can be arbitrarily used, they do not have to be contiguous. + +```bash +$ declare -a colors +$ colors[3]='green' +$ colors[1]='blue' + +$ echo "${colors[@]}" +blue green +``` + +**7)** How would you get the last three characters of a variable's contents? + +```bash +$ fruit='banana' + +$ echo "${fruit: -3}" +ana +``` + +**8)** Will the second `echo` command give an error? If not, what will be the output? + +No error. It will give the length of the element at index `0`. + +```bash +$ fruits=('apple' 'fig' 'mango') +$ echo "${#fruits[@]}" +3 + +$ echo "${#fruits}" +5 +``` + +**9)** For the given array, use parameter expansion to remove characters until first/last space. + +```bash +$ colors=('green' 'dark brown' 'deep sky blue white') + +# remove till first space +$ printf '%s\n' "${colors[@]#* }" +green +brown +sky blue white + +# remove till last space +$ printf '%s\n' "${colors[@]##* }" +green +brown +white +``` + +**10)** Use parameter expansion to get the expected outputs shown below. + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo "${ip%:*}" +apple:banana:cherry + +$ echo "${ip%%:*}" +apple +``` + +**11)** Is it possible to achieve the expected outputs shown below using parameter expansion? If so, how? + +Yes it is possible. For the second and third cases, `extglob` has to be enabled. + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo "${ip/:*:/ 42 }" +apple 42 dragon + +$ shopt -s extglob +$ echo "${ip/#+([^:])/fig}" +fig:banana:cherry:dragon + +$ echo "${ip/%+([^:])/end}" +apple:banana:cherry:end +``` + +**12)** For the given input, change case as per the expected outputs shown below. + +```bash +$ ip='This is a Sample STRING' + +$ echo "${ip^^}" +THIS IS A SAMPLE STRING + +$ echo "${ip,,}" +this is a sample string + +$ echo "${ip~~}" +tHIS IS A sAMPLE string +``` + +**13)** Why does the conditional expression shown below fail? + +```bash +$ touch ip.txt +$ [[-f ip.txt]] && echo 'file exists' +[[-f: command not found + +# need to use space after [[ and before ]] +$ [[ -f ip.txt ]] && echo 'file exists' +file exists +``` + +**14)** What is the difference between `==` and `=~` string comparison operators? + +* `s1 = s2` or `s1 == s2` checks if two strings are equal + * unquoted portions of `s2` will be treated as a wildcard while testing against `s1` +* `s1 =~ s2` checks if `s1` matches the POSIX extended regular expression provided by `s2` + +**15)** Why does the conditional expression used below show `failed` both times? Modify the expressions such that the first one correctly says `matched` instead of `failed`. + +Quoted portions will be treated as literal strings. Wildcards should be unquoted. + +```bash +$ f1='1234.txt' +$ f2='report_2.txt' + +$ [[ $f1 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed +$ [[ $f2 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed + +# corrected code +$ [[ $f1 == +([0-9]).txt ]] && echo 'matched' || echo 'failed' +matched +$ [[ $f2 == +([0-9]).txt ]] && echo 'matched' || echo 'failed' +failed +``` + +**16)** Extract the digits that follow a `:` character for the given variable contents. + +```bash +$ item='chocolate:50' +$ [[ $item =~ :([0-9]+) ]] && echo "${BASH_REMATCH[1]}" +50 + +$ item='50 apples, fig:100, books-12' +$ [[ $item =~ :([0-9]+) ]] && echo "${BASH_REMATCH[1]}" +100 +``` + +**17)** Modify the expression shown below to correctly report `true` instead of `false`. + +```bash +$ num=12345 +$ [[ $num > 3 ]] && echo 'true' || echo 'false' +false + +# corrected code +$ [[ $num -gt 3 ]] && echo 'true' || echo 'false' +true + +# alternate solutions +$ (( num > 3 )) && echo 'true' || echo 'false' +``` + +**18)** Write a shell script named `array.sh` that accepts array input from the user followed by another input as index. Display the corresponding value at that index. Couple of examples are shown below. + +```bash +$ cat array.sh +read -p 'enter array elements: ' -a arr +read -p 'enter array index: ' idx +echo "element at index '$idx' is: ${arr[$idx]}" + +$ bash array.sh +enter array elements: apple banana cherry +enter array index: 1 +element at index '1' is: banana + +$ bash array.sh +enter array elements: dragon unicorn centaur +enter array index: -1 +element at index '-1' is: centaur +``` + +**19)** Write a shell script named `case.sh` that accepts exactly two command line arguments. The first argument can be `lower`, `upper` or `swap` and this should be used to transform the contents of the second argument. Examples script invocations are shown below, including what should happen if the command line arguments do not meet the script expectations. + +```bash +$ cat case.sh +if (( $# != 2 )) ; then + echo 'Error! Two arguments expected.' 1>&2 + exit 1 +else + if [[ $1 == 'upper' ]] ; then + echo "${2^^}" + elif [[ $1 == 'lower' ]] ; then + echo "${2,,}" + elif [[ $1 == 'swap' ]] ; then + echo "${2~~}" + else + echo "Error! '$1' command not recognized." 1>&2 + exit 1 + fi +fi + +$ chmod +x case.sh + +$ ./case.sh upper 'how are you?' +HOW ARE YOU? + +$ ./case.sh lower PineAPPLE +pineapple + +$ ./case.sh swap 'HeLlo WoRlD' +hElLO wOrLd + +$ ./case.sh lower +Error! Two arguments expected. +$ echo $? +1 + +$ ./case.sh upper apple fig +Error! Two arguments expected. + +$ ./case.sh lowercase DRAGON +Error! 'lowercase' command not recognized. +$ echo $? +1 + +$ ./case.sh apple lower 2> /dev/null +$ echo $? +1 +``` + +**20)** Write a shell script named `loop.sh` that displays the number of lines for each of the files passed as command line arguments. + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt + +$ cat loop.sh +for file in "$@"; do + echo "number of lines in '$file' is:" $(wc -l < "$file") +done + +$ bash loop.sh items_1.txt +number of lines in 'items_1.txt' is: 3 + +$ bash loop.sh items_1.txt items_2.txt +number of lines in 'items_1.txt' is: 3 +number of lines in 'items_2.txt' is: 5 +``` + +**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt +$ printf 'items_1.txt\nitems_2.txt\n' > list.txt + +$ cat read_file.sh +while IFS= read -r line; do + paste -sd, "$line" +done < "$1" + +$ bash read_file.sh list.txt +apple,banana,cherry +dragon,owl,unicorn,troll,centaur + +# note that -n1 is not necessary here due to how paste works for multiple files +# but -n1 is necessary to be equivalent to the shell script shown above +$ xargs -a list.txt -d'\n' -n1 paste -sd, +apple,banana,cherry +dragon,owl,unicorn,troll,centaur +``` + +**22)** Write a function named `add_path` which prefixes the path of the current working directory to the arguments it receives and displays the results. Examples are shown below. + +```bash +$ add_path() { echo "${@/#/$PWD/}" ; } + +$ cd +$ pwd +/home/learnbyexample +$ add_path ip.txt report.log +/home/learnbyexample/ip.txt /home/learnbyexample/report.log + +$ cd cli-computing +$ pwd +/home/learnbyexample/cli-computing +$ add_path f1 +/home/learnbyexample/cli-computing/f1 +``` + +**23)** What do the options `bash -x` and `bash -v` do? + +>`-x` +> +>Print commands and their arguments as they are executed. +> +>`-v` +> +>Print shell input lines as they are read. + +**24)** What is `shellcheck` and when would you use it? + +[shellcheck](https://www.shellcheck.net/) is a static analysis tool that gives warnings and suggestions for scripts. + +From `man shellcheck`: + +>ShellCheck is a static analysis and linting tool for sh/bash scripts. +>It’s mainly focused on handling typical beginner and intermediate level +>syntax errors and pitfalls where the shell just gives a cryptic error message +>or strange behavior, but it also reports on a few more advanced issues +>where corner cases can cause delayed failures. + +
+ +## Shell Customization + +**1)** Which command would you use to display the name and value of all or specific environment variables? + +```bash +$ whatis printenv +printenv (1) - print all or part of environment +``` + +**2)** If you add an alias for an already existing command (`ls` for example), how would you invoke the original command instead of the alias? + +By prefixing `\` or using the `command` builtin. For example, `\ls` or `command ls`. + +**3)** Why doesn't the alias shown below work? What would you use instead? + +You cannot pass arguments to aliases, need to use functions instead. + +```bash +# doesn't work as expected +$ alias ext='echo "${1##*.}"' +$ ext ip.txt + ip.txt + +# expected output +$ ext() { echo "${1##*.}" ; } +$ ext ip.txt +txt +$ ext scores.csv +csv +$ ext file.txt.txt +txt +``` + +**4)** How would you remove a particular alias/function definition for the current shell session? + +```bash +$ alias hw='echo hello world' +$ hw +hello world +$ unalias hw +$ hw +hw: command not found + +$ hw() { echo hello there ; } +$ hw +hello there +$ unset -f hw +$ hw +hw: command not found +``` + +**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. + +```bash +$ echo "$PATH" +/usr/local/bin:/usr/bin:/bin:/usr/games + +# alias +$ alias a_p='echo "$PATH" | tr ":" "\n"' +$ a_p +/usr/local/bin +/usr/bin +/bin +/usr/games + +# function +$ f_p() { echo "${PATH//:/$'\n'}" ; } +$ f_p +/usr/local/bin +/usr/bin +/bin +/usr/games +``` + +**6)** Will a login shell read and execute `~/.bashrc` automatically? + +No. From `info bash`: + +>When an interactive shell that is not a login shell is started, Bash +>reads and executes commands from '~/.bashrc', if that file exists. + +See also [unix.stackexchange: why does bashrc check whether the current shell is interactive?](https://unix.stackexchange.com/q/257571/109046) + +**7)** What should be the value assigned to `HISTSIZE` if you wish to have unlimited history entries? + +Any negative number. + +>`HISTSIZE` +> +>The maximum number of commands to remember on the history list. If +>the value is 0, commands are not saved in the history list. +>Numeric values less than zero result in every command being saved +>on the history list (there is no limit). The shell sets the +>default value to 500 after reading any startup files. + +**8)** What does the binding `set completion-ignore-case on` do? + +>`completion-ignore-case` +> +>If set to `on`, Readline performs filename matching and +>completion in a case-insensitive fashion. The default value +>is `off`. + +**9)** Which shortcut helps you interactively search command history? + +>To search backward in the history for a particular string, type `C-r`. Typing `C-s` searches forward through the history. + +**10)** What do the shortcuts `Alt+b` and `Alt+f` do? + +>`forward-word (M-f)` +> +>Move forward to the end of the next word. Words are composed of +>letters and digits. +> +>`backward-word (M-b)` +> +>Move back to the start of the current or previous word. Words are +>composed of letters and digits. + +**11)** Are there differences between the `Ctrl+l` shortcut and the `clear` command? + +`Ctrl+l` retains whatever is typed so far and doesn't try to remove the scrollback buffer altogether. You can use the `clear` command for that purpose. + +**12)** Which shortcut will you use to delete characters before the cursor till the start of the line? + +>`unix-line-discard (C-u)` +> +>Kill backward from the cursor to the beginning of the current line. + +**13)** What do the shortcuts `Alt+t` and `Ctrl+t` do? + +>`transpose-chars (C-t)` +> +>Drag the character before the cursor forward over the character at +>the cursor, moving the cursor forward as well. If the insertion +>point is at the end of the line, then this transposes the last two +>characters of the line. Negative arguments have no effect. +> +>`transpose-words (M-t)` +> +>Drag the word before point past the word after point, moving point +>past that word as well. If the insertion point is at the end of +>the line, this transposes the last two words on the line. + +**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? + +* `Shift+Ctrl+v` pastes clipboard contents +* `Shift+Insert` pastes the last highlighted portion (not necessarily the clipboard contents) + diff --git a/exercises/exercises.md b/exercises/exercises.md new file mode 100644 index 0000000..4e0f2d7 --- /dev/null +++ b/exercises/exercises.md @@ -0,0 +1,2421 @@ +# Exercises + +>![info](../images/info.svg) For solutions, see [exercise-solutions.md](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercise-solutions.md). + +
+ +## Command Line Overview + +**1)** By default, is `echo` a shell builtin or external command on your system? What command could you use to get an answer for this question? + +**2)** What output do you get for the command shown below? Does the documentation help understand the result? + +```bash +$ echo apple 42 'banana 100' +``` + +**3)** Go through [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html). Is `~/projects` a relative or an absolute path? See [this unix.stackexchange thread](https://unix.stackexchange.com/q/221970/109046) for answers. + +**4)** Which key would you use to get help while the `less` command is active? + +**5)** How would you bring the 50th line to the top of the screen while viewing a `man` page (assume `less` command is the `pager`)? + +**6)** What does the `Ctrl+k` shortcut do? + +**7)** Briefly explain the role of the following shell operators: + +*a)* `|` +*b)* `>` +*c)* `>>` + +**8)** The `whatis` command displays one-line descriptions about commands. But it doesn't seem to work for `whatis type`. What should you use instead? + +```bash +$ whatis cat +cat (1) - concatenate files and print on the standard output + +$ whatis type +type: nothing appropriate. + +# ??? +type - Display information about command type. +``` + +**9)** What is the role of the `/tmp` directory? + +**10)** Give an example each for absolute and relative paths. + +**11)** When would you use the `man -k` command? + +**12)** Are there any differences between `man` and `info` pages? + +
+ +## Managing Files and Directories + +>![info](../images/info.svg) The `ls.sh` script will be used for some of the exercises. + +**1)** Which of these commands will always display the absolute path of the home directory? + +*a)* `pwd` +*b)* `echo "$PWD"` +*c)* `echo "$HOME"` + +**2)** The current working directory has a folder named `-dash`. How would you switch to that directory? + +*a)* `cd -- -dash` +*b)* `cd -dash` +*c)* `cd ./-dash` +*d)* `cd \-dash` +*e)* `cd '-dash'` +*f)* all of the above +*g)* only *a)* and *c)* + +**3)** Given the directory structure as shown below, how would you change to the `todos` directory? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi* projects/ scripts@ +$ cd projects +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/projects + +# ??? +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/todos +``` + +**4)** As per the scenario shown below, how would you change to the `cli-computing` directory under the user's home directory? And then, how would you go back to the previous working directory? + +```bash +$ pwd +/home/learnbyexample/all/projects/square_tictactoe + +# ??? +$ pwd +/home/learnbyexample/cli-computing + +# ??? +$ pwd +/home/learnbyexample/all/projects/square_tictactoe +``` + +**5)** How'd you list the contents of the current directory, one per line, along with the size of the entries in human readable format? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# ??? +total 7.4M +4.0K backups + 16K errors.log +4.0K hello_world.py +4.0K hi +4.0K ip.txt +4.0K projects +7.4M report.log + 0 scripts +4.0K todos +``` + +**6)** Which `ls` command option would you use for version based sorting of entries? + +**7)** Which `ls` command option would you use for sorting based on entry size? + +**8)** Which `ls` command option would you use for sorting based on file extension? + +**9)** What does the `-G` option of `ls` command do? + +**10)** What does the `-i` option of `ls` command do? + +**11)** List only the directories as one entry per line. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# ??? +backups/ +projects/ +scripts/ +todos/ +``` + +**12)** Assume that a regular file named `notes` already exists. What would happen if you use the `mkdir -p notes` command? + +```bash +$ ls -1F notes +notes + +# what would happen here? +$ mkdir -p notes +``` + +**13)** Use one or more commands to match the scenario shown below: + +```bash +$ ls -1F +cost.txt + +# ??? + +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ +``` + +**14)** Use one or more commands to match the scenario shown below: + +```bash +# start with an empty directory +$ ls -l +total 0 + +# ??? + +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files +``` + +>![info](../images/info.svg) Don't delete this directory, will be needed in a later exercise. + +**15)** If directories to create already exist, which `mkdir` command option would you use to not show an error? + +**16)** Use one or more commands to match the scenario given below: + +```bash +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ + +# ??? + +$ ls -1F +quest/ +``` + +**17)** What does the `-f` option of `rm` command do? + +**18)** Which option would you use to interactively delete files using the `rm` command? + +**19)** Can the files removed by `rm` easily be restored? Do you need to take some extra steps or use special commands to make the files more difficult to recover? + +**20)** Does your Linux distribution provide a tool to send deleted files to the trash (which would help to recover deleted files)? + +**21)** Which option would you use to interactively accept/prevent the `cp` command from overwriting a file of the same name? And which option would prevent overwriting without needing manual confirmation? + +**22)** Does the `cp` command allow you to rename the file or directory being copied? If so, can you rename multiple files/directories being copied? + +**23)** What do the `-u`, `-b` and `-t` options of `cp` command do? + +**24)** What's the difference between the two commands shown below? + +```bash +$ cp ip.txt op.txt + +$ mv ip.txt op.txt +``` + +**25)** Which option would you use to interactively accept/prevent the `mv` command from overwriting a file of the same name? + +**26)** Use one or more commands to match the scenario shown below. You should have already created this directory structure in an earlier exercise. + +```bash +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files + +# ??? + +$ tree -F +. +├── hobbies/ +│   ├── himalayas.txt +│   └── waterfall.bmp +└── shopping/ + └── festival.xlsx + +2 directories, 3 files +``` + +**27)** What does the `-t` option of `mv` command do? + +**28)** Determine and implement the `rename` logic based on the filenames and expected output shown below. + +```bash +$ touch '(2020) report part 1.txt' 'analysis part 3 (2018).log' +$ ls -1 +'(2020) report part 1.txt' +'analysis part 3 (2018).log' + +# ??? + +$ ls -1 +2020_report_part_1.txt +analysis_part_3_2018.log +``` + +**29)** Does the `ln` command follow the same order to specify source and destination as the `cp` and `mv` commands? + +**30)** Which `tar` option helps to compress archives based on filename extension? This option can be used instead of `-z` for `gzip`, `-j` for `bzip2` and `-J` for `xz`. + +
+ +## Shell Features + +>![info](../images/info.svg) Use the `globs.sh` script for wildcards related exercises, unless otherwise mentioned. + +>![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files. You can delete such practice directories afterwards. + +**1)** Use the `echo` command to display the text as shown below. Use appropriate quoting as necessary. + +```nohighlight +# ??? +that's great! $x = $y + $z +``` + +**2)** Use the `echo` command to display the values of the three variables in the format as shown below. + +```bash +$ n1=10 +$ n2=90 +$ op=100 + +# ??? +10 + 90 = 100 +``` + +**3)** What will be the output of the command shown below? + +```bash +$ echo $'\x22apple\x22: \x2710\x27' +``` + +**4)** List filenames starting with a digit character. + +```bash +# change to the 'scripts' directory and source the 'globs.sh' script +$ source globs.sh + +# ??? +100.sh 42.txt +``` + +**5)** List filenames whose extension do not begin with `t` or `l`. Assume extensions will have at least one character. + +```bash +# ??? +100.sh calc.py hello.py hi.sh main.c math.h +``` + +**6)** List filenames whose extension only have a single character. + +```bash +# ??? +main.c math.h +``` + +**7)** List filenames whose extension is not `txt`. + +```bash +# ??? +100.sh hello.py main.c report-00.log report-04.log +calc.py hi.sh math.h report-02.log report-98.log +``` + +**8)** Describe the wildcard pattern used in the command shown below. + +```bash +$ ls *[^[:word:]]*.* +report-00.log report-02.log report-04.log report-98.log +``` + +**9)** List filenames having only lowercase alphabets before the extension. + +```bash +# ??? +calc.py hello.py hi.sh ip.txt main.c math.h notes.txt +``` + +**10)** List filenames starting with `ma` or `he` or `hi`. + +```bash +# ??? +hello.py hi.sh main.c math.h +``` + +**11)** What commands would you use to get the outputs shown below? Assume that you do not know the depth of sub-directories. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# filenames ending with '.txt' +# ??? +ip.txt todos/books.txt todos/outing.txt + +# directories starting with 'c' or 'd' or 'g' or 'r' or 't' +# ??? +backups/dot_files/ +projects/calculator/ +projects/tictactoe/ +todos/ +``` + +**12)** Create and change to an empty directory. Then, use brace expansion along with relevant commands to get the results shown below. + +```bash +# ??? +$ ls report* +report_2020.txt report_2021.txt report_2022.txt + +# use 'cp' command here +# ??? +$ ls report* +report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt +``` + +**13)** What does the `set` builtin command do? + +**14)** What does the `|` pipe operator do? And when would you add the `tee` command? + +**15)** Can you infer what the following command does? *Hint*: see `help printf`. + +```bash +$ printf '%s\n' apple car dragon +apple +car +dragon +``` + +**16)** Use brace expansion along with relevant commands and shell features to get the result shown below. *Hint*: see previous question. + +```bash +$ ls ip.txt +ls: cannot access 'ip.txt': No such file or directory + +# ??? +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +``` + +**17)** With `ip.txt` containing text as shown in the previous question, use brace expansion and relevant commands to get the result shown below. + +```bash +# ??? +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +apple_1_banana_6 +apple_1_banana_7 +apple_1_banana_8 +apple_2_banana_6 +apple_2_banana_7 +apple_2_banana_8 +apple_3_banana_6 +apple_3_banana_7 +apple_3_banana_8 +``` + +**18)** What are the differences between `<` and `|` shell operators, if any? + +**19)** Which character is typically used to represent `stdin` data as a file argument? + +**20)** What do the following operators do? + +*a)* `1>` +*b)* `2>` +*c)* `&>` +*d)* `&>>` +*e)* `|&` + +**21)** What will be the contents of `op.txt` if you use the following `grep` command? + +```bash +# press Ctrl+d after the line containing 'histogram' +$ grep 'hi' > op.txt +hi there +this is a sample line +have a nice day +histogram + +$ cat op.txt +``` + +**22)** What will be the contents of `op.txt` if you use the following commands? + +```bash +$ qty=42 +$ cat << end > op.txt +> dragon +> unicorn +> apple $qty +> ice cream +> end + +$ cat op.txt +``` + +**23)** Correct the command to get the expected output shown below. + +```bash +$ books='cradle piranesi soulhome bastion' + +# something is wrong with this command +$ sed 's/\b\w/\u&/g' <<< '$books' +$Books + +# ??? +Cradle Piranesi Soulhome Bastion +``` + +**24)** Correct the command to get the expected output shown below. + +```bash +# something is wrong with this command +$ echo 'hello' ; seq 3 > op.txt +hello +$ cat op.txt +1 +2 +3 + +# ??? +$ cat op.txt +hello +1 +2 +3 +``` + +**25)** What will be the output of the following commands? + +```bash +$ printf 'hello' | tr 'a-z' 'A-Z' && echo ' there' + +$ printf 'hello' | tr 'a-z' 'A-Z' || echo ' there' +``` + +**26)** Correct the command(s) to get the expected output shown below. + +```bash +# something is wrong with these commands +$ nums=$(seq 3) +$ echo $nums +1 2 3 + +# ??? +1 +2 +3 +``` + +**27)** Will the following two commands produce equivalent output? If not, why not? + +```bash +$ paste -d, <(seq 3) <(printf '%s\n' item_{1..3}) + +$ printf '%s\n' {1..3},item_{1..3} +``` + +
+ +## Viewing Part or Whole File Contents + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which option(s) would you use to get the output shown below? + +```bash +$ printf '\n\n\ndragon\n\n\nunicorn\n\n\n' | cat # ??? + + 1 dragon + + 2 unicorn + +``` + +**2)** Pass appropriate arguments to the `cat` command to get the output shown below. + +```bash +$ cat greeting.txt +Hi there +Have a nice day + +$ echo '42 apples and 100 bananas' | cat # ??? +42 apples and 100 bananas +Hi there +Have a nice day +``` + +**3)** Will the two commands shown below produce the same output? If not, why not? + +```bash +$ cat fruits.txt ip.txt | tac + +$ tac fruits.txt ip.txt +``` + +**4)** Go through the manual for the `tac` command and use appropriate options and arguments to get the output shown below. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +# ??? +%=%= +brown +green +%=%= +apple +banana +``` + +**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? + +**6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? + +**7)** Use appropriate commands and shell features to get the output shown below. + +```bash +$ printf 'carpet\njeep\nbus\n' +carpet +jeep +bus + +# use the above 'printf' command for input data +$ c=# ??? +$ echo "$c" +car +``` + +**8)** How would you display all the input lines except the first one? + +```bash +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? +fig +carpet +jeep +bus +``` + +**9)** Which command(s) would you use to get the output shown below? + +```bash +$ cat fruits.txt +banana +papaya +mango +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +# ??? +banana +papaya +%=%= +apple +``` + +**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. + +```bash +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? +carp +``` + +**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. + +```bash +# ??? +brown banana +``` + +**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. + +```bash +# ??? +mango + 3.14 +``` + +
+ +## Searching Files and Filenames + +>![info](../images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. + +>![info](../images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. + +**1)** Display lines containing `an` from the input files `blocks.txt`, `ip.txt` and `uniform.txt`. Show the results with and without filename prefix. + +```bash +# ??? +blocks.txt:banana +ip.txt:light orange +uniform.txt:mango + +# ??? +banana +light orange +mango +``` + +**2)** Display lines containing the whole word `he` from the `sample.txt` input file. + +```bash +# ??? +14) He he he +``` + +**3)** Match only whole lines containing `car` irrespective of case. The matching lines should be displayed with line number prefix as well. + +```bash +$ printf 'car\nscared\ntar car par\nCar\n' | grep # ??? +1:car +4:Car +``` + +**4)** Display all lines from `purchases.txt` except those that contain `tea`. + +```bash +# ??? +coffee +washing powder +coffee +toothpaste +soap +``` + +**5)** Display all lines from `sample.txt` that contain `do` but not `it`. + +```bash +# ??? +13) Much ado about nothing +``` + +**6)** For the input file `sample.txt`, filter lines containing `do` and also display the line that comes after such a matching line. + +```bash +# ??? + 6) Just do-it + 7) Believe it +-- +13) Much ado about nothing +14) He he he +``` + +**7)** For the input file `sample.txt`, filter lines containing `are` or `he` as whole words as well as the line that comes before such a matching line. Go through `info grep` or the [online manual](https://www.gnu.org/software/grep/manual/grep.html) and use appropriate options such that there's no separator between the groups of matching lines in the output. + +```bash +# ??? + 3) Hi there + 4) How are you +13) Much ado about nothing +14) He he he +``` + +**8)** Extract all pairs of `()` with/without text inside them, provided they do not contain `()` characters inside. + +```bash +$ echo 'I got (12) apples' | grep # ??? +(12) + +$ echo '((2 +3)*5)=25 and (4.3/2*()' | grep # ??? +(2 +3) +() +``` + +**9)** For the given input, match all lines that start with `den` or end with `ly`. + +```bash +$ lines='reply\n1 dentist\n2 lonely\neden\nfly away\ndent\n' + +$ printf '%b' "$lines" | grep # ??? +reply +2 lonely +dent +``` + +**10)** Extract words starting with `s` and containing both `e` and `t` in any order. + +```bash +$ words='sequoia subtle exhibit sets tests sit store_2' + +$ echo "$words" | grep # ??? +subtle +sets +store_2 +``` + +**11)** Extract all whole words having the same first and last word character. + +```bash +$ echo 'oreo not a _oh_ pip roar took 22' | grep # ??? +oreo +a +_oh_ +pip +roar +22 +``` + +**12)** Match all input lines containing `*[5]` literally. + +```bash +$ printf '4*5]\n(9-2)*[5]\n[5]*3\nr*[5\n' | grep # ??? +(9-2)*[5] +``` + +**13)** Match whole lines that start with `hand` and immediately followed by `s` or `y` or `le` or no further character. + +```bash +$ lines='handed\nhand\nhandy\nunhand\nhands\nhandle\nhandss\n' + +$ printf '%b' "$lines" | grep # ??? +hand +handy +hands +handle +``` + +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. + +```bash +$ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep # ??? +fig +dog + +$ echo 'dragon,42,unicorn,3.14,shapeshifter\n' | grep # ??? +42,unicorn,3.14 +``` + +**15)** Recursively search for files containing `ello`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +projects/python/hello.py +projects/shell/hello.sh +colors_1 +colors_2 +``` + +**16)** Search for files containing `blue` recursively, but do not search within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +.hidden +colors_1 +colors_2 +``` + +**17)** Search for files containing `blue` recursively, but not if the file also contains `teal`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +.hidden +colors_2 +backups/color list.txt +``` + +**18)** Find all regular files within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'find.sh' script +$ source find.sh + +# ??? +backups/dot_files/.bashrc +backups/dot_files/.inputrc +backups/dot_files/.vimrc +backups/aug.log +backups/bookmarks.html +backups/jan.log +``` + +**19)** Find all regular files whose extension starts with `p` or `s` or `v`. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./hi.sh +./backups/dot_files/.vimrc +./hello_world.py +``` + +**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. + +```bash +# ??? +./todos/TRIP.txt +./todos/wow.txt +``` + +**21)** Find all regular files whose path has at least one directory name starting with `p` or `d`. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**22)** Find all directories whose name contains `b` or `d`. + +```bash +# ??? +./todos +./backups +./backups/dot_files +``` + +**23)** Find all hidden directories. + +```bash +# ??? +./projects/.venv +``` + +**24)** Find all regular files at exact depth of `2`. + +```bash +# ??? +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**25)** What's the difference between `find -mtime` and `find -atime`? And, what is the time period these options work with? + +**26)** Find all empty regular files. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**27)** Create a directory named `filtered_files`. Then, copy all regular files that are greater than `1` byte in size but whose name don't end with `.log` to this directory. + +```bash +# ??? +$ ls -A filtered_files +hello_world.py .hidden hi.sh ip.txt +``` + +**28)** Find all hidden files, but not if they are part of the `filtered_files` directory created earlier. + +```bash +# ??? +./.hidden +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**29)** Delete the `filtered_files` directory created earlier. Then, go through the `find` manual and figure out how to list only executable files. + +```bash +# ??? +./hi.sh +./hello_world.py +``` + +**30)** List at least one use case for piping the `find` output to the `xargs` command instead of using the `find -exec` option. + +**31)** How does the `locate` command work faster than the equivalent `find` command? + +
+ +## File Properties + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. + +>![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. + +**1)** Save the number of lines in the `greeting.txt` input file to the `lines` shell variable. + +```bash +# ??? +$ echo "$lines" +2 +``` + +**2)** What do you think will be the output of the following command? + +```bash +$ echo 'dragons:2 ; unicorns:10' | wc -w +``` + +**3)** Use appropriate options and arguments to get the output shown below. + +```bash +$ printf 'apple\nbanana\ncherry' | wc # ??? + 15 183 sample.txt + 2 19 - + 17 202 total +``` + +**4)** Go through the `wc` manual and use appropriate options and arguments to get the output shown below. + +```bash +$ printf 'greeting.txt\0scores.csv' | wc # ??? +2 6 25 greeting.txt +4 4 70 scores.csv +6 10 95 total +``` + +**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? + +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +# ??? find+du +16K ./projects/errors.log +7.4M ./report.log + +# ??? ls and shell features + 16K projects/errors.log +7.4M report.log +``` + +**7)** Report sizes of files/directories in the current path in powers of `1000` without descending into sub-directories. Also, show a total at the end. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +# ??? +50k projects +7.7M report.log +8.2k todos +7.8M total +``` + +**8)** What does the `du --apparent-size` option do? + +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? + +**10)** Display the size of `scores.csv` and `timings.txt` files in the format shown below. + +```bash +$ stat # ??? +scores.csv: 70 +timings.txt: 49 +``` + +**11)** Which `touch` option will help you prevent file creation if it doesn't exist yet? + +**12)** Assume `new_file.txt` doesn't exist in the current working directory. What would be the output of the `stat` command shown below? + +```bash +$ touch -t '202010052010.05' new_file.txt +$ stat -c '%y' new_file.txt +# ??? +``` + +**13)** Is the following `touch` command valid? If so, what would be the output of the `stat` command that follows? + +```bash +# change to the 'scripts' directory and source the 'touch.sh' script +$ source touch.sh + +$ stat -c '%n: %y' fruits.txt +fruits.txt: 2017-07-13 13:54:03.576055933 +0530 + +$ touch -r fruits.txt f{1..3}.txt +$ stat -c '%n: %y' f*.txt +# ??? +``` + +**14)** Use appropriate option(s) to get the output shown below. + +```bash +$ printf 'αλεπού\n' | file - +/dev/stdin: UTF-8 Unicode text + +$ printf 'αλεπού\n' | file # ??? +UTF-8 Unicode text +``` + +**15)** Is the following command valid? If so, what would be the output? + +```bash +$ basename -s.txt ~///test.txt/// +# ??? +``` + +**16)** Given the file path in the shell variable `p`, how'd you obtain the output shown below? + +```bash +$ p='~/projects/square_tictactoe/python/game.py' +$ dirname # ??? +~/projects/square_tictactoe +``` + +**17)** Explain what each of the characters mean in the following `stat` command's output. + +```bash +$ stat -c '%A' ../scripts/ +drwxrwxr-x +``` + +**18)** What would be the output of the second `stat` command shown below? + +```bash +$ touch new_file.txt +$ stat -c '%a %A' new_file.txt +664 -rw-rw-r-- + +$ chmod 546 new_file.txt +$ stat -c '%a %A' new_file.txt +# ??? +``` + +**19)** How would you specify directory permissions using the `mkdir` command? + +```bash +# instead of this +$ mkdir back_up +$ chmod 750 back_up +$ stat -c '%a %A' back_up +750 drwxr-x--- +$ rm -r back_up + +# do this +$ mkdir # ??? +$ stat -c '%a %A' back_up +750 drwxr-x--- +``` + +**20)** Change the file permission of `book_list.txt` to match the output of the second `stat` command shown below. Don't use the number `220`, specify the changes in terms of `rwx` characters. + +```bash +$ touch book_list.txt +$ stat -c '%a %A' book_list.txt +664 -rw-rw-r-- + +# ??? +$ stat -c '%a %A' book_list.txt +220 --w--w---- +``` + +**21)** Change the permissions of `test_dir` to match the output of the second `stat` command shown below. Don't use the number `757`, specify the changes in terms of `rwx` characters. + +```bash +$ mkdir test_dir +$ stat -c '%a %A' test_dir +775 drwxrwxr-x + +# ??? +$ stat -c '%a %A' test_dir +757 drwxr-xrwx +``` + +
+ +## Managing Processes + +**1)** How would you invoke a command to be executed in the background? And what would you do to push a job to the background after it has already been launched? What commands can you use to track active jobs? + +**2)** What do `+` and `-` symbols next to job numbers indicate? + +**3)** When would you use `fg %n` and `bg %n` instead of just `fg` and `bg` respectively? + +**4)** Which option will help you customize the output fields needed for the `ps` command? + +**5)** What's the difference between `pgrep -a` and `pgrep -l` options? + +**6)** If the job number is `2`, would you use `kill %2` or `kill 2` to send `SIGTERM` to that process? + +**7)** Which signal does the `Ctrl+c` shortcut send to the currently running process? + +**8)** Which command helps you to continuously monitor processes, along with details like PID, memory usage, etc? + +**9)** Which key will help you manipulate kill tasks from within the `top` session? + +**10)** What does the `free` command do? + +
+ +## Multipurpose Text Processing Tools + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. + +```bash +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' +a1:0xA0, a2:0xA0A1 +b1:0xFF, b2:0xBE + +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' | sed # ??? +a1:0x50, a2:0x50A1 +b1:0x7F, b2:0xBE +``` + +**2)** Remove only the third line from the given input. + +```bash +$ seq 34 37 | # ??? +34 +35 +37 +``` + +**3)** For the input file `sample.txt`, display all lines that contain `it` but not `do`. + +```bash +# ??? + 7) Believe it +``` + +**4)** For the input file `purchases.txt`, delete all lines containing `tea`. Also, replace all occurrences of `coffee` with `milk`. Write back the changes to the input file itself. The original contents should get saved to `purchases.txt.orig`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +# ??? +$ ls purchases* +purchases.txt purchases.txt.orig +$ cat purchases.txt +milk +washing powder +milk +toothpaste +soap + +# restore the contents +# ??? +$ ls purchases* +purchases.txt +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea +``` + +**5)** For the input file `sample.txt`, display all lines from the start of the file till the first occurrence of `are`. + +```bash +# ??? + 1) Hello World + 2) + 3) Hi there + 4) How are you +``` + +**6)** Delete all groups of lines from a line containing `start` to a line containing `end` for the `uniform.txt` input file. + +```bash +# ??? +mango +icecream +how are you +have a nice day +par,far,mar,tar +``` + +**7)** Replace all occurrences of `42` with `[42]` unless it is at the edge of a word. + +```bash +$ echo 'hi42bye nice421423 bad42 cool_4242a 42c' | sed # ??? +hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c +``` + +**8)** Replace all whole words with `X` that start and end with the same word character. + +```bash +$ echo 'oreo not a _a2_ roar took 22' | sed # ??? +X not X X X took X +``` + +**9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. + +```bash +$ cat anchors.txt +# Regular Expressions +## Subexpression calls +## The dot meta character + +$ sed # ??? +[Regular Expressions](#regular-expressions) +[Subexpression calls](#subexpression-calls) +[The dot meta character](#the-dot-meta-character) +``` + +**10)** Replace all occurrences of `e` with `3` except the first two matches. + +```bash +$ echo 'asset sets tests site' | sed # ??? +asset sets t3sts sit3 + +$ echo 'sample item teem eel' | sed # ??? +sample item t33m 33l +``` + +**11)** The below sample strings use `,` as the delimiter and the field values can be empty as well. Use `sed` to replace only the third field with `42`. + +```bash +$ echo 'lion,,ant,road,neon' | sed # ??? +lion,,42,road,neon +$ echo ',,,' | sed # ??? +,,42, +``` + +**12)** For the input file `table.txt`, calculate and display the product of numbers in the last field of each line. Consider space as the field separator for this file. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# ??? +-923.16 +``` + +**13)** Extract the contents between `()` or `)(` from each of the input lines. Assume that the `()` characters will be present only once every line. + +```bash +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' +apple(ice)pie +(almond)pista +yo)yoyo(yo + +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' | awk # ??? +ice +almond +yoyo +``` + +**14)** For the input file `scores.csv`, display the `Name` and `Physics` fields in the format shown below. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name:Physics +Ith:100 +Cy:98 +Lin:83 +``` + +**15)** Extract and display third and first words in the format shown below. + +```bash +$ echo '%whole(Hello)--{doubt}==ado==' | # ??? +doubt:whole + +$ echo 'just,\joint*,concession_42<=nice' | # ??? +concession_42:just +``` + +**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. + +```bash +$ awk # ??? +Name,Maths,Physics,Chemistry,GP +Ith,100,100,100,100 +Cy,97,98,95,96.75 +Lin,78,83,80,79.75 +``` + +**17)** From the `para.txt` input file, display all paragraphs containing any digit character. + +```bash +$ cat para.txt +hi there +how are you + +2 apples +12 bananas + + +blue sky +yellow sun +brown earth + +$ awk # ??? +2 apples +12 bananas +``` + +**18)** Input has the ASCII NUL character as the record separator. Change it to dot and newline characters as shown below. + +```bash +$ printf 'apple\npie\0banana\ncherry\0' | awk # ??? +apple +pie. +banana +cherry. +``` + +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. + +```bash +# ??? + 6) Just do-it +``` + +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +$ awk -v n=1 # ??? +%=%= +apple +banana +$ awk -v n=2 # ??? +%=%= +brown +green +``` + +**21)** Display lines present in `c1.txt` but not in `c2.txt` using the `awk` command. + +```bash +$ awk # ??? +Brown +Purple +Teal +``` + +**22)** Display lines from `scores.csv` by matching the first field based on a list of names from the `names.txt` file. + +```bash +$ printf 'Ith\nLin\n' > names.txt + +$ awk # ??? +Ith,100,100,100 +Lin,78,83,80 + +$ rm names.txt +``` + +**23)** Retain only the first copy of duplicate lines from the `duplicates.txt` input file. Use only the contents of the last field for determining duplicates. + +```bash +$ cat duplicates.txt +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +yellow,toy,flower,333 +white,sky,bread,111 +light red,purse,rose,333 + +# ??? +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +``` + +**24)** For the input file `table.txt`, print input lines if the second field starts with `b`. Construct solutions using `awk` and `perl`. + +```bash +$ awk # ??? +brown bread mat hair 42 +yellow banana window shoes 3.14 + +$ perl # ??? +brown bread mat hair 42 +yellow banana window shoes 3.14 +``` + +**25)** For the input file `table.txt`, retain only the second last field. Write back the changes to the input file itself. The original contents should get saved to `table.txt.bkp`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +$ perl # ??? +$ ls table* +table.txt table.txt.bkp +$ cat table.txt +hair +shirt +shoes + +# restore the contents +# ??? +$ ls table* +table.txt +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**26)** Reverse the first field contents of `table.txt` input file. + +```bash +# ??? +nworb bread mat hair 42 +eulb cake mug shirt -7 +wolley banana window shoes 3.14 +``` + +**27)** Sort the given comma separated input lexicographically. Change the output field separator to a `:` character. + +```bash +$ ip='floor,bat,to,dubious,four' +$ echo "$ip" | perl # ??? +bat:dubious:floor:four:to +``` + +**28)** Filter fields containing digit characters. + +```bash +$ ip='5pearl 42 east 1337 raku_6 lion 3.14' +$ echo "$ip" | perl # ??? +5pearl 42 1337 raku_6 3.14 +``` + +**29)** The input shown below has several words ending with digit characters. Change the words containing `test` to match the output shown below. That is, renumber the matching portions to `1`, `2`, etc. Words not containing `test` should not be changed. + +```bash +$ ip='test_12:test123\nanother_test_4,no_42\n' +$ printf '%b' "$ip" +test_12:test123 +another_test_4,no_42 + +$ printf '%b' "$ip" | perl # ??? +test_1:test2 +another_test_3,no_42 +``` + +**30)** For the input file `table.txt`, change contents of the third field to all uppercase. Construct solutions using `sed`, `awk` and `perl`. + +```bash +$ sed # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ awk # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ perl # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 +``` + +
+ +## Sorting Stuff + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Default `sort` doesn't work for numbers. Correct the command used below: + +```bash +# wrong output +$ printf '100\n10\n20\n3000\n2.45\n' | sort +10 +100 +20 +2.45 +3000 + +# expected output +$ printf '100\n10\n20\n3000\n2.45\n' | sort # ??? +2.45 +10 +20 +100 +3000 +``` + +**2)** Which `sort` option will help you ignore case? + +```bash +$ printf 'Super\nover\nRUNE\ntea\n' | LC_ALL=C sort # ??? +over +RUNE +Super +tea +``` + +**3)** Go through the `sort` manual and use appropriate options to get the output shown below. + +```bash +# wrong output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort -n +-1.53 ++120 +3.14e+4 +42.1e-2 + +# expected output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort # ??? +-1.53 +42.1e-2 ++120 +3.14e+4 +``` + +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](./shell-features.md) chapter. + +```bash +# ??? +Name,Maths,Physics,Chemistry +Lin,78,83,80 +Cy,97,98,95 +Ith,100,100,100 +``` + +**5)** Sort the contents of `duplicates.txt` by the fourth column numbers in descending order. Retain only the first copy of lines with the same number. + +```bash +# ??? +dark red,sky,rose,555 +blue,ruby,water,333 +dark red,ruby,rose,111 +brown,toy,bread,42 +``` + +**6)** Will `uniq` throw an error if the input is not sorted? What do you think will be the output for the following input? + +```bash +$ printf 'red\nred\nred\ngreen\nred\nblue\nblue' | uniq +# ??? +``` + +**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. + +```bash +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' +3) cherry +1) apple +2) banana +1) almond + +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' | # ??? +2) banana +3) cherry +``` + +**8)** Count the number of times input lines are repeated and display the results in the format shown below. + +```bash +$ printf 'brown\nbrown\nbrown\ngreen\nbrown\nblue\nblue' | # ??? + 1 green + 2 blue + 4 brown +``` + +**9)** Display lines present in `c1.txt` but not in `c2.txt` using the `comm` command. Assume that the input files are already sorted. + +```bash +# ??? +Brown +Purple +Teal +``` + +**10)** Use appropriate options to get the expected output shown below. + +```bash +# wrong usage, no output +$ join <(printf 'apple 2\nfig 5') <(printf 'Fig 10\nmango 4') + +# expected output +# ??? +fig 5 10 +``` + +**11)** What are the differences between `sort -u` and `uniq -u` options, if any? + +
+ +## Comparing Files + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? + +**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. + +```bash +$ echo '1) apple' > x1.txt +$ echo '2. apple' > x2.txt +$ cmp x1.txt x2.txt +x1.txt x2.txt differ: byte 1, line 1 + +$ cmp # ??? +$ echo $? +0 + +$ rm x[12].txt +``` + +**3)** What does the `diff -d` option do? + +**4)** Which option will help you get colored output with `diff`? + +**5)** Use appropriate options to get the desired output shown below. + +```bash +# instead of this output +$ diff -W 40 --suppress-common-lines -y f1.txt f2.txt +2 | hello +world | 4 + +# get this output +$ diff # ??? +1 ( +2 | hello +3 ( +world | 4 +``` + +**6)** Use appropriate options to get the desired output shown below. + +```bash +$ echo 'hello' > d1.txt +$ echo 'Hello' > d2.txt + +# instead of this output +$ diff d1.txt d2.txt +1c1 +< hello +--- +> Hello + +# get this output +$ diff # ??? +Files d1.txt and d2.txt are identical + +$ rm d[12].txt +``` + +
+ +## Assorted Text Processing Tools + +>![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Generate the following sequence. + +```bash +# ??? +100 +95 +90 +85 +80 +``` + +**2)** Is the sequence shown below possible to generate with `seq`? If so, how? + +```bash +# ??? +01.5,02.5,03.5,04.5,05.5 +``` + +**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. + +```bash +# ??? +supplemental +foresight +underestimates +``` + +**4)** Briefly describe the purpose of the `shuf` command options `-i`, `-e` and `-r`. + +**5)** Why does the below command not work as expected? What other tools can you use in such cases? + +```bash +# not working as expected +$ echo 'apple,banana,cherry,dates' | cut -d, -f3,1,3 +apple,cherry + +# expected output +# ??? +cherry,apple,cherry +``` + +**6)** Display except the second field in the format shown below. Can you construct two different solutions? + +```bash +$ echo 'apple,banana,cherry,dates' | cut # ??? +apple cherry dates + +$ echo '2,3,4,5,6,7,8' | cut # ??? +2 4 5 6 7 8 +``` + +**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? + +```bash +$ printf 'apple\nbanana\ncherry\ndates\n' | cut # ??? +app +ban +che +dat +``` + +**8)** Display only the first and third columns of the `scores.csv` input file in the format as shown below. Note that only space characters are present between the two columns, not tab. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name Physics +Ith 100 +Cy 98 +Lin 83 +``` + +**9)** Display the contents of `table.txt` in the format shown below. + +```bash +# ??? +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**10)** Implement [ROT13](https://en.wikipedia.org/wiki/ROT13) cipher using the `tr` command. + +```bash +$ echo 'Hello World' | tr # ??? +Uryyb Jbeyq +$ echo 'Uryyb Jbeyq' | tr # ??? +Hello World +``` + +**11)** Retain only alphabets, digits and whitespace characters. + +```bash +$ echo 'Apple_42 cool,blue Dragon:army' | # ??? +Apple42 coolblue Dragonarmy +``` + +**12)** Use `tr` to get the output shown below. + +```bash +$ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr # ??? +how are you +``` + +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? + +```bash +# this works individually for each input file +$ paste -sd, fruits.txt ip.txt +banana,papaya,mango +deep blue,light orange,blue delight + +# expected output +# ??? +banana,papaya,mango,deep blue,light orange,blue delight +``` + +**14)** Use appropriate options to get the expected output shown below. + +```bash +# default output +$ paste fruits.txt ip.txt +banana deep blue +papaya light orange +mango blue delight + +# expected output +$ paste # ??? +banana +deep blue +papaya +light orange +mango +blue delight +``` + +**15)** Use the `pr` command to get the expected output shown below. + +```bash +$ seq -w 16 | pr # ??? +01,02,03,04 +05,06,07,08 +09,10,11,12 +13,14,15,16 + +$ seq -w 16 | pr # ??? +01,05,09,13 +02,06,10,14 +03,07,11,15 +04,08,12,16 +``` + +**16)** Use the `pr` command to join the input files `fruits.txt` and `ip.txt` as shown below. + +```bash +# ??? +banana : deep blue +papaya : light orange +mango : blue delight +``` + +**17)** The `cut` command doesn't support a way to choose the last `N` fields. Which tool presented in this chapter can be combined to work with `cut` to get the output shown below? + +```bash +# last two characters from each line +$ printf 'apple\nbanana\ncherry\ndates\n' | # ??? +le +na +ry +es +``` + +**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. + +```bash +# split input by 3 lines (max) at a time +# ??? + +$ head xa? +==> xaa <== +coffee +tea +washing powder + +==> xab <== +coffee +toothpaste +tea + +==> xac <== +soap +tea + +$ rm xa? +``` + +**19)** Go through `split` documentation and use appropriate options to get the output shown below. + +```bash +$ echo 'apple,banana,cherry,dates' | split # ??? + +$ head xa? +==> xaa <== +apple, +==> xab <== +banana, +==> xac <== +cherry, +==> xad <== +dates + +$ rm xa? +``` + +**20)** Split the input file `purchases.txt` such that the text before a line containing `powder` is part of the first file and the rest are part of the second file as shown below. + +```bash +# ??? + +$ head xx0? +==> xx00 <== +coffee +tea + +==> xx01 <== +washing powder +coffee +toothpaste +tea +soap +tea + +$ rm xx0? +``` + +**21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name,Ith,Cy,Lin +Maths,100,97,78 +Physics,100,98,83 +Chemistry,100,95,80 +``` + +**22)** Reshape the contents of `table.txt` to the expected output shown below. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# ??? +brown bread mat hair +42 blue cake mug +shirt -7 yellow banana +window shoes 3.14 +``` + +
+ +## Shell Scripting + +>![info](../images/info.svg) Use a temporary working directory before attempting the exercises. You can delete such practice directories afterwards. + +**1)** What's wrong with the script shown below? Also, will the error go away if you use `bash try.sh` instead? + +```bash +$ printf ' \n!#/bin/bash\n\necho hello\n' > try.sh +$ chmod +x try.sh +$ ./try.sh +./try.sh: line 2: !#/bin/bash: No such file or directory +hello + +# expected output +$ ./try.sh +hello +``` + +**2)** Will the command shown below work? If so, what would be the output? + +```bash +$ echo echo hello | bash +``` + +**3)** When would you `source` a script instead of using `bash` or creating an executable using shebang? + +**4)** How would you display the contents of a variable with `shake` appended? + +```bash +$ fruit='banana' + +$ echo # ??? +bananashake +``` + +**5)** What changes would you make to the code shown below to get the expected output? + +```bash +# default behavior +$ n=100 +$ n+=100 +$ echo "$n" +100100 + +# expected output +$ echo "$n" +200 +``` + +**6)** Is the following code valid? If so, what would be the output of the `echo` command? + +```bash +$ declare -a colors +$ colors[3]='green' +$ colors[1]='blue' + +$ echo "${colors[@]}" +# ??? +``` + +**7)** How would you get the last three characters of a variable's contents? + +```bash +$ fruit='banana' + +# ??? +ana +``` + +**8)** Will the second `echo` command give an error? If not, what will be the output? + +```bash +$ fruits=('apple' 'fig' 'mango') +$ echo "${#fruits[@]}" +3 + +$ echo "${#fruits}" +# ??? +``` + +**9)** For the given array, use parameter expansion to remove characters until first/last space. + +```bash +$ colors=('green' 'dark brown' 'deep sky blue white') + +# remove till first space +$ printf '%s\n' # ??? +green +brown +sky blue white + +# remove till last space +$ printf '%s\n' # ??? +green +brown +white +``` + +**10)** Use parameter expansion to get the expected outputs shown below. + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo # ??? +apple:banana:cherry + +$ echo # ??? +apple +``` + +**11)** Is it possible to achieve the expected outputs shown below using parameter expansion? If so, how? + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo # ??? +apple 42 dragon + +$ echo # ??? +fig:banana:cherry:dragon + +$ echo # ??? +apple:banana:cherry:end +``` + +**12)** For the given input, change case as per the expected outputs shown below. + +```bash +$ ip='This is a Sample STRING' + +$ echo # ??? +THIS IS A SAMPLE STRING + +$ echo # ??? +this is a sample string + +$ echo # ??? +tHIS IS A sAMPLE string +``` + +**13)** Why does the conditional expression shown below fail? + +```bash +$ touch ip.txt +$ [[-f ip.txt]] && echo 'file exists' +[[-f: command not found +``` + +**14)** What is the difference between `==` and `=~` string comparison operators? + +**15)** Why does the conditional expression used below show `failed` both times? Modify the expressions such that the first one correctly says `matched` instead of `failed`. + +```bash +$ f1='1234.txt' +$ f2='report_2.txt' + +$ [[ $f1 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed +$ [[ $f2 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed +``` + +**16)** Extract the digits that follow a `:` character for the given variable contents. + +```bash +$ item='chocolate:50' +# ??? +50 + +$ item='50 apples, fig:100, books-12' +# ??? +100 +``` + +**17)** Modify the expression shown below to correctly report `true` instead of `false`. + +```bash +$ num=12345 +$ [[ $num > 3 ]] && echo 'true' || echo 'false' +false +``` + +**18)** Write a shell script named `array.sh` that accepts array input from the user followed by another input as index. Display the corresponding value at that index. Couple of examples are shown below. + +```bash +$ bash array.sh +enter array elements: apple banana cherry +enter array index: 1 +element at index '1' is: banana + +$ bash array.sh +enter array elements: dragon unicorn centaur +enter array index: -1 +element at index '-1' is: centaur +``` + +**19)** Write a shell script named `case.sh` that accepts exactly two command line arguments. The first argument can be `lower`, `upper` or `swap` and this should be used to transform the contents of the second argument. Examples script invocations are shown below, including what should happen if the command line arguments do not meet the script expectations. + +```bash +$ ./case.sh upper 'how are you?' +HOW ARE YOU? + +$ ./case.sh lower PineAPPLE +pineapple + +$ ./case.sh swap 'HeLlo WoRlD' +hElLO wOrLd + +$ ./case.sh lower +Error! Two arguments expected. +$ echo $? +1 + +$ ./case.sh upper apple fig +Error! Two arguments expected. + +$ ./case.sh lowercase DRAGON +Error! 'lowercase' command not recognized. +$ echo $? +1 + +$ ./case.sh apple lower 2> /dev/null +$ echo $? +1 +``` + +**20)** Write a shell script named `loop.sh` that displays the number of lines for each of the files passed as command line arguments. + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt + +$ bash loop.sh items_1.txt +number of lines in 'items_1.txt' is: 3 + +$ bash loop.sh items_1.txt items_2.txt +number of lines in 'items_1.txt' is: 3 +number of lines in 'items_2.txt' is: 5 +``` + +**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt +$ printf 'items_1.txt\nitems_2.txt\n' > list.txt + +$ bash read_file.sh list.txt +apple,banana,cherry +dragon,owl,unicorn,troll,centaur + +$ xargs # ??? +apple,banana,cherry +dragon,owl,unicorn,troll,centaur +``` + +**22)** Write a function named `add_path` which prefixes the path of the current working directory to the arguments it receives and displays the results. Examples are shown below. + +```bash +$ add_path() # ??? + +$ cd +$ pwd +/home/learnbyexample +$ add_path ip.txt report.log +/home/learnbyexample/ip.txt /home/learnbyexample/report.log + +$ cd cli-computing +$ pwd +/home/learnbyexample/cli-computing +$ add_path f1 +/home/learnbyexample/cli-computing/f1 +``` + +**23)** What do the options `bash -x` and `bash -v` do? + +**24)** What is `shellcheck` and when would you use it? + +
+ +## Shell Customization + +**1)** Which command would you use to display the name and value of all or specific environment variables? + +**2)** If you add an alias for an already existing command (`ls` for example), how would you invoke the original command instead of the alias? + +**3)** Why doesn't the alias shown below work? What would you use instead? + +```bash +# doesn't work as expected +$ alias ext='echo "${1##*.}"' +$ ext ip.txt + ip.txt + +# expected output +$ ext ip.txt +txt +$ ext scores.csv +csv +$ ext file.txt.txt +txt +``` + +**4)** How would you remove a particular alias/function definition for the current shell session? + +```bash +$ alias hw='echo hello world' +$ hw +hello world +# ??? +$ hw +hw: command not found + +$ hw() { echo hello there ; } +$ hw +hello there +# ??? +$ hw +hw: command not found +``` + +**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. + +```bash +$ echo "$PATH" +/usr/local/bin:/usr/bin:/bin:/usr/games + +# alias +$ a_p +/usr/local/bin +/usr/bin +/bin +/usr/games + +# function +$ f_p +/usr/local/bin +/usr/bin +/bin +/usr/games +``` + +**6)** Will a login shell read and execute `~/.bashrc` automatically? + +**7)** What should be the value assigned to `HISTSIZE` if you wish to have unlimited history entries? + +**8)** What does the binding `set completion-ignore-case on` do? + +**9)** Which shortcut helps you interactively search command history? + +**10)** What do the shortcuts `Alt+b` and `Alt+f` do? + +**11)** Are there differences between the `Ctrl+l` shortcut and the `clear` command? + +**12)** Which shortcut will you use to delete characters before the cursor till the start of the line? + +**13)** What do the shortcuts `Alt+t` and `Ctrl+t` do? + +**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? + diff --git a/images/cli_computing_ls.png b/images/cli_computing_ls.png new file mode 100644 index 0000000000000000000000000000000000000000..f301ff4c5d6cd920446523e2556b639ece9e93d7 GIT binary patch literal 47711 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

6sz>;Y05@PT}(r8{&e7#KfPP-p*7!h#+N3MsI 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 literal 0 HcmV?d00001 diff --git a/images/grep_color.png b/images/grep_color.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b4a11af71dbdffab7aab06df02a6c7b068a9c2 GIT binary patch literal 7924 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

  • %QE6KFw9ZtlpaTNkR%Y1WSc>= zy-GbfnhA2(X+T8d&&z$Sqd(CkyBE6~ruTx~0E|2g@&`DDu4~HCMy*k9Mq*ggI^%j1 zM$(;5{ZDsL^uwbf06Fnfu+`YTH z4%)iC^SyRo?Eof<TgWBLlW4PQ)_ z!l*)|F)0gK%=0;I&2l-Gs8}7Hw6)j_wZ!OT3Bo)%8*nR%^3LjPtYG!Fxb%8lhT54M z!f*c`Z))~I*+f?L{Z8Z zUVoDcH=MHdtaG_GXsV+kOT3kXL@I8(Dpzab(6>DT`#n8v%RL5Dzx;@0!`>V~CnQ`X zh#BsKHaheN#qLzv(D*CtUGvJVkv%YK-x_Lwzlx?hGFjWtFTxz_+pMgpwz!*to=WSW z5jq|euNdW0v=z2HInkno`IcUEiM!C>6z^12$M8%Viu{bCyCHhJ^Ui=h19|9Nef#rr z#g_3G6BIL1N=GX`vPb(yg*JjLe6|gmOKA^X5AI+MA1{{n>Wi_gr+3Szz@0jxzASgx_tj}*0zKR$fSv$Rx6`JB`BoRlhmVyfGYu(W8@28a9gch z{iaN-L^58f6WwPOZr22N&oH=-9Q>r8&J=o>1+_?AnCdHDS3nY?%=TOy94?OvfW7*6 zhn@fNJmjxal7Bc%{Rgi7i-DCxH8ZRp9UOz+u{IcrW~QM*95V z%SeISYidC#P{RSg{}~+0IO>8*JK|!EEl#SAY?5o_H^BvtTl)@ \ No newline at end of file diff --git a/images/ls_color.png b/images/ls_color.png new file mode 100644 index 0000000000000000000000000000000000000000..2eeba4d385c5465db466d327fd4b0c2f910bb464 GIT binary patch literal 12837 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 e0002sKk^%1KH4LZ>J&);0000;q`N^tx*G(^ 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

    Lv17f%cC zE93B9>|}oZz|tlWMLwZj4I-9am-(P)&p@oDByX=m9J&3wJ=*98%BJS7gC&ej71dge z8TyIko+bGnT>Gl3w0!0+(s}_|^|_Yu_E1`E2S)pc`5?zZgqZ9l8uyCfUlPU*} zP}E{_yKOPflX79xlPx>Z@3x|wW+`{y;26Ouon?}lE74f)iGAbow_ApR5NMFM+tC`` z=B!JP!TnEO9QVDYon;R6`inS%1Z&)qFs@v(2%Zuatv3dWFP!~-wMXUuSOufF2-sF4iq8URYr0^_APP5!jaZsTd!3@s{k^_Pnv%cG6S?pMp&ua#Xl~~34Tu1xl zTc0C6Vw$Tz<@@!#o@?uZq3+ZV@8%N_Pm!4$dub6Ktoz9`U{e!2KZUU24>edx5Gzr; zSv?HQNsbDpsL!vSdUTkdLITZozDMtwxfEO5L1lGWvp5@w}?A48&?|@O1rZuG1Sh-_y*T$FkXoOQk7|&gvyn zZqGZlvgT!&b2+_WGr0b_jvCGX$$OzUbeU>TIY?Zup&kaait>MZe%}FM*Sw0w@+c=w zOXBJ0`-|V-5p|a0B{9D_A5p8OUX-!%?l&r|sqQ_Re;wa^tj7Kbqj-d5`CXGs0f@8skbQFs7TVDSX53CO`J|E&i(PJ}2+G zl?6n!-u1;CA=|iVb?+*C8VaH)5f}pca!U@rt6s{NYkg=+F++uOCYY)ntgIfE8^0~M z%8&XOYfnFy=So6lkiDmRf`b&{E_lN5uOzD zf<*=yBW;41P5UCJTf?yUS-cIKqFkT_@MLiPBV9`%#Rfk*tNOh6^*CWeX5fXzC=G+9 zD2{qA=^Ae`WCRA1!@dGoA6_0lCZj=4j<E|TUa_?{i)MsnJmsF z;0$AleoL0S??|*P26500)2hZr`SEog z4vA;I+wC*kgkqRNBvFgsUyD4mL6{nl<0E_X;tVA?VfHF)2)jA1d%7cZ7L95mdt9I8ZQtK}jN=0ug6Wtovh%J(Y`oHuofN5d zd>@qsKs4p69q3|Qto0fx3CoR@KNzl(^DJ|E`IzI*iqjoGD(efi1HI38NZx(BL;aTf z3q6r48O0L;V%Oi>cSiM@w^_J+=ZneaODCk;5+cQIt4r23)l{$z0~1c_L4E z$==HTiX`BOO16$*dbHx^TNiJ@ca3q7!Wp`-Osnkw`0O>eT8O?qfQTS$9-5p}#FS`N za^@*>rfkeCxvRf=(DGBe^eXo(CA50;n@sQ&=^0Zn_|Y_i+&b5SB0LMM{oRN@*81WA?9Lhf{VIMr6pGP`%c4V*O%yL=P#%FdHZnK z#(Bn{c}bjg)1u%9z@PfAC&29iDf4R@HVYR^lMBuUwiSC>E zJDQ%e+}^BD4w>Q8E{;+GWaP;0(-8%-wq5CtdO%@Wgzd}8hIKUsKqk \ No newline at end of file From 7ae720686e5b049e02e4bafbd276270ba7ec51a6 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Sat, 22 Oct 2022 11:36:28 +0530 Subject: [PATCH 68/76] updated readme, added markdown source --- README.md | 57 +- cli_computing.md | 9650 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 9698 insertions(+), 9 deletions(-) create mode 100644 cli_computing.md diff --git a/README.md b/README.md index aba16fc..5eaa398 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ # Computing from the Command Line -⚠️ ⚠️ ⚠️ This is a **work-in-progress** book on Linux command line and Shell Scripting for beginner to intermediate level users. +This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. + +

    + +

    + +The book also includes exercises to test your understanding, which is presented together as a single file in this repo — [exercises.md](./exercises/exercises.md) + +For solutions to the exercises, see [exercise-solutions.md](./exercises/exercise-solutions.md). + +See [Version_changes.md](./Version_changes.md) to keep track of changes made to the book. [Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an earlier version of the book in this repo. -See my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources. +![info](./images/info.svg) See my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources.
    @@ -15,26 +25,55 @@ For web version of the book, visit https://learnbyexample.github.io/cli-computin * Links to pdf/epub versions of the book will be added once they are done * See https://learnbyexample.github.io/books/ for a list of my other books +The book can also be [viewed as a single markdown file in this repo](./cli_computing.md). See my blogpost on [generating pdf from markdown using pandoc](https://learnbyexample.github.io/customizing-pandoc/) if you are interested in the ebook creation process. +
    ## Feedback and Contributing -[Open an issue](https://github.com/learnbyexample/cli-computing/issues) if you spot any typo/errors. - ⚠️ ⚠️ Please DO NOT submit pull requests. Main reason being any modification requires changes in multiple places. -I'd also highly appreciate your feedback about the book. +I would highly appreciate if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. + +You can reach me via: + +* Issue Manager: [https://github.com/learnbyexample/cli-computing/issues](https://github.com/learnbyexample/cli-computing/issues) +* E-mail: `echo 'bGVhcm5ieWV4YW1wbGUubmV0QGdtYWlsLmNvbQo=' | base64 --decode` +* Twitter: [https://twitter.com/learn_byexample](https://twitter.com/learn_byexample) + +
    -Twitter: https://twitter.com/learn_byexample +# Table of Contents + +1. Preface +2. Introduction and Setup +3. Command Line Overview +4. Managing Files and Directories +5. Shell Features +6. Viewing Part or Whole File Contents +7. Searching Files and Filenames +8. File Properties +9. Managing Processes +10. Multipurpose Text Processing Tools +11. Sorting Stuff +12. Comparing Files +13. Assorted Text Processing Tools +14. Shell Scripting +15. Shell Customization
    # Acknowledgements -* [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) — for getting answers on pertinent questions related to cli tools -* [/r/commandline/](https://www.reddit.com/r/commandline), [/r/linux4noobs/](https://www.reddit.com/r/linux4noobs/) and [/r/linux/](https://www.reddit.com/r/linux/) — helpful forums +* [GNU Manuals](https://www.gnu.org/manual/manual.html) — documentation for command line tools and the `bash` shell +* [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) — for getting answers on pertinent questions related to CLI tools +* [tex.stackexchange](https://tex.stackexchange.com/) — for help on [pandoc](https://github.com/jgm/pandoc/) and `tex` related questions +* [/r/commandline/](https://old.reddit.com/r/commandline), [/r/linux4noobs/](https://old.reddit.com/r/linux4noobs/), [/r/linuxquestions/](https://old.reddit.com/r/linuxquestions/) and [/r/linux/](https://old.reddit.com/r/linux/) — helpful forums +* [canva](https://www.canva.com/) — cover image * [Warning](https://commons.wikimedia.org/wiki/File:Warning_icon.svg) and [Info](https://commons.wikimedia.org/wiki/File:Info_icon_002.svg) icons by [Amada44](https://commons.wikimedia.org/wiki/User:Amada44) under public domain -* [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) for optimizing images +* [carbon](https://carbon.now.sh/) — creating terminal screenshots with highlighted text +* [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) — optimizing images +* [Inkscape](https://inkscape.org/) — favicon * [mdBook](https://github.com/rust-lang/mdBook) — for web version of the book * [mdBook-pagetoc](https://github.com/JorelAli/mdBook-pagetoc) — for adding table of contents for each page * [minify-html](https://github.com/wilsonzlin/minify-html) — for minifying html files diff --git a/cli_computing.md b/cli_computing.md new file mode 100644 index 0000000..dd2b7df --- /dev/null +++ b/cli_computing.md @@ -0,0 +1,9650 @@ +# Preface + +This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. + +## Prerequisites + +You should be familiar with basic computer usage, know fundamental terms like files and directories, how to install programs and so on. You should also be already comfortable with programming basics like variables, loops and functions. + +In terms of software, you should have access to the `GNU bash` shell and commonly used Linux command line tools. This could be as part of a Linux distribution or via other means such as a Virtual Machine, WSL (Windows Subsystem for Linux) and so on. More details about the working environment will be discussed in the introductory chapters. + +You are also expected to get comfortable with reading manuals, searching online, visiting external links provided for further reading, tinkering with illustrated examples, asking for help when you are stuck and so on. In other words, be proactive and curious instead of just consuming the content passively. + +See my curated list on [Linux CLI and Shell Scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources. + +## Conventions + +* Code snippets shown are copy pasted from the `bash` shell (version **5.0.17**) and modified for presentation purposes. Some commands are preceded by comments to provide context and explanations, blank lines have been added to improve readability and so on. +* External links are provided throughout the book for you to explore certain topics in more depth. +* The [cli-computing repo](https://github.com/learnbyexample/cli-computing) has all the [example files and scripts](https://github.com/learnbyexample/cli-computing/tree/master/example_files) used in the book. The repo also includes all the [exercises](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercises.md) as a single file, along with a separate [solutions](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercise-solutions.md) file. If you are not familiar with `git` command, click the **Code** button on the webpage to get the files. +* See the [Setup](#setup) section for instructions to create a working environment for following along the contents presented in this book. + +## Acknowledgements + +* [GNU Manuals](https://www.gnu.org/manual/manual.html) — documentation for command line tools and the `bash` shell +* [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) — for getting answers on pertinent questions related to CLI tools +* [tex.stackexchange](https://tex.stackexchange.com/) — for help on [pandoc](https://github.com/jgm/pandoc/) and `tex` related questions +* [/r/commandline/](https://old.reddit.com/r/commandline), [/r/linux4noobs/](https://old.reddit.com/r/linux4noobs/), [/r/linuxquestions/](https://old.reddit.com/r/linuxquestions/) and [/r/linux/](https://old.reddit.com/r/linux/) — helpful forums +* [canva](https://www.canva.com/) — cover image +* [Warning](https://commons.wikimedia.org/wiki/File:Warning_icon.svg) and [Info](https://commons.wikimedia.org/wiki/File:Info_icon_002.svg) icons by [Amada44](https://commons.wikimedia.org/wiki/User:Amada44) under public domain +* [carbon](https://carbon.now.sh/) — creating terminal screenshots with highlighted text +* [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) — optimizing images + +## Feedback and Errata + +I would highly appreciate if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. + +You can reach me via: + +* Issue Manager: [https://github.com/learnbyexample/cli-computing/issues](https://github.com/learnbyexample/cli-computing/issues) +* E-mail: learnbyexample.net@gmail.com +* Twitter: [https://twitter.com/learn_byexample](https://twitter.com/learn_byexample) + +## Author info + +Sundeep Agarwal is a lazy being who prefers to work just enough to support his modest lifestyle. He accumulated vast wealth working as a Design Engineer at Analog Devices and retired from the corporate world at the ripe age of twenty-eight. Unfortunately, he squandered his savings within a few years and had to scramble trying to earn a living. Against all odds, selling programming ebooks saved his lazy self from having to look for a job again. He can now afford all the fantasy ebooks he wants to read and spends unhealthy amount of time browsing the internet. + +When the creative muse strikes, he can be found working on yet another programming ebook (which invariably ends up having at least one example with regular expressions). Researching materials for his ebooks and everyday social media usage drowned his bookmarks, so he maintains curated resource lists for sanity sake. He is thankful for free learning resources and open source tools. His own contributions can be found at [https://github.com/learnbyexample](https://github.com/learnbyexample). + +**List of books:** [https://learnbyexample.github.io/books/](https://learnbyexample.github.io/books/) + +## License + +This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) + +Code snippets are available under [MIT License](https://github.com/learnbyexample/cli-computing/blob/master/LICENSE) + +Resources mentioned in the Acknowledgements section above are available under original licenses. + +## Book version + +1.0 + +See [Version_changes.md](https://github.com/learnbyexample/cli-computing/blob/master/Version_changes.md) to track changes across book versions. + +# Introduction and Setup + +Back in 2007, I had a rough beginning as a design engineer at a semiconductor company in terms of utilizing software tools. Linux command line, Vim and Perl were all new to me. In addition to learning about command line tools from colleagues and supervisors, I remember going through and making notes in a photocopied book (unable to recall the title now). + +The biggest pain points were not knowing about handy options (for example, `grep --color` to highlight matching portions, `find -exec` to apply commands on filtered files, etc) and tools (for example, `xargs` to workaround limitations of too many command line arguments). And then there were tools like `sed` and `awk` with intimidating syntax. I'm at a loss to reason out why I didn't utilize shell scripts much. I stuck to Perl and Vim instead of learning such handy tools. I also did not know about forums like [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) until after I left my job in 2014. + +I started collating what I knew about Linux command line tools when I got chances to conduct scripting course workshops for college students. From 2016 to 2018, I started maintaining my tutorials on Linux command line, Vim and scripting languages as GitHub repos. As you might guess, I then started polishing these materials and [published them as ebooks](https://learnbyexample.github.io/books/). This is an ongoing process, with **Computing from the Command Line** being the thirteenth ebook. + +This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. Plenty of examples are provided to make it easier to understand a particular tool and its various features. External links are provided for further reading. Important notes and warnings are formatted to stand out from normal text. + +Writing a book always has a few pleasant surprises for me. This time I learned handy options like `mkdir -m` and `chmod =`, got better understanding of many shell features and so on. I'm also planning to learn and present more command line tools for the next version of this book. + +This chapter will give a brief introduction to Linux. You'll also see suggestions and instructions for setting up a command line environment to follow along the contents presented in this book. + +## Linux overview + +Quoting selective parts from [wikipedia](https://en.wikipedia.org/wiki/Linux): + +>Linux is a family of open-source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically packaged in a Linux distribution. +> +>Linux was originally developed for personal computers based on the Intel x86 architecture, but has since been ported to more platforms than any other operating system. Because of the dominance of the Linux-based Android on smartphones, Linux also has the largest installed base of all general-purpose operating systems. +> +>Linux is one of the most prominent examples of free and open-source software collaboration. The source code may be used, modified and distributed commercially or non-commercially by anyone under the terms of its respective licenses, such as the GNU General Public License. + +Apart from Linux exposure during my previous job, I've been using Linux as my desktop system since 2014 and it is very well suited for my needs. Compared to my Windows experience, Linux is light weight, secure, stable, fast and more importantly doesn't force you to upgrade hardware. Read the wikipedia article linked above for a more comprehensive coverage about Linux, where it is used and so on. + +## Linux Distros + +Quoting again from [wikipedia](https://en.wikipedia.org/wiki/Linux_distribution): + +>A Linux distribution (often abbreviated as distro) is an operating system made from a software collection that is based upon the Linux kernel and, often, a package management system. Linux users usually obtain their operating system by downloading one of the Linux distributions, which are available for a wide variety of systems ranging from embedded devices (for example, OpenWrt) and personal computers (for example, Linux Mint) to powerful supercomputers (for example, Rocks Cluster Distribution). + +I use Ubuntu, which is beginner friendly. Here are some resources to help you choose a distro: + +* [/r/linux4noobs wiki](https://old.reddit.com/r/linux4noobs/wiki/distro_selection) — selection guide for noobs +* [List of Linux distributions](https://en.wikipedia.org/wiki/List_of_Linux_distributions) — general information about notable Linux distributions in the form of a categorized list +* [DistroWatch](https://distrowatch.com/) — website dedicated to talking about, reviewing and keeping up to date with open source operating systems. This site particularly focuses on Linux distributions and flavours of BSD, though other open source operating systems are sometimes discussed +* [Light Weight Linux Distros](https://en.wikipedia.org/wiki/Light-weight_Linux_distribution) — uses lower memory and/or has less processor-speed requirements than a more "feature-rich" Linux distribution + +## Access to Linux environment + +You'll usually find installation instructions from the respective distro website you wish to install. Alternatively, you can install Linux on a [virtual machine](https://en.wikipedia.org/wiki/Virtual_machine) or try it online. Here are some resources to get you started: + +* [Install Ubuntu desktop](https://ubuntu.com/tutorials/install-ubuntu-desktop) +* [How to run Ubuntu Desktop on a virtual machine using VirtualBox](https://ubuntu.com/tutorials/how-to-run-ubuntu-desktop-on-a-virtual-machine-using-virtualbox) +* [DistroTest](https://distrotest.net/index.php) — test a distro directly online without installation + +If you are already on Windows or macOS, the following options can be used to get access to Linux tools: + +* [Git for Windows](https://git-scm.com/downloads) — provides a Bash emulation used to run Git from the command line +* [Windows Subsystem for Linux](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux) — compatibility layer for running Linux binary executables natively on Windows +* [brew](https://brew.sh/) — Package Manager for macOS (or Linux) + +>![info](./images/info.svg) ![info](./images/info.svg) ![warning](./images/warning.svg) If you are completely new to command line usage, I'd recommend setting up a virtual machine. Or perhaps, a secondary computer that you are free to experiment with. Mistakes in command line can be more destructive compared to the graphical interface. For example, a single space typo can result in data loss, leave your machine unusable, etc. + +## Setup + +To follow along the contents presented in this book, you'll need files from my [cli-computing repo](https://github.com/learnbyexample/cli-computing). Once you have access to a Linux environment, follow the instructions shown below. If all the commands used below seem alien to you, wait until you reach the [ls](#ls) section (you'll get a link back to these instructions at that point). + +To get the files, you can clone the cli-computing repo using the `git` command or download a `zip` version. You may have to install the `git` command if you don't already have it, for example `sudo apt install git` on Debian-like systems. See [https://git-scm.com/downloads](https://git-scm.com/downloads) for other installation choices. + +```bash +# option 1: use git +$ git clone --depth 1 https://github.com/learnbyexample/cli-computing.git + +# option 2: download zip file +# you can also use 'curl -OL' instead of 'wget' +$ wget https://github.com/learnbyexample/cli-computing/archive/refs/heads/master.zip +$ unzip master.zip +$ mv cli-computing-master cli-computing +``` + +Once you have the files, you'll be able to follow along the commands presented in this book. For example, you'll need to execute the `ls.sh` script for the [ls](#ls) section. + +```bash +$ cd cli-computing/example_files/scripts/ +$ ls +cp.sh file.sh globs.sh ls.sh rm.sh tar.sh +du.sh find.sh grep.sh mv.sh stat.sh touch.sh + +$ source ls.sh +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi* projects/ scripts@ +``` + +For sections like the [cat](#cat) command, you'll need to use the sample input files provided in the `text_files` directory. + +```bash +$ cd cli-computing/example_files/text_files/ +$ cat greeting.txt +Hi there +Have a nice day +``` + +## Command Line Interface + +Command Line Interface (CLI) allows you to interact with the computer using text commands. For example, the `cd` command helps you navigate to a particular directory. The `ls` command shows the contents of a directory. In a graphical environment, you'd use an explorer (file manager) for navigation and directory contents are shown by default. Some tasks can be accomplished in both CLI and GUI environments, while some are suitable and effective only in one of them. + +Here are some advantages of using CLI tools over GUI programs: + +* automation +* faster execution +* command invocations are repeatable +* easy to save solutions and share with others +* single environment compared to different UI/UX with graphical solutions +* common text interface allows tools to easily communicate with each other + +And here are some disadvantages: + +* steep learning curve +* syntax can get very complicated +* need to get comfortable with plenty of tools +* typos have a tendency to be more destructive + +You can make use of features like command history, shortcuts and autocompletion to help with plethora of commands and syntax issues. Consistent practice will help to get familiar with quirks of the command line environment. Commands with destructive potential will usually include options to allow manual confirmation and interactive usage, thus reducing or entirely avoiding the impact of typos. + +## Chapters + +Here's the list of remaining chapters: + +* [Command Line Overview](#command-line-overview) +* [Managing Files and Directories](#managing-files-and-directories) +* [Shell Features](#shell-features) +* [Viewing Part or Whole File Contents](#viewing-part-or-whole-file-contents) +* [Searching Files and Filenames](#searching-files-and-filenames) +* [File Properties](#file-properties) +* [Managing Processes](#managing-processes) +* [Multipurpose Text Processing Tools](#multipurpose-text-processing-tools) +* [Sorting Stuff](#sorting-stuff) +* [Comparing Files](#comparing-files) +* [Assorted Text Processing Tools](#assorted-text-processing-tools) +* [Shell Scripting](#shell-scripting) +* [Shell Customization](#shell-customization) + +## Resource lists + +This book covers but a tiny portion of Linux command line usage. Topics like system administration and networking aren't discussed at all. Check out the following lists to learn about such topics and discover cool tools: + +* [Linux curated resources](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) — my collection of resources for Linux command line, shell scripting and other related topics +* [Awesome Linux](https://github.com/inputsh/awesome-linux) — list of awesome projects and resources that make Linux even more awesome +* [Arch wiki: list of applications](https://wiki.archlinux.org/title/List_of_applications) — sorted by category, helps as a reference for those looking for packages + +# Command Line Overview + +This chapter will help you take the first steps in the command line world. Apart from command examples that you can try out, you'll also learn a few essential things about working in a text environment. + +For newbies, the sudden paradigm shift to interacting with the computer using just text commands can be overwhelming, especially for those accustomed to the graphical user interface (GUI). After regular usage, things will start to look systematic and you might realize that GUI is ill suited for repetitive tasks. With continuous use, recalling various commands will become easier. Features like command line history, aliases, tab-completion and shortcuts will help too. + +If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into a tiny screen and a plethora of multipurpose buttons. Command line environment is something like that, but not limited just to mathematics. From managing files to munging data, from image manipulations to working with video, you'll likely find a tool for almost any computing task you can imagine. Always remember that command line tools appeared long before graphical ones did. The rich history shows its weight in the form of robust tools and the availability of wide variety of applications. + +## Hello Command Line + +Open a [Terminal Emulator](https://en.wikipedia.org/wiki/Terminal_emulator) and type the command as shown below. The `$` followed by a space character at the start is the simple command prompt that I use. It might be different for you. The actual command to type is `echo` followed by a space, then the argument `'Hello Command Line'` and finally press the `Enter` key to execute it. You should get the argument echoed back to you as the command output. + +```bash +$ echo 'Hello Command Line' +Hello Command Line +``` + +Here's another simple illustration. This time, the command `pwd` is entered by itself (i.e. no arguments). You should get *your* current location as the output. The `/` character separates different parts of the location (more details in the upcoming sections). + +```bash +$ pwd +/home/learnbyexample +``` + +Next, enter the `exit` command to quit the Terminal session. + +```bash +$ exit +``` + +If you are completely new to the command line world, try out the above steps a few more times until you feel comfortable with opening a Terminal Emulator, executing commands and quitting the session. More details about the command structure, customizing command prompt, etc will be discussed later. + +## File System + +In Linux, directory structure starts with the `/` symbol, which is referred to as the **root** directory. The `man hier` command gives description of the file system hierarchy. Here are some selected examples: + +* `/` This is the root directory. This is where the whole tree starts. +* `/bin` This directory contains executable programs which are needed in single user mode and to bring the system up or repair it. +* `/home` On machines with home directories for users, these are usually beneath this directory, directly or not. The structure of this directory depends on local administration decisions (optional). +* `/tmp` This directory contains temporary files which may be deleted with no notice, such as by a regular job or at system boot up. +* `/usr` This directory is usually mounted from a separate partition. It should hold only shareable, read-only data, so that it can be mounted by various machines running Linux. +* `/usr/bin` This is the primary directory for executable programs. Most programs executed by normal users which are not needed for booting or for repairing the system and which are not installed locally should be placed in this directory. +* `/usr/share` This directory contains subdirectories with specific application data, that can be shared among different architectures of the same OS. + +## Absolute and Relative paths + +Quoting [wikipedia](https://en.wikipedia.org/wiki/Path_%28computing%29#Absolute_and_relative_paths): + +>An **absolute** or **full** path points to the same location in a file system regardless of the current working directory. To do that, it must contain the root directory. + +>By contrast, a **relative** path starts from some given working directory, avoiding the need to provide the full absolute path. A filename can be considered as a relative path based at the current working directory. If the working directory is not the file's parent directory, a file not found error will result if the file is addressed by its name. + +For example, `/home/learnbyexample` is an absolute path and `../design` is a relative path. You'll learn how paths are used for performing tasks in the coming chapters. + +## Shells and Terminal Emulators + +These terms are often used to interchangeably mean the same thing — a prompt to allow the user to execute commands. However, they are quite different: + +* **Shell** is a command line interpreter. Sets the syntax rules for invoking commands, provides operators to connect commands and redirect data, has scripting features like loops, functions and so on +* **Terminal** is a text input/output environment. Responsible for visual details like font size, color, etc + +Some of the popular shells are `bash`, `zsh` and `fish`. This book will discuss only the [Bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) shell. Some of the popular terminal emulators are [GNOME Terminal](https://en.wikipedia.org/wiki/GNOME_Terminal), [konsole](https://en.wikipedia.org/wiki/Konsole), [xterm](https://en.wikipedia.org/wiki/Xterm) and [alacritty](https://github.com/alacritty/alacritty). + +Quoting from [wikipedia: Unix shell](https://en.wikipedia.org/wiki/Unix_shell): + +>A Unix shell is a command-line interpreter or shell that provides a command line user interface for Unix-like operating systems. The shell is both an interactive command language and a scripting language, and is used by the operating system to control the execution of the system using shell scripts. +> +>Users typically interact with a Unix shell using a terminal emulator; however, direct operation via serial hardware connections or Secure Shell are common for server systems. All Unix shells provide filename wildcarding, piping, here documents, command substitution, variables and control structures for condition-testing and iteration. + +Shell features will be discussed in later sections and chapters. For now, open a terminal and try out the following commands: + +```bash +$ cat /etc/shells +# /etc/shells: valid login shells +/bin/sh +/bin/dash +/bin/bash +/bin/rbash + +$ echo "$SHELL" +/bin/bash +``` + +In the above example, the `cat` command is used to display the contents of a file and the `echo` command is used to display the contents of a variable. `SHELL` is an environment variable containing full path to the shell. + +>![info](images/info.svg) The output of the above commands might be different for you. And as mentioned earlier, your command prompt might be different than `$ `. For now, you can ignore it. Or, you could type `PS1='$ '` and press the `Enter` key to set the prompt for the current session. + +**Further Reading** + +* [unix.stackexchange: What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'console'?](https://unix.stackexchange.com/q/4126/109046) +* [wikipedia: Comparison of command shells](https://en.wikipedia.org/wiki/Comparison_of_command_shells) +* [unix.stackexchange: Difference between login shell and non-login shell](https://unix.stackexchange.com/q/38175/109046) +* [Features and differences between various shells](http://www.faqs.org/faqs/unix-faq/shell/shell-differences/) +* [Syntax comparison on different shells with examples](https://hyperpolyglot.org/unix-shells) +* [Shell, choosing shell and changing default shells](https://wiki.ubuntu.com/ChangingShells) + +## Unix Philosophy + +Quoting from [wikipedia: Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy): + +> * Write programs that do one thing and do it well. +> +> * Write programs to work together. +> +> * Write programs to handle text streams, because that is a universal interface. + +These principles do not strictly apply to all the command line tools, but it is good to be aware of them. As you get familiar with working from the command line, you'll be able to appreciate these guidelines better. + +## Command Structure + +It is not necessary to fully understand the commands used in this chapter, just the broad strokes. The examples are intended to help you get a feel for the basics of using command options and arguments. + +**Command invocation without any options or arguments**: + +* `clear` clear the terminal screen +* `date` show the current date and time + +**Command with options (flags)**: + +* `ls -l` list directory contents in a long listing format +* `ls -la` list directory contents including hidden files in long listing format + * two short options `-l` and `-a` are combined together here as `-la` +* `df -h` report file system disk space usage sizes in human readable format +* `df --human-readable` same as `df -h` but using long option instead of short option + +**Command with arguments**: + +* `mkdir project` create a directory named `project` in the current working directory +* `man sort` manual page for the `sort` command +* `diff file1.txt file2.txt` display differences between the two input files +* `wget https://s.ntnu.no/bashguide.pdf` download a file from the internet + * the link passed to `wget` in the above example is real, visit [BashGuide](https://mywiki.wooledge.org/BashGuide) for details + +**Command with both options and arguments**: + +* `rm -r project` remove (delete) the `project` directory recursively +* `paste -sd, ip.txt` serialize all lines from the input file to a single line using `,` as the delimiter + +**Single quotes vs Double quotes**: + +* **Single quotes** preserves the literal value of each character within the quotes +* **Double quotes** preserves the literal value of all characters within the quotes, with the exception of `$`, `` ` ``, `\`, and, when history expansion is enabled, `!` + +```bash +# no character is special within single quotes +$ echo '$SHELL' +$SHELL + +# $ is special within double quotes, used to interpolate variable here +$ echo "Full path to the shell: $SHELL" +Full path to the shell: /bin/bash +``` + +More details and other types of quoting will be discussed in the [Shell Features](#shell-features) chapter. + +## Command Network + +One of the *Unix Philosophy* seen earlier mentioned commands working together. The shell provides several ways to do so. A commonly used feature is redirecting the output of a command — as input of another command, to be saved in a file and so on. + +* to another command + * `du -sh * | sort -h` calculate size of files and folders in human-readable format using `du` and then sort them using a tool specialized for that task +* to a file + * `grep 'pass' *.log > pass_list.txt` write the results to a file instead of displaying on the terminal (if the file already exists, it gets overwritten) + * `grep 'error' *.log >> errors.txt` append the results to the given file (creates a new file if necessary) +* to a variable + * `d=$(date)` save command output in a variable named `d` + +Many more of such shell features will be discussed in later chapters. + +## Scripting + +Not all operations can be completed using a one-liner from the terminal. In such cases, you can save the instructions in a text file and then execute them. Open your favorite text editor and write the three lines shown below: + +```bash +$ cat cmds.sh +echo 'hello world' +echo 'how are you?' +seq 3 +``` + +As an alternate to using a text editor, you can use either of the commands shown below to create this file. + +```bash +# assuming 'echo' supports '-e' option in your environment +$ echo -e "echo 'hello world'\necho 'how are you?'\nseq 3" > cmds.sh + +# a more portable solution using the builtin 'printf' command +$ printf "echo 'hello world'\necho 'how are you?'\nseq 3\n" > cmds.sh +``` + +The script file is named `cmds.sh` and has three commands in three separate lines. One way to execute the contents of this file is by using the `source` command: + +```bash +$ source cmds.sh +hello world +how are you? +1 +2 +3 +``` + +>![info](./images/info.svg) Your Linux distro is likely to have an easy to use graphical text editor such as `gedit` and `mousepad`. See [wiki.archlinux: text editors](https://wiki.archlinux.org/title/List_of_applications#Text_editors) for a huge list of editors to choose from. + +>![info](./images/info.svg) The [Shell Scripting](#shell-scripting) chapter will discuss scripting in more detail. + +## Command Help + +Most distros for personal use come with documentation for commands already installed. Learning how to use manuals from the terminal is handy and there are ways to get specific information as well. + +### man + +The `man` command is an interface to view manuals from within the terminal itself. This uses a `pager` (which is usually the `less` command) to display the contents. You could call these commands as terminal user interface (TUI) applications. As an example, type `man cat` and you should see something like the screenshot shown below: + +![manual page for the cat command](images/man_cat.png) + +Since the documentation has several lines that doesn't completely fit within the terminal window, you will get only the starting part of the manual. You have several options to navigate: + +* `↑` and `↓` arrow keys to move up and down by a line + * you can also use `k` and `j` keys (same keys as those used in the Vim text editor) +* `f` and `b` keys to move forward and backward by a screenful of content + * `Space` key also moves forward by a screen +* mouse scroll moves up and down by a few lines +* `g` or `Home` go to the start of the manual +* `G` or `End` go to the end of the manual +* `/pattern` followed by `Enter` search for the given pattern in the forward direction +* `?pattern` followed by `Enter` search for the given pattern in the backward direction +* `n` go to the next match +* `N` go to the previous match +* `q` quit + +As you might have noticed in the screenshot above, you can use `h` for help about the `less` command itself. Here are some useful tips related to documentation: + +* `man man` gives information about the `man` command itself +* `man bash` will give you the manual page for the `bash` shell + * since this is very long, I'd recommend using the [online GNU Bash manual](https://www.gnu.org/software/bash/manual/) +* `man find | gvim -` open the manual page in your favorite text editor +* `man -k printf` search the short descriptions in all the manual pages for the string `printf` + * you can also use the `apropos` command instead of `man -k` +* `wc --help` many commands support the `--help` option to give succinct details like options and syntax + * also, these details will be displayed on the terminal itself, no need to deal with `pager` interface + +>![info](images/info.svg) See also [unix.stackexchange: How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/q/193815/109046) and [unix.stackexchange: colors in man pages](https://unix.stackexchange.com/q/119/109046). + +>![info](./images/info.svg) ![info](./images/info.svg) ![info](./images/info.svg) The Linux manual pages are usually shortened version of the full documentation. You can use the `info` command to view the complete documentation for GNU tools. `info` is also a TUI application, but with different key configuration compared to the `man` command. See [GNU Manuals Online](https://www.gnu.org/manual/manual.html) if you'd prefer to read them from a web browser. You can also download them in formats like PDF for offline usage. + +### type + +For certain operations, the shell provides its own set of commands, known as builtin commands. The `type` command displays information about a command like its path, whether it is a builtin, alias, function and so on. + +```bash +$ type cd +cd is a shell builtin +$ type sed +sed is /bin/sed +$ type type +type is a shell builtin + +# multiple commands can be given as arguments +$ type pwd awk +pwd is a shell builtin +awk is /usr/bin/awk +``` + +As will be discussed in the [Shell Customization](#shell-customization) chapter, you can create aliases to customize command invocations. You can use the `type` command to reveal the nature of such aliases. Here are some examples based on aliases I use: + +```bash +$ type p +p is aliased to 'pwd' + +$ type ls +ls is aliased to 'ls --color=auto' +``` + +The `type` command formats the command output with a backtick at the start and a single quotes at the end. That doesn't play well with syntax highlighting, so I've changed the backtick to single quotes in the above illustration. + +>![info](./images/info.svg) See also [unix.stackexchange: What is the difference between a builtin command and one that is not?](https://unix.stackexchange.com/q/11454/109046) + +### help + +The `help` command provides documentation for builtin commands. Unlike the `man` command, the entire text is displayed as the command output. A help page in the default format is shown below. You can add `-m` option if you want the help content in a pseudo-manpage format. + +```bash +$ help pwd +pwd: pwd [-LP] + Print the name of the current working directory. + + Options: + -L print the value of $PWD if it names the current working directory + -P print the physical directory, without any symbolic links + + By default, 'pwd' behaves as if '-L' were specified. + + Exit Status: + Returns 0 unless an invalid option is given or the current directory + cannot be read. +``` + +You can use the `-d` option to get a short description of the command: + +```bash +$ help -d compgen +compgen - Display possible completions depending on the options. +``` + +>![info](./images/info.svg) Use `help help` for documentation on the `help` command. If you use `help` without any argument, it will display all the internally defined shell commands. + +### whatis and whereis + +Here are some more ways to get specific information about commands: + +* `whatis` displays one-line manual page descriptions +* `whereis` locates the binary, source, and manual page files for a command + +```bash +$ whatis grep +grep (1) - print lines that match patterns + +$ whereis awk +awk: /usr/bin/awk /usr/lib/x86_64-linux-gnu/awk /usr/share/awk +/usr/share/man/man1/awk.1.gz +``` + +### ch + +[explainshell](https://explainshell.com/) is a web app that shows the help text that matches each argument of the command you type in the app. For example, a screenshot for [tar -xzvf archive.tar.gz](https://explainshell.com/explain?cmd=tar+-xzvf+archive.tar.gz) is shown below: + +![explainshell example for the tar command](images/explainshell_tar.png) + +Inspired by this app, I wrote a [Bash script ch](https://github.com/learnbyexample/command_help) to extract information from `man` and `help` pages. Here are some examples: + +```bash +$ ch ls -vX + ls - list directory contents + + -v natural sort of (version) numbers within text + + -X sort alphabetically by entry extension + +$ ch type -a + type - Display information about command type. + + -a display all locations containing an executable named NAME; + includes aliases, builtins, and functions, if and only if + the '-p' option is not also used +``` + +### Further Reading + +* [Linux man pages](https://www.mankier.com/) — one of several websites that host man pages online +* [ArchWiki](https://wiki.archlinux.org/title/Table_of_contents) — comprehensive documentation for Arch Linux and other distributions +* [Debian Reference](https://www.debian.org/doc/manuals/debian-reference/) — broad overview of the Debian system, covers many aspects of system administration through shell-command examples + +## Shortcuts and Autocompletion + +There are several shortcuts you can use to be productive at the command line. These will be discussed in the [Shell Customization](#shell-customization) chapter. Here are some examples to give an idea: + +* `Ctrl+u` delete everything to the left of the cursor +* `Ctrl+k` delete from the current character to the end of the line +* `Ctrl+c` abort the currently typed command +* `Ctrl+l` clear the terminal screen and move the prompt to the top, any characters typed as part of the current command will be retained +* `↑` and `↓` arrow keys to navigate previously used command history + * `Ctrl+p` and `Ctrl+n` can also be used instead of arrow keys + * you can modify the command before executing such lines from the history + +The tab key helps you autocomplete commands, aliases, filenames and so on, depending on the context. If there is only one possible completion, it will be done on single tab press. Otherwise, you can press the tab key twice to get a list of possible matches (if there are any). Here's an example of completing a file path with multiple tab key presses at various stages. Not only does it saves time, it also helps to avoid typos since you are simultaneously verifying the path. + +```bash +# pressing tab after typing '/e' will autocomplete to '/etc/' +$ ls /etc/ + +# pressing tab after 'di' will autocomplete to 'dict' +$ ls /etc/dict +# pressing tab twice will show all possible completions +$ ls /etc/dict +dictd/ dictionaries-common/ + +# type 'i' and press tab to get 'dictionaries-common' +$ ls /etc/dictionaries-common/ + +# type 'w' and press tab to get 'words' +$ ls /etc/dictionaries-common/words +``` + +The character at which the tab key is pressed in the above example has been cherry picked for illustration purposes. The number of steps would increase if you try pressing tab after each character. With experience, using the tab key for autocompletion will become a natural part of your command line usage. + +>![info](./images/info.svg) You can set an option to combine the features of single and double tab presses into a single tab press. This will be discussed in the [Shell Customization](#shell-customization) chapter. + +## Real world use cases + +If the command line environment only had file managing features, I'd still use it. Given the wide variety of applications available, I can't imagine going back to using a different GUI application for each use case. My primary work is writing ebooks, blog posts and recording videos. Here are the major CLI tools I use: + +* text processing using `head`, `tail`, `sort`, `grep`, `sed`, `awk` and so on (you'll learn about these commands in later chapters) +* [git](https://git-scm.com/) — version control +* [pandoc](https://github.com/jgm/pandoc/) — generating PDF/EPUB book versions from markdown files +* [mdBook](https://github.com/rust-lang/mdBook) — web version of the books from markdown files +* [zola](https://github.com/getzola/zola) — static site generator +* [ImageMagick](https://imagemagick.org/index.php) — image processing like resizing, adding borders, etc +* [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) — optimizing images +* [auto-editor](https://github.com/WyattBlue/auto-editor) — removing silent portions from video recordings +* [FFmpeg](https://github.com/FFmpeg/FFmpeg) — video processing, padding for example (`FFmpeg` is also a major part of the `auto-editor` solution) + +Some of these workflows require additional management, for which I write shell functions or scripts. I do need GUI tools as well, for example, web browser, image viewer, PDF/EPUB viewers, [SimpleScreenRecorder](https://github.com/MaartenBaert/ssr) and so on. Some of these can be handled from within the terminal too, but I prefer GUI for such cases. I do launch some of them from the terminal, primarily for providing the file or url to be opened. + +You might wonder what advantage does the command line provide for processing images and videos? Apart from being faster, the custom parameters (like border color, border size, quality percentage, etc) are automatically saved as part of the scripts I create. After that, I can just use a single call to the script instead of waiting for a GUI application to open, navigating to required files, applying custom parameters, saving them after all the required processing is done, closing the application, etc. Also, that single script can use as many tools as needed, whereas with GUI you'll have to repeat such steps with different applications. + +## Exercises + +>![info](images/info.svg) ![info](./images/info.svg) All the exercises are also collated together in one place at [exercises.md](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercises.md). For solutions, see [exercise-solutions.md](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercise-solutions.md). + +**1)** By default, is `echo` a shell builtin or external command on your system? What command could you use to get an answer for this question? + +**2)** What output do you get for the command shown below? Does the documentation help understand the result? + +```bash +$ echo apple 42 'banana 100' +``` + +**3)** Go through [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html). Is `~/projects` a relative or an absolute path? See [this unix.stackexchange thread](https://unix.stackexchange.com/q/221970/109046) for answers. + +**4)** Which key would you use to get help while the `less` command is active? + +**5)** How would you bring the 50th line to the top of the screen while viewing a `man` page (assume `less` command is the `pager`)? + +**6)** What does the `Ctrl+k` shortcut do? + +**7)** Briefly explain the role of the following shell operators: + +*a)* `|` +*b)* `>` +*c)* `>>` + +**8)** The `whatis` command displays one-line descriptions about commands. But it doesn't seem to work for `whatis type`. What should you use instead? + +```bash +$ whatis cat +cat (1) - concatenate files and print on the standard output + +$ whatis type +type: nothing appropriate. + +# ??? +type - Display information about command type. +``` + +**9)** What is the role of the `/tmp` directory? + +**10)** Give an example each for absolute and relative paths. + +**11)** When would you use the `man -k` command? + +**12)** Are there any differences between `man` and `info` pages? + +# Managing Files and Directories + +This chapter presents commands to do things that are typically handled by a file manager in GUI (also known as file explorer). For example, viewing contents of a directory, navigating to other directories, cut/copy/paste files, renaming and so on. Some of the commands used for these purposes are provided by the shell itself. + +As a good practice, make it a habit to go through the documentation of the commands you encounter. Getting used to looking up documentation from the command line will come in handy whenever you are stuck. You can also learn and experiment with options you haven't used yet. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. See [Setup](#setup) section for instructions to create the working environment. + +## Builtin and External commands + +From [bash manual: What is a shell?](https://www.gnu.org/software/bash/manual/bash.html#What-is-a-shell_003f) + +>Shells also provide a small set of built-in commands (builtins) implementing functionality impossible or inconvenient to obtain via separate utilities. For example, `cd`, `break`, `continue`, and `exec` cannot be implemented outside of the shell because they directly manipulate the shell itself. The `history`, `getopts`, `kill`, or `pwd` builtins, among others, could be implemented in separate utilities, but they are more convenient to use as builtin commands. + +Many of the commands needed for everyday use are external commands, i.e. not part of the shell. Some builtins, `pwd` for example, might also be available as external command on your system (and these might have differences in features too). In such cases the builtin version will be executed by default, which you can override by using the path of the external version. + +You can use the `type` command to distinguish between builtin and external commands. The `type` command is a shell builtin, and provides other features too (which will be discussed later). You can use the `-a` option to get all details about the given command. + +```bash +$ type -a cd +cd is a shell builtin + +$ type -a ls +ls is /bin/ls + +$ type -a pwd +pwd is a shell builtin +pwd is /bin/pwd +``` + +>![info](images/info.svg) To look up documentation, use the `help` command for builtins and `man` for external commands (or `info` for complete documentation, where applicable). Use `help help` and `man man` for their own documentation. + +>![info](images/info.svg) Typing just `help` will give the list of builtins, along with the command's syntax. + +## pwd + +`pwd` is a shell builtin command to get the current working directory. This helps to orient yourself with respect to the filesystem. The absolute path printed is often handy to copy-paste elsewhere, in a script for example. Some users prefer their terminal emulators and/or shell prompt to always display the current working directory. + +```bash +$ pwd +/home/learnbyexample +``` + +## cd + +`cd` is another shell builtin. This helps to change the current working directory. Here's an example of changing the current working directory using an absolute path: + +```bash +$ pwd +/home/learnbyexample + +# specifying / at end of the path is optional +$ cd /etc +$ pwd +/etc +``` + +You can use `-` as an argument to go back to the previous working directory. Continuing from the previous example: + +```bash +$ cd - +/home/learnbyexample +``` + +>![info](./images/info.svg) Most commands will treat strings starting with `-` as a command option. You can use `--` to tell commands that all the following arguments should *not* be treated as options even if they start with `-`. For example, if you have a folder named `-oops` in the current working directory, you can use `cd -- -oops` to switch to that directory. + +Relative paths are well, relative to the current working directory: + +* `.` refers to the current directory +* `..` refers to the directory one hierarchy above +* `../..` refers to the directory two hierarchies above and so on +* `cd ./-` will help you to switch to a directory named `-` in the current location + * you cannot use `cd -` since that'll take you to the previous working directory + +```bash +$ pwd +/home/learnbyexample + +# go one hierarchy above +$ cd .. +$ pwd +/home + +# change to 'learnbyexample' present in the current directory +# './' is optional in this case +$ cd ./learnbyexample +$ pwd +/home/learnbyexample + +# go two hierarchies above +$ cd ../.. +$ pwd +/ +``` + +You can switch to the home directory using `cd` or `cd ~` or `cd ~/` from anywhere in the filesystem. This is determined by the value stored in the `HOME` shell variable. See also [bash manual: Tilde Expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html). + +```bash +$ pwd +/ +$ echo "$HOME" +/home/learnbyexample + +$ cd +$ pwd +/home/learnbyexample +``` + +## clear + +You can use this command to clear the terminal screen. By default, the `clear` command will move the prompt to the top of the terminal as well as try to remove the contents of the scrollback buffer. You can use the `-x` option if you want to retain the scrollback buffer contents. + +>![info](images/info.svg) The `Ctrl+l` shortcut will also move the prompt line to the top of the terminal. It will retain any text you've typed on the prompt line and scrollback buffer contents won't be cleared. + +## ls + +When you use a file explorer GUI application, you'll automatically see the directory contents. And such GUI apps typically have features to show file size, differentiate between files and folders and so on. `ls` is the equivalent command line tool with a plethora of options and functionality related to viewing the contents of directories. + +>![info](./images/info.svg) As mentioned earlier, the [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. You can source the `ls.sh` script to follow along the examples shown in this section. See [Setup](#setup) section if you haven't yet created the working environment. +> +> ```bash +> # first, cd into the 'scripts' directory +> $ cd cli-computing/example_files/scripts +> +> $ ls +> cp.sh file.sh globs.sh ls.sh rm.sh tar.sh +> du.sh find.sh grep.sh mv.sh stat.sh touch.sh +> +> # 'ls.sh' script will create a directory named 'ls_examples' +> # and automatically change to that directory as well +> $ source ls.sh +> $ pwd +> /home/learnbyexample/cli-computing/example_files/scripts/ls_examples +> ``` + +By default, the current directory contents are displayed. You can pass one or more paths as arguments. Here are some examples: + +```bash +$ ls +backups hello_world.py ip.txt report.log todos +errors.log hi projects scripts + +# example with a single path argument +$ ls /sys +block class devices fs kernel power +bus dev firmware hypervisor module + +# multiple paths example +# directory listings will be preceded by their names +$ ls projects backups ip.txt +ip.txt + +backups: +bookmarks.html dot_files + +projects: +calculator tictactoe +``` + +You can use the `-1` option (`1` as in numeric one, not the alphabet `l` which does something else) to list the contents in a single column: + +```bash +$ ls -1 backups +bookmarks.html +dot_files +``` + +The `-F` option appends a character to each filename indicating the file type (if it is other than a regular file): + +* `/` directory +* `*` executable file +* `@` symbolic link +* `|` FIFO +* `=` socket +* `>` door + +```bash +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi* projects/ scripts@ +``` + +If you just need to distinguish between files and directories, you can use the `-p` option: + +```bash +$ ls -p +backups/ hello_world.py ip.txt report.log todos/ +errors.log hi projects/ scripts +``` + +You can also use the `--color` option to visually distinguish file types: + +![example with --color option](images/ls_color.png) + +The `-l` option displays the contents using a long listing format. You'll get details like file permissions, ownership, size, timestamp and so on. The first character of the first column distinguishes file types as `d` for directories, `-` for regular files, `l` for symbolic links, etc. Under each directory listing, the first line will display the total size of the entries (in terms of KB). + +```bash +$ ls -l hi +-rwxrwxr-x 1 learnbyexample learnbyexample 21 Dec 5 2019 hi + +# you can add -G option to avoid the group column +$ ls -lG +total 7516 +drwxrwxr-x 3 learnbyexample 4096 Feb 4 09:23 backups +-rw-rw-r-- 1 learnbyexample 12345 Jan 1 03:30 errors.log +-rwxrwxr-x 1 learnbyexample 42 Feb 29 2020 hello_world.py +-rwxrwxr-x 1 learnbyexample 21 Dec 5 2019 hi +-rw-rw-r-- 1 learnbyexample 10 Jul 21 2017 ip.txt +drwxrwxr-x 4 learnbyexample 4096 Mar 5 11:21 projects +-rw-rw-r-- 1 learnbyexample 7654321 Jan 1 01:01 report.log +lrwxrwxrwx 1 learnbyexample 13 May 7 15:17 scripts -> ../../scripts +drwxrwxr-x 2 learnbyexample 4096 Apr 6 13:19 todos +``` + +>![info](./images/info.svg) ![warning](./images/warning.svg) Note that the timestamps showing hours and minutes instead of year depends on the relative difference with respect to the current time. So, for example, you might get `Feb 4 2022` instead of `Feb 4 09:23`. + +Use the `-h` option to show file sizes in human readable format (default is byte count). + +```bash +$ ls -lG report.log +-rw-rw-r-- 1 learnbyexample 7654321 Jan 1 01:01 report.log + +$ ls -lhG report.log +-rw-rw-r-- 1 learnbyexample 7.3M Jan 1 01:01 report.log +``` + +You can use the `-s` option instead of long listing if you only need allocated file sizes and names: + +```bash +$ ls -1sh errors.log report.log + 16K errors.log +7.4M report.log +``` + +There are several options for changing the order of listing: + +* `-t` sorts by timestamp +* `-S` sorts by file size (not suitable for directories) +* `-v` version sorting (suitable for filenames with numbers in them) +* `-X` sorts by file extension (i.e. characters after the last `.` in the filename) +* `-r` reverse the listing order + +```bash +$ ls -lGhtr +total 7.4M +-rw-rw-r-- 1 learnbyexample 10 Jul 21 2017 ip.txt +-rwxrwxr-x 1 learnbyexample 21 Dec 5 2019 hi +-rwxrwxr-x 1 learnbyexample 42 Feb 29 2020 hello_world.py +-rw-rw-r-- 1 learnbyexample 7.3M Jan 1 01:01 report.log +-rw-rw-r-- 1 learnbyexample 13K Jan 1 03:30 errors.log +drwxrwxr-x 3 learnbyexample 4.0K Feb 4 09:23 backups +drwxrwxr-x 4 learnbyexample 4.0K Mar 5 11:21 projects +drwxrwxr-x 2 learnbyexample 4.0K Apr 6 13:19 todos +lrwxrwxrwx 1 learnbyexample 13 May 7 15:17 scripts -> ../../scripts +``` + +Filenames starting with `.` are considered as hidden files and these are NOT shown by default. You can use the `-a` option to view them. The `-A` option is similar, but doesn't show the special `.` and `..` entries. + +```bash +# . and .. point to the current and parent directories +$ ls -aF backups/dot_files/ +./ ../ .bashrc .inputrc .vimrc + +# -A will exclude . and .. +$ ls -A backups/dot_files/ +.bashrc .inputrc .vimrc +``` + +The `-R` option recursively lists sub-directories as well: + +```bash +$ ls -ARF +.: +backups/ hello_world.py* .hidden projects/ scripts@ +errors.log hi* ip.txt report.log todos/ + +./backups: +bookmarks.html dot_files/ + +./backups/dot_files: +.bashrc .inputrc .vimrc + +./projects: +calculator/ tictactoe/ + +./projects/calculator: +calc.sh + +./projects/tictactoe: +game.py + +./todos: +books.txt outing.txt +``` + +Often you'd want to list only specific files or directories based on some criteria, file extension for example. The shell provides a matching technique called **globs** or **wildcards**. Some simple examples are shown below (see [wildcards](#wildcards) section for more details). + +`*` is a placeholder for zero or more characters: + +```bash +# *.py *.log will give filenames ending with '.py' or '.log' +$ echo *.py *.log +hello_world.py errors.log report.log + +# glob expansion can be prevented by using quotes +$ echo '*.py' *.log +*.py errors.log report.log + +# long list only files ending with '.log' +$ ls -lG *.log +-rw-rw-r-- 1 learnbyexample 12345 Jan 1 03:30 errors.log +-rw-rw-r-- 1 learnbyexample 7654321 Jan 1 01:01 report.log +``` + +`[]` helps you specify a set of characters to be matched once. For example, `[ad]` matches `a` or `d` once. `[c-i]` matches a range of characters from `c` to `i`. + +```bash +# entries starting with 'c' to 'i' +$ echo [c-i]* +errors.log hello_world.py hi ip.txt + +$ ls -1sh [c-i]* + 16K errors.log +4.0K hello_world.py +4.0K hi +4.0K ip.txt +``` + +>![info](images/info.svg) ![info](images/info.svg) As shown in the above examples, globs are expanded by the shell. Beginners often associate globs as something specific to the `ls` command, which is why I've deliberately used `echo` as well in the above examples. + +You can use the `-d` option to *not* show directory contents: + +```bash +$ echo b* +backups +# since backups is a directory, ls will show its contents +$ ls b* +bookmarks.html dot_files +# -d will show the directory entry instead of its contents +$ ls -d b* +backups + +# a handy way to get only the directory entries +$ echo */ +backups/ projects/ scripts/ todos/ +$ ls -1d */ +backups/ +projects/ +scripts/ +todos/ +``` + +>![info](./images/info.svg) I hope you have been judiciously taking notes, since there are just too many commands and features. For example, note down all the options discussed in this section. And then explore the output from the `ls --help` command. + +**Further Reading** + +* [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) +* [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) +* [unix.stackexchange: What are ./ and ../ directories?](https://unix.stackexchange.com/q/63081/109046) + +## tree + +The `tree` command displays the contents of a directory recursively, in a hierarchical manner. Here's a screenshot of using `tree -a` from the `ls_examples` sample directory seen in the previous section. The `-a` option is used to show the hidden files as well. + +![example for tree command](images/tree_example.png) + +>![info](./images/info.svg) You might have to install this command. `sudo apt install tree` can be used to get this command on Debian-like distributions. + +## mkdir + +The `mkdir` command helps you to create new directories. You can pass one or more paths along with the name of the directories you want to create. Quote the names if it can contain shell special characters like space, `*` and so on. + +>![info](./images/info.svg) Create a practice directory for this section: +> +> ```bash +> $ mkdir practice_mkdir +> $ cd practice_mkdir +> ``` + +Here's an example of creating multiple directories: + +```bash +$ mkdir reports 'low power adders' + +$ ls -1 +'low power adders' +reports +``` + +The `-p` option will help you to create multiple directory hierarchies in one shot: + +```bash +# error because 'a' and 'a/b' paths do not exist yet +$ mkdir a/b/c +mkdir: cannot create directory ‘a/b/c’: No such file or directory + +# -p is handy in such cases +$ mkdir -p a/b/c + +$ tree +. +├── a +│   └── b +│   └── c +├── low power adders +└── reports + +5 directories, 0 files +``` + +The `-p` option has another functionality too. It will not complain if the directory you are trying to create already exists. This is especially helpful in shell scripts. + +```bash +# 'reports' directory was already created in an earlier example +$ mkdir reports +mkdir: cannot create directory ‘reports’: File exists +# exit status will reflect that something went wrong +$ echo $? +1 + +# the -p option will override such errors +$ mkdir -p reports +$ echo $? +0 +``` + +As seen in the examples above, you can check the exit status of the last executed command using the `$?` special variable. `0` means everything went well and higher numbers indicate some sort of failure has occurred (the details of which you can look up in the command's manual). + +>![info](images/info.svg) ![warning](images/warning.svg) Linux filenames can use any character other than `/` and the ASCII NUL character. Quote the arguments if it contains characters like space, `*`, etc to prevent shell expansion. Shell considers space as the argument separator, `*` is a wildcard character and so on. As a good practice, use only alphabets, numbers and underscores for filenames, unless you have some specific requirements. See also [unix.stackexchange: Characters best avoided in filenames](https://unix.stackexchange.com/q/269093/109046). + +>![info](./images/info.svg) You can delete the practice directory if you wish: +> +> ```bash +> $ cd .. +> $ rm -r practice_mkdir +> ``` + +## touch + +You'll usually create files using a text editor or by redirecting the output of a command to a file. For some cases, empty files are needed for testing purposes or to satisfy a particular build process. A real world use case is the empty `.nojekyll` file for [GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#static-site-generators). + +The `touch` command's main functionality is altering timestamps (which will be discussed in the [File Properties](#file-properties) chapter). If a file doesn't exist, `touch` will create an empty file using the current timestamp. You can also pass more than one file argument if needed. + +```bash +$ mkdir practice_touch +$ cd practice_touch + +$ ls ip.txt +ls: cannot access 'ip.txt': No such file or directory + +$ touch ip.txt + +$ ls -s ip.txt +0 ip.txt +``` + +>![info](images/info.svg) You can create an empty file using `> ip.txt` as well, but the redirection operator will overwrite the file if it already exists. + +## rm + +The `rm` command will help you to delete files and directories. You can pass one or more paths as arguments. + +```bash +# change to the 'scripts' directory and source the 'rm.sh' script +$ source rm.sh +$ ls -F +empty_dir/ hello.py loops.py projects/ read_only.txt reports/ + +# delete files ending with .py +$ rm *.py +$ ls -F +empty_dir/ projects/ read_only.txt reports/ +``` + +You'll need to add the `-r` option to recursively delete directory contents. You can use `rm -d` or the `rmdir` command to delete only empty directories. + +```bash +# -r is needed to delete directory contents recursively +$ rm reports +rm: cannot remove 'reports': Is a directory +$ rm -r reports +$ ls -F +empty_dir/ projects/ read_only.txt + +# delete empty directories, same as using the 'rmdir' command +$ rm -d empty_dir +# you'll get an error if the directory is not empty +$ rm -d projects +rm: cannot remove 'projects': Directory not empty +``` + +Typos like misplaced space, wrong glob, etc could wipe out files not intended for deletion. Apart from having backups and snapshots, you could also take some mitigating steps: + +* using `-i` option to interactively delete each file + * you can also use `-I` option for lesser number of prompts +* using `echo` as a dry run to see how the glob expands +* using a trash command (see links below) instead of `rm` + +Use `y` for confirmation and `n` to cancel deletion with `-i` or `-I` options. Here's an example of cancelling deletion: + +```bash +$ rm -ri projects +rm: descend into directory 'projects'? n + +$ ls -F +projects/ read_only.txt +``` + +And here's an example of providing confirmation at each step of the deletion process: + +```bash +$ tree projects +projects +├── calculator +│   └── calc.sh +└── tictactoe + └── game.py + +2 directories, 2 files + +$ rm -ri projects +rm: descend into directory 'projects'? y +rm: descend into directory 'projects/tictactoe'? y +rm: remove regular empty file 'projects/tictactoe/game.py'? y +rm: remove directory 'projects/tictactoe'? y +rm: descend into directory 'projects/calculator'? y +rm: remove regular empty file 'projects/calculator/calc.sh'? y +rm: remove directory 'projects/calculator'? y +rm: remove directory 'projects'? y + +$ ls -F +read_only.txt +``` + +The `-f` option can be used to ignore complaints about non-existing files (somewhat similar to the `mkdir -p` feature). It also helps to remove write protected files (provided you have appropriate permissions to delete those files). This option is especially useful for recursive deletion of directories that have write protected files, `.git/objects` for example. + +```bash +$ rm xyz.txt +rm: cannot remove 'xyz.txt': No such file or directory +$ echo $? +1 +$ rm -f xyz.txt +$ echo $? +0 + +# example for removing write protected files +# you'll be asked for confirmation even without the -i/-I options +$ rm read_only.txt +rm: remove write-protected regular empty file 'read_only.txt'? n +# with -f, files will be deleted without asking for confirmation +$ rm -f read_only.txt +``` + +**Further Reading** + +* Use a trash command (for example, `trash-cli` on Ubuntu) so that deleted files can be recovered later if needed + * see also [unix.stackexchange: creating a simple trash command](https://unix.stackexchange.com/q/452496/109046) +* Files removed using `rm` can still be recovered with time and skill + * [unix.stackexchange: recover deleted files](https://unix.stackexchange.com/q/80270/109046) + * [unix.stackexchange: recovering accidentally deleted files](https://unix.stackexchange.com/q/2677/109046) +* Use commands like `shred` if you want to make it harder to recover deleted files + * [wiki.archlinux: Securely wipe disk](https://wiki.archlinux.org/title/Securely_wipe_disk) +* [My curated list](https://learnbyexample.github.io/curated_resources/git_and_github.html) for `git` and related resources + +## cp + +You can use the `cp` command to make copies of files and directories. With default syntax, you have to specify the source first followed by the destination. To copy multiple items, the last argument as destination can only be a directory. You'll also need to use the `-r` option to copy directories (similar to `rm -r` seen earlier). + +```bash +# change to the 'scripts' directory and source the 'cp.sh' script +$ source cp.sh +$ ls -F +backups/ reference/ + +# recall that . is a relative path referring to the current directory +$ cp /usr/share/dict/words . +$ ls -F +backups/ reference/ words + +# error because -r is needed to copy directories +# other file arguments (if present) will still be copied +$ cp /usr/share/dict . +cp: -r not specified; omitting directory '/usr/share/dict' +$ cp -r /usr/share/dict . +$ ls -F +backups/ dict/ reference/ words +``` + +>![info](images/info.svg) ![warning](images/warning.svg) By default, `cp` will overwrite an existing file of the same name in the destination directory. You can use the `-i` option to interactively confirm or deny overwriting existing files. The `-n` option will prevent overwriting existing files without asking for confirmation. + +```bash +$ echo 'hello' > ip.txt +$ ls -F +backups/ dict/ ip.txt reference/ words +$ ls backups +ip.txt reports +$ cat backups/ip.txt +apple banana cherry +# file will be overwritten without asking for confirmation! +$ cp ip.txt backups/ +$ cat backups/ip.txt +hello + +# use -i to interactively confirm or deny overwriting +$ echo 'good morning' > ip.txt +$ cp -i ip.txt backups/ +cp: overwrite 'backups/ip.txt'? n +$ cat backups/ip.txt +hello + +# use -n to prevent overwriting without needing confirmation +$ cp -n ip.txt backups/ +$ cat backups/ip.txt +hello +``` + +If there's a folder in the destination path with the same name as a folder being copied, the contents will be merged. If there are files of identical names in such directories, the same rules discussed above will apply. + +```bash +$ tree backups +backups +├── ip.txt +└── reports + └── jan.log + +1 directory, 2 files + +$ mkdir reports +$ touch reports/dec.log +$ cp -r reports backups/ +$ tree backups +backups +├── ip.txt +└── reports + ├── dec.log + └── jan.log + +1 directory, 3 files +``` + +Often, you'd want to copy a file (or a directory) under a different name. In such cases, you can simply use a new name while specifying the destination. + +```bash +# copy 'words' file from source as 'words_ref.txt' at destination +$ cp /usr/share/dict/words words_ref.txt + +# copy 'words' file as 'words.txt' under the 'reference' directory +$ cp /usr/share/dict/words reference/words.txt + +# copy 'dict' directory as 'word_lists' +$ cp -r /usr/share/dict word_lists +``` + +As mentioned earlier, to copy multiple files and directories, you'll have to specify the destination directory as the last argument. + +```bash +$ cp -r ~/.bashrc /usr/share/dict backups/ + +$ ls -AF backups +.bashrc dict/ ip.txt reports/ +``` + +You can use the `-t` option if you want to specify the destination before the source paths (helpful with `find` command for example, will be discussed later). Here are some more notable options: + +* `-u` copy files from source only if they are newer or don't exist in the destination +* `-b` and `--backup` options will allow you to create backup copies of files already existing in the destination +* `--preserve` option will help you to copy files along with source file attributes like ownership, timestamp, etc + +**Further Reading** + +* `rsync` a fast, versatile, remote (and local) file-copying tool + * [rsync tutorial and examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) +* [syncthing](https://github.com/syncthing/syncthing) — continuous file synchronization program + +## mv + +You can use the `mv` command to move one or more files and directories from one location to another. Unlike `rm` and `cp`, you do not need the `-r` option for directories. + +Syntax for specifying the source and destination is same as seen earlier with `cp`. Here's an example of moving a directory into another directory: + +```bash +# change to the 'scripts' directory and source the 'mv.sh' script +$ source mv.sh +$ ls -F +backups/ dot_files/ hello.py ip.txt loops.py manuals/ +$ ls -F backups +projects/ + +$ mv dot_files backups + +$ ls -F +backups/ hello.py ip.txt loops.py manuals/ +$ ls -F backups +dot_files/ projects/ +``` + +Here's an example for moving multiple files and directories to another directory: + +```bash +$ mv *.py manuals backups + +$ ls -F +backups/ ip.txt +$ ls -F backups +dot_files/ hello.py loops.py manuals/ projects/ +``` + +When you are dealing with a single file or directory, you can also **rename** them: + +```bash +# within the same directory +$ mv ip.txt report.txt +$ ls -F +backups/ report.txt + +# between different directories +$ mv backups/dot_files rc_files +$ ls -F +backups/ rc_files/ report.txt +$ ls -F backups +hello.py loops.py manuals/ projects/ +``` + +Here are some more notable options, some of which behave similar to those seen with the `cp` command: + +* `-i` interactively confirm or deny when the destination already has a file of the same name +* `-n` always deny overwriting of files +* `-f` always overwrite files +* `-t` specify the destination elsewhere instead of final argument +* `-u` move only if the files are newer or don't exist in the destination +* `-b` and `--backup` options will allow you to create backup copies of files already existing in the destination +* `-v` verbose option + +## rename + +The `mv` command is useful for simple file renaming. `rename` helps when you need to modify one or more filenames based on a pattern. There are different implementations of the `rename` command, with wildly different set of features. See [askubuntu: What's the difference between the different "rename" commands?](https://askubuntu.com/questions/956010/whats-the-difference-between-the-different-rename-commands) for details. + +Perl implementation of the `rename` command will be discussed in this section. You'd need to know regular expressions to use this command. Basic explanations will be given here, more details can be found in the links mentioned at the end of this section. Here's an example to change the file extensions: + +```bash +$ mkdir practice_rename +$ cd practice_rename +# create sample files +$ touch caves.jpeg waterfall.JPEG flower.JPG + +# substitution command syntax is s/search/replace/flags +# \. matches . character literally +# e? matches e optionally (? is a quantifier to match 0 or 1 times) +# $ anchors the match to the end of the input +# i flag matches the input case-insensitively +$ rename 's/\.jpe?g$/.jpg/i' * + +$ ls +caves.jpg flower.jpg waterfall.jpg +$ rm *.jpg +``` + +As a good practice, use the `-n` option to see how the files will be renamed before actually renaming the files. + +```bash +$ touch 1.png 3.png 25.png 100.png +$ ls +100.png 1.png 25.png 3.png + +# use -n option for sanity check +# note that 100.png isn't part of the output, since it isn't affected +# \d matches a digit character +# \d+ matches 1 or more digits (+ is a quantifier to match 1 or more times) +# e flag treats the replacement string as Perl code +# $& is a backreference to the matched portion +$ rename -n 's/\d+/sprintf "%03d", $&/e' *.png +rename(1.png, 001.png) +rename(25.png, 025.png) +rename(3.png, 003.png) + +# remove -n option after sanity check to actually rename the files +$ rename 's/\d+/sprintf "%03d", $&/e' *.png +$ ls +001.png 003.png 025.png 100.png +``` + +If the new filename already exists, you'll get an error, which you can override with `-f` option if you wish. If you are passing filenames with path components in them, you can use the `-d` option to affect only the filename portion. Otherwise, the logic you are using might affect directory names as well. + +```bash +$ mkdir projects +$ touch projects/toc.sh projects/reports.py + +# aim is to uppercase the non-extension part of the filename +# [^.]+ matches 1 or more non '.' characters +# \U changes the characters that follow to uppercase +# $& is a backreference to the matched portion +$ rename -n -d 's/[^.]+/\U$&/' projects/* +rename(projects/reports.py, projects/REPORTS.py) +rename(projects/toc.sh, projects/TOC.sh) + +# without -d option, directory name will also be affected +$ rename -n 's/[^.]+/\U$&/' projects/* +rename(projects/reports.py, PROJECTS/REPORTS.py) +rename(projects/toc.sh, PROJECTS/TOC.sh) +``` + +**Further Reading** + +* [perldoc: Regexp tutorial](https://perldoc.perl.org/perlretut) +* See my [Perl one-liners](https://github.com/learnbyexample/learn_perl_oneliners) ebook for examples and more details about the Perl substitution and `rename` commands + +## ln + +The `ln` command helps you create a link to another file or directory within the same or different location. There are two types of links — **symbolic** links and **hard** links. Symbolic links can point to both files and directories. Here are some characteristics: + +* if the original file is deleted or moved to another location, symbolic link will no longer work +* if the symbolic link is moved to another location, it will still work if the link was done using absolute path (for relative path, it will depend on whether or not there's another file with the same name in that location) +* a symbolic link file has its own inode, permissions, timestamps, etc +* some commands will work the same when original file or the symbolic file is given as the command line argument, while some require additional options (`du -L` for example) + +Usage is similar to the `cp` command. You have to specify the source first followed by the destination (which is optional if it is the current working directory). + +```bash +$ mkdir practice_ln +$ cd practice_ln + +# destination is optional for making a link in the current directory +# -s option is needed to make symbolic links +$ ln -s /usr/share/dict/words + +# you can also rename the link if needed +$ ln -s /usr/share/dict/words words.txt +$ ls -1sF +total 0 +0 words@ +0 words.txt@ +``` + +Long listing with `ls -l` will show the path connected to links. You can also use the `readlink` command, which has features like resolving recursively to the canonical file. + +```bash +# to know which file the link points to +$ ls -lG words +lrwxrwxrwx 1 learnbyexample 21 Jul 9 13:41 words -> /usr/share/dict/words +$ readlink words +/usr/share/dict/words + +# the linked file may be another link +# use -f option to get the original file +$ readlink -f words +/usr/share/dict/english +``` + +Hard links can only point to another file. You cannot use them for directories and the usage is also restricted to within the same filesystem. The `.` and `..` directories are exceptions, these special purpose hard links are automatically created. Here are some more details about hard links: + +* once a hard link is created, there is no distinction between the two files other than their paths. They have same inode, permissions, timestamps, etc +* hard links will continue working even if all the other hard links are deleted +* if a hard link is moved to another location, the links will still be in sync. Any change in one of them will be reflected in all the other links + +```bash +$ touch apple.txt +$ ln apple.txt banana.txt + +# the -i option gives inode +$ ls -1i apple.txt banana.txt +649140 banana.txt +649140 apple.txt +``` + +>![info](images/info.svg) You can use `unlink` or `rm` commands to delete links. + +**Further Reading** + +* [askubuntu: What is the difference between a hard link and a symbolic link?](https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link) +* [unix.stackexchange: What is the difference between symbolic and hard links?](https://unix.stackexchange.com/q/9575/109046) +* [unix.stackexchange: What is a Superblock, Inode, Dentry and a File?](https://unix.stackexchange.com/q/4402/109046) + +## tar and gzip + +`tar` is an archiving utility. Depending on the implementation, you can also use options to compress the archive. + +Here's an example that creates a single archive file from multiple input files and directories: + +```bash +# change to the 'scripts' directory and source the 'tar.sh' script +$ source tar.sh +$ ls -F +projects/ report.log todos/ + +# -c option creates a new archive, any existing archive will be overwritten +# -f option allows to specify name of archive to be created +# rest of the arguments are the files/directories to be archived +$ tar -cf bkp.tar report.log projects + +$ ls -F +bkp.tar projects/ report.log todos/ +$ ls -sh bkp.tar +7.4M bkp.tar +``` + +Once you have an archive file, you can then compress it using tools like `gzip`, `bzip2`, `xz`, etc. In the below example, the command replaces the archive file with the compressed version and adds a `.gz` suffix to indicate that `gzip` was the technique used. + +```bash +# the input '.tar' file will be overwritten with the compressed version +$ gzip bkp.tar + +$ ls -F +bkp.tar.gz projects/ report.log todos/ +$ ls -sh bkp.tar.gz +5.6M bkp.tar.gz +``` + +Use the `-t` option if you want to check the contents of the compressed file. This will work with the uncompressed `.tar` version as well. + +```bash +$ tar -tf bkp.tar.gz +report.log +projects/ +projects/scripts/ +projects/scripts/calc.sh +projects/errors.log +``` + +To uncompress `.gz` files, you can use `gunzip` or `gzip -d`. This will replace the compressed version with the uncompressed archive file: + +```bash +# this '.gz' file will be overwritten with the uncompressed version +$ gunzip bkp.tar.gz + +$ ls -F +bkp.tar projects/ report.log todos/ +$ ls -sh bkp.tar +7.4M bkp.tar +``` + +To extract the files from an archive, use `tar` along with the `-x` option: + +```bash +$ mkdir test_extract +$ mv bkp.tar test_extract +$ cd test_extract +$ ls +bkp.tar + +$ tar -xf bkp.tar +$ tree +. +├── bkp.tar +├── projects +│   ├── errors.log +│   └── scripts +│   └── calc.sh +└── report.log + +2 directories, 4 files + +$ cd .. +$ rm -r test_extract +``` + +With `GNU tar`, you can compress/uncompress along with the `tar` command instead of having to use tools like `gzip` separately. For example, the `-z` option will use `gzip`, `-j` will use `bzip2` and `-J` will use `xz`. Use the `-a` option if you want `tar` to automatically select the compression technique based on the extension provided. + +```bash +$ ls -F +projects/ report.log todos/ + +# -z option gives same compression as the gzip command +$ tar -zcf bkp.tar.gz report.log projects +$ ls -sh bkp.tar.gz +5.6M bkp.tar.gz + +# extract original files from compressed file +$ mkdir test_extract +$ cd test_extract +$ tar -zxf ../bkp.tar.gz +$ tree +. +├── projects +│   ├── errors.log +│   └── scripts +│   └── calc.sh +└── report.log + +2 directories, 3 files + +$ cd .. +$ rm -r test_extract +``` + +`tar` has lots and lots of options for various needs. Some are listed below, see documentation for complete details. + +* `-v` verbose option +* `-r` to append files to an existing archive +* `--exclude=` specify files to be ignored from archiving + +There are also commands starting with `z` to work with compressed files, for example: + +* `zcat` to display file contents of a compressed file +* `zless` to display file contents of a compressed file one screenful at a time +* `zgrep` to search compressed files + +>![info](images/info.svg) If you need to work with `.zip` files, use `zip` and `unzip` commands. + +**Further Reading** + +* [unix.stackexchange: tar files with a sorted order](https://unix.stackexchange.com/q/178127/109046) +* [superuser: gzip without tar? Why are they used together?](https://superuser.com/questions/252065/gzip-without-tar-why-are-they-used-together) +* [unix.stackexchange: xz a directory with tar using maximum compression?](https://unix.stackexchange.com/q/28976/109046) + +## Exercises + +>![info](./images/info.svg) The `ls.sh` script will be used for some of the exercises. + +**1)** Which of these commands will always display the absolute path of the home directory? + +*a)* `pwd` +*b)* `echo "$PWD"` +*c)* `echo "$HOME"` + +**2)** The current working directory has a folder named `-dash`. How would you switch to that directory? + +*a)* `cd -- -dash` +*b)* `cd -dash` +*c)* `cd ./-dash` +*d)* `cd \-dash` +*e)* `cd '-dash'` +*f)* all of the above +*g)* only *a)* and *c)* + +**3)** Given the directory structure as shown below, how would you change to the `todos` directory? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi* projects/ scripts@ +$ cd projects +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/projects + +# ??? +$ pwd +/home/learnbyexample/cli-computing/example_files/scripts/ls_examples/todos +``` + +**4)** As per the scenario shown below, how would you change to the `cli-computing` directory under the user's home directory? And then, how would you go back to the previous working directory? + +```bash +$ pwd +/home/learnbyexample/all/projects/square_tictactoe + +# ??? +$ pwd +/home/learnbyexample/cli-computing + +# ??? +$ pwd +/home/learnbyexample/all/projects/square_tictactoe +``` + +**5)** How'd you list the contents of the current directory, one per line, along with the size of the entries in human readable format? + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# ??? +total 7.4M +4.0K backups + 16K errors.log +4.0K hello_world.py +4.0K hi +4.0K ip.txt +4.0K projects +7.4M report.log + 0 scripts +4.0K todos +``` + +**6)** Which `ls` command option would you use for version based sorting of entries? + +**7)** Which `ls` command option would you use for sorting based on entry size? + +**8)** Which `ls` command option would you use for sorting based on file extension? + +**9)** What does the `-G` option of `ls` command do? + +**10)** What does the `-i` option of `ls` command do? + +**11)** List only the directories as one entry per line. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# ??? +backups/ +projects/ +scripts/ +todos/ +``` + +**12)** Assume that a regular file named `notes` already exists. What would happen if you use the `mkdir -p notes` command? + +```bash +$ ls -1F notes +notes + +# what would happen here? +$ mkdir -p notes +``` + +**13)** Use one or more commands to match the scenario shown below: + +```bash +$ ls -1F +cost.txt + +# ??? + +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ +``` + +**14)** Use one or more commands to match the scenario shown below: + +```bash +# start with an empty directory +$ ls -l +total 0 + +# ??? + +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files +``` + +>![info](./images/info.svg) Don't delete this directory, will be needed in a later exercise. + +**15)** If directories to create already exist, which `mkdir` command option would you use to not show an error? + +**16)** Use one or more commands to match the scenario given below: + +```bash +$ ls -1F +cost.txt +ghost/ +quest/ +toast/ + +# ??? + +$ ls -1F +quest/ +``` + +**17)** What does the `-f` option of `rm` command do? + +**18)** Which option would you use to interactively delete files using the `rm` command? + +**19)** Can the files removed by `rm` easily be restored? Do you need to take some extra steps or use special commands to make the files more difficult to recover? + +**20)** Does your Linux distribution provide a tool to send deleted files to the trash (which would help to recover deleted files)? + +**21)** Which option would you use to interactively accept/prevent the `cp` command from overwriting a file of the same name? And which option would prevent overwriting without needing manual confirmation? + +**22)** Does the `cp` command allow you to rename the file or directory being copied? If so, can you rename multiple files/directories being copied? + +**23)** What do the `-u`, `-b` and `-t` options of `cp` command do? + +**24)** What's the difference between the two commands shown below? + +```bash +$ cp ip.txt op.txt + +$ mv ip.txt op.txt +``` + +**25)** Which option would you use to interactively accept/prevent the `mv` command from overwriting a file of the same name? + +**26)** Use one or more commands to match the scenario shown below. You should have already created this directory structure in an earlier exercise. + +```bash +$ tree -F +. +├── hobbies/ +│   ├── painting/ +│   │   └── waterfall.bmp +│   ├── trekking/ +│   │   └── himalayas.txt +│   └── writing/ +└── shopping/ + └── festival.xlsx + +5 directories, 3 files + +# ??? + +$ tree -F +. +├── hobbies/ +│   ├── himalayas.txt +│   └── waterfall.bmp +└── shopping/ + └── festival.xlsx + +2 directories, 3 files +``` + +**27)** What does the `-t` option of `mv` command do? + +**28)** Determine and implement the `rename` logic based on the filenames and expected output shown below. + +```bash +$ touch '(2020) report part 1.txt' 'analysis part 3 (2018).log' +$ ls -1 +'(2020) report part 1.txt' +'analysis part 3 (2018).log' + +# ??? + +$ ls -1 +2020_report_part_1.txt +analysis_part_3_2018.log +``` + +**29)** Does the `ln` command follow the same order to specify source and destination as the `cp` and `mv` commands? + +**30)** Which `tar` option helps to compress archives based on filename extension? This option can be used instead of `-z` for `gzip`, `-j` for `bzip2` and `-J` for `xz`. + +# Shell Features + +This chapter focuses on Bash shell features like quoting mechanisms, wildcards, redirections, command grouping, process substitution, command substitution, etc. Others will be discussed in later chapters. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts and sample input files used in this chapter. + +>![info](./images/info.svg) Some of the examples in this chapter use commands that will be discussed in later chapters. Basic description of what such commands do have been added here and you'll also see more examples in the rest of the chapters. + +## Quoting mechanisms + +This section will quote (*heh*) the relevant definitions from the [bash manual](https://www.gnu.org/software/bash/manual/bash.html#Quoting) and provide some examples for each of the four mechanisms. + +**Escape Character** + +>A non-quoted backslash `\` is the Bash escape character. It preserves the literal value of the next character that follows, with the exception of newline. +> +>**metacharacter**: A character that, when unquoted, separates words. A metacharacter is a space, tab, newline, or one of the following characters: `|`, `&`, `;`, `(`, `)`, `<`, or `>`. + +Here's an example where unquoted shell metacharacter causes an error: + +```bash +$ echo apple;cherry +apple +cherry: command not found + +# using '\;' helps you use ';' as an ordinary character +$ echo apple\;cherry +apple;cherry +``` + +And here's an example where the subtler issue might not be apparent at first glance: + +```bash +# this will create two files named 'new' and 'file.txt' +# aim was to create a single file named 'new file.txt' +$ touch new file.txt +$ ls new*txt +ls: cannot access 'new*txt': No such file or directory +$ rm file.txt new + +# escaping the space will create a single file named 'new file.txt' +$ touch new\ file.txt +$ ls new*txt +'new file.txt' +$ rm new\ file.txt +``` + +**Single Quotes** + +>Enclosing characters in single quotes (`'`) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. + +No character is special within single quoted strings. Here's an example: + +```bash +$ echo 'apple;cherry' +apple;cherry +``` + +You can place strings represented by different quoting mechanisms next to each other to concatenate them together. Here's an example: + +```bash +# concatenation of four strings +# 1: '@fruits = ' +# 2: \' +# 3: 'apple and banana' +# 4: \' +$ echo '@fruits = '\''apple and banana'\' +@fruits = 'apple and banana' +``` + +**Double Quotes** + +>Enclosing characters in double quotes (`"`) preserves the literal value of all characters within the quotes, with the exception of `$`, `` ` ``, `\`, and, when history expansion is enabled, `!`. + +Here's an example showing variable interpolation within double quotes: + +```bash +$ qty='5' + +# as seen earlier, no character is special within single quotes +$ echo 'I bought $qty apples' +I bought $qty apples + +# a typical use of double quotes is to enable variable interpolation +$ echo "I bought $qty apples" +I bought 5 apples +``` + +Unless you specifically want the shell to interpret the contents of a variable, you should always quote the variable to avoid issues due to the presence of shell metacharacters. + +```bash +$ f='new file.txt' + +# same as: echo 'apple banana' > new file.txt +$ echo 'apple banana' > $f +bash: $f: ambiguous redirect + +# same as: echo 'apple banana' > 'new file.txt' +$ echo 'apple banana' > "$f" +$ cat "$f" +apple banana +$ rm "$f" +``` + +>![info](./images/info.svg) See also [unix.stackexchange: Why does my shell script choke on whitespace or other special characters?](https://unix.stackexchange.com/q/131766/109046). + +**ANSI-C Quoting** + +>Words of the form `$'string'` are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. + +This form of quoting helps you use escape sequences like `\t` for tab, `\n` for newline and so on. You can also represent characters using their codepoint values in octal and hexadecimal formats. + +```bash +# can also use echo -e 'fig:\t42' or printf 'fig:\t42\n' +$ echo $'fig:\t42' +fig: 42 + +# \x27 represents single quote character in hexadecimal format +$ echo $'@fruits = \x27apple and banana\x27' +@fruits = 'apple and banana' + +# 'grep' helps you to filter lines based on the given pattern +# but it doesn't recognize escapes like '\t' for tab characters +$ printf 'fig\t42\napple 100\nball\t20\n' | grep '\t' +# in such cases, one workaround is use to ANSI-C quoting +$ printf 'fig\t42\napple 100\nball\t20\n' | grep $'\t' +fig 42 +ball 20 +``` + +`printf` is a shell builtin which you can use to format arguments (similar to `C` programming language `printf()` function). This command will be used in many more examples to come. + +>![info](./images/info.svg) See [bash manual: ANSI-C Quoting](https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) for complete list of supported escape sequences. See `man ascii` for a table of ASCII characters and their numerical representations. + +## Wildcards + +It is relatively easy to specify complete filenames as command arguments when they are few in number. And you could use features like tab completion and middle mouse button click (pastes the last highlighted text) to assist in such cases. + +But what to do if you have to deal with tens and hundreds of files (or even more)? If applicable, one way is to match all the files based on a common pattern in their filenames, for example extensions like `.py`, `.txt` and so on. Wildcards (globs) will help in such cases. This feature is provided by the shell, and thus individual commands need not worry about implementing them. Pattern matching supported by wildcards are somewhat similar to regular expressions, but there are fundamental and syntactical differences between them. + +Some of the commonly used wildcards are listed below: + +* `*` match any character, zero or more times + * as a special case, `*` won't match the starting `.` of hidden files unless the `dotglob` shell option is set +* `?` match any character exactly once +* `[set]` match any of these characters once +* `[^set]` match any characters *except* the given set of characters + * you can also use `[!set]` to negate the character class +* `[a-z]` match a range of characters from `a` to `z` +* `[0-9a-fA-F]` match any hexadecimal character + +And here are some examples: + +```bash +# change to the 'scripts' directory and source the 'globs.sh' script +$ source globs.sh +$ ls +100.sh f1.txt f4.txt hi.sh math.h report-02.log +42.txt f2_old.txt f7.txt ip.txt notes.txt report-04.log +calc.py f2.txt hello.py main.c report-00.log report-98.log + +# beginning with 'c' or 'h' or 't' +$ ls [cht]* +calc.py hello.py hi.sh + +# only hidden files and directories +$ ls -d .* +. .. .hidden .somerc + +# ending with '.c' or '.py' +$ ls *.c *.py +calc.py hello.py main.c + +# containing 'o' as well as 'x' or 'y' or 'z' afterwards +$ ls *o*[xyz]* +f2_old.txt hello.py notes.txt + +# ending with '.' and two more characters +$ ls *.?? +100.sh calc.py hello.py hi.sh + +# shouldn't start with 'f' and ends with '.txt' +$ ls [^f]*.txt +42.txt ip.txt notes.txt + +# containing digits '1' to '5' and ending with 'log' +$ ls *[1-5]*log +report-02.log report-04.log +``` + +Since some characters are special inside the character class, you need special placement to treat them as ordinary characters: + +* `-` should be the first or the last character in the set +* `^` should be other than the first character +* `]` should be the first character + +```bash +$ ls *[ns-]* +100.sh main.c report-00.log report-04.log +hi.sh notes.txt report-02.log report-98.log + +$ touch 'a^b' 'mars[planet].txt' +$ rm -i *[]^]* +rm: remove regular empty file 'a^b'? y +rm: remove regular empty file 'mars[planet].txt'? y +``` + +A **named character set** is defined by a name enclosed between `[:` and `:]` and has to be used within a character class `[]`, along with any other characters as needed. + +| Named set | Description | +| ------------ | ----------- | +| `[:digit:]` | `[0-9]` | +| `[:lower:]` | `[a-z]` | +| `[:upper:]` | `[A-Z]` | +| `[:alpha:]` | `[a-zA-Z]` | +| `[:alnum:]` | `[0-9a-zA-Z]` | +| `[:word:]` | `[0-9a-zA-Z_]` | +| `[:xdigit:]` | `[0-9a-fA-F]` | +| `[:cntrl:]` | control characters — first 32 ASCII characters and 127th (DEL) | +| `[:punct:]` | all the punctuation characters | +| `[:graph:]` | `[:alnum:]` and `[:punct:]` | +| `[:print:]` | `[:alnum:]`, `[:punct:]` and space | +| `[:ascii:]` | all the ASCII characters | +| `[:blank:]` | space and tab characters | +| `[:space:]` | whitespace characters | + +```bash +# starting with a digit character, same as: [0-9]* +$ ls [[:digit:]]* +100.sh 42.txt + +# starting with a digit character or 'c' +# same as: [0-9c]* +$ ls [[:digit:]c]* +100.sh 42.txt calc.py + +# starting with a non-alphabet character +$ ls [^[:alpha:]]* +100.sh 42.txt +``` + +>![info](images/info.svg) As mentioned before, you can use `echo` to test how the wildcards will expand before using a command to act upon the matching files. For example, `echo *.txt` before using commands like `rm *.txt`. One difference compared to `ls` is that `echo` will display the wildcard as is instead of showing an error if there's no match. + +>![info](./images/info.svg) See [bash manual: Pattern Matching](https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching) for more details, information on locale stuff and so on. + +## Brace Expansion + +This is not a wildcard feature, you just get expanded strings. Brace expansion has two mechanisms for reducing typing: + +* taking out common portions among multiple strings +* generating a range of characters + +Say you want to create two files named `test_x.txt` and `test_y.txt`. These two strings have something in common at the start and the end. You can specify the unique portions as comma separated strings within a pair of curly braces and put the common parts around the braces. Multiple braces can be used as needed. Use `echo` for testing purposes. + +```bash +$ mkdir practice_brace +$ cd practice_brace + +# same as: touch ip1.txt ip3.txt ip7.txt +$ touch ip{1,3,7}.txt +$ ls ip*txt +ip1.txt ip3.txt ip7.txt + +# same as: mv ip1.txt ip_a.txt +$ mv ip{1,_a}.txt +$ ls ip*txt +ip3.txt ip7.txt ip_a.txt + +$ echo adders/{half,full}_adder.v +adders/half_adder.v adders/full_adder.v + +$ echo file{0,1}.{txt,log} +file0.txt file0.log file1.txt file1.log + +# empty alternate is allowed too +$ echo file{,1}.txt +file.txt file1.txt + +# example with nested braces +$ echo file.{txt,log{,.bkp}} +file.txt file.log file.log.bkp +``` + +To generate a range, specify numbers or single characters separated by `..` and an optional third argument as the step value. Here are some examples: + +```bash +$ echo {1..4} +1 2 3 4 +$ echo {4..1} +4 3 2 1 + +$ echo {1..2}{a..b} +1a 1b 2a 2b + +$ echo file{1..4}.txt +file1.txt file2.txt file3.txt file4.txt + +$ echo file{1..10..2}.txt +file1.txt file3.txt file5.txt file7.txt file9.txt + +$ echo file_{x..z}.txt +file_x.txt file_y.txt file_z.txt + +$ echo {z..j..-3} +z w t q n k + +# '0' prefix +$ echo {008..10} +008 009 010 +``` + +If the use of braces doesn't match the expansion syntax, it will be left as is: + +```bash +$ echo file{1}.txt +file{1}.txt + +$ echo file{1-4}.txt +file{1-4}.txt +``` + +## Extended and Recursive globs + +From `man bash`: + +| Extended glob | Description | +| ----------------- | ---------------------------------------------------- | +| `?(pattern-list)` | Matches zero or one occurrence of the given patterns | +| `*(pattern-list)` | Matches zero or more occurrences of the given patterns | +| `+(pattern-list)` | Matches one or more occurrences of the given patterns | +| `@(pattern-list)` | Matches one of the given patterns | +| `!(pattern-list)` | Matches anything except one of the given patterns | + +Extended globs are disabled by default. You can use the `shopt` builtin to set/unset **sh**ell **opt**ions like `extglob`, `globstar`, etc. You can also check what is the current status of such options. + +```bash +$ shopt extglob +extglob off + +# set extglob +$ shopt -s extglob +$ shopt extglob +extglob on + +# unset extglob +$ shopt -u extglob +$ shopt extglob +extglob off +``` + +Here are some examples, assuming `extglob` option has already been set: + +```bash +# change to the 'scripts' directory and source the 'globs.sh' script +$ source globs.sh +$ ls +100.sh f1.txt f4.txt hi.sh math.h report-02.log +42.txt f2_old.txt f7.txt ip.txt notes.txt report-04.log +calc.py f2.txt hello.py main.c report-00.log report-98.log + +# one or more digits followed by '.' and then zero or more characters +$ ls +([0-9]).* +100.sh 42.txt + +# same as: ls *.c *.sh +$ ls *.@(c|sh) +100.sh hi.sh main.c + +# not ending with '.txt' +$ ls !(*.txt) +100.sh hello.py main.c report-00.log report-04.log +calc.py hi.sh math.h report-02.log report-98.log + +# not ending with '.txt' or '.log' +$ ls *.!(txt|log) +100.sh calc.py hello.py hi.sh main.c math.h +``` + +If you enable the `globstar` option, you can recursively match filenames within a specified path. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# with 'find' command (this will be explained in a later chapter) +$ find -name '*.txt' +./todos/books.txt +./todos/outing.txt +./ip.txt + +# with 'globstar' enabled +$ shopt -s globstar +$ ls **/*.txt +ip.txt todos/books.txt todos/outing.txt + +# another example +$ ls -1 **/*.@(py|html) +backups/bookmarks.html +hello_world.py +projects/tictactoe/game.py +``` + +>![info](images/info.svg) Add the `shopt` invocations to `~/.bashrc` if you want these settings applied at terminal startup. This will be discussed in the [Shell Customization](#shell-customization) chapter. + +## set + +The `set` builtin command helps you to set or unset values of shell options and positional parameters. Here are some examples for shell options: + +```bash +# disables logging command history from this point onwards +$ set +o history +# enable history logging +$ set -o history + +# use vi-style CLI editing interface +$ set -o vi +# use emancs-style interface, this is usually the default +$ set -o emacs +``` + +You'll see more examples (for example, `set -x`) in later chapters. See [bash manual: Set Builtin](https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin) for documentation. + +## Pipelines + +The pipe control operator `|` helps you connect the output of a command as the input of another command. This operator vastly reduces the need for temporary intermediate files. As discussed previously in the [Unix Philosophy](#unix-philosophy) section, command line tools specialize in one task. If you can break down a problem into smaller tasks, the pipe operator will come in handy often. Here are some examples: + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +# list of files +$ ls +projects report.log todos +# count the number of files +# you can also use: printf '%q\n' * | wc -l +$ ls -q | wc -l +3 + +# report size of files/folders in human readable format +# and then sort them based on human readable sizes in ascending order +$ du -sh * | sort -h +8.0K todos +48K projects +7.4M report.log +``` + +In the above examples, `ls` and `du` perform their own tasks of displaying list of files and showing file sizes respectively. After that, the `wc` and `sort` commands take care of calculating number of lines and sorting respectively. In such cases, the pipe operator saves you the trouble of dealing with temporary data. + +Note that the `%q` format specifier in `printf` helps you quote the arguments in a way that is recognizable by the shell. The `-q` option for `ls` substitutes nongraphic characters in the filenames with a `?` character. Both of these are workarounds to prevent the counting process from getting sidetracked due to characters like newline in the filenames. + +>![info](./images/info.svg) The pipe control operator `|&` will be discussed later in this chapter. + +### tee + +Sometimes, you might want to display the command output on the terminal as well as require the results for later use. In such cases, you can use the `tee` command: + +```bash +$ du -sh * | tee sizes.log +48K projects +7.4M report.log +8.0K todos + +$ cat sizes.log +48K projects +7.4M report.log +8.0K todos + +$ rm sizes.log +``` + +## Redirection + +From [bash manual: Redirections](https://www.gnu.org/software/bash/manual/bash.html#Redirections): + +>Before a command is executed, its input and output may be *redirected* using a special notation interpreted by the shell. Redirection allows commands' file handles to be duplicated, opened, closed, made to refer to different files, and can change the files the command reads from and writes to. Redirection may also be used to modify file handles in the current shell execution environment. + +There are three standard data streams: + +* **standard input** (`stdin` — file descriptor 0) +* **standard output** (`stdout` — file descriptor 1) +* **standard error** (`stderr` — file descriptor 2) + +Both standard output and error are displayed on the terminal by default. The `stderr` stream is used when something goes wrong with the command usage. Each of these three streams have a predefined [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) as mentioned above. In this section, you'll see how to redirect these three streams. + +> ![info](./images/info.svg) Redirections can be placed anywhere, but they are usually used at the start or end of a command. For example, the following two commands are equivalent: +> +> ```bash +> >op.txt grep 'error' report.log +> +> grep 'error' report.log >op.txt +> ``` + +>![info](images/info.svg) Space characters between the redirection operators and the filename are optional. + +### Redirecting output + +You can use the `>` operator to redirect the standard output of a command to a file. A number prefix can be added to the `>` operator to work with that particular file descriptor. Default is `1` (recall that the file descriptor for `stdout` is `1`), so `1>` and `>` perform the same operation. Use `>>` to append the output to a file. + +The filename provided to the `>` and `>>` operators will be created if a regular file of that name doesn't exist yet. If the file already exists, `>` will overwrite that file and `>>` will append contents to that file. + +```bash +# change to the 'example_files/text_files' directory for this section + +# save first three lines of 'sample.txt' to 'op.txt' +$ head -n3 sample.txt > op.txt +$ cat op.txt + 1) Hello World + 2) + 3) Hi there + +# append last two lines of 'sample.txt' to 'op.txt' +$ tail -n2 sample.txt >> op.txt +$ cat op.txt + 1) Hello World + 2) + 3) Hi there +14) He he he +15) Adios amigo + +$ rm op.txt +``` + +>![info](./images/info.svg) You can use `/dev/null` as a filename to discard the output, to provide an empty file for a command, etc. + +>![info](images/info.svg) You can use `set noclobber` to prevent overwriting if a file already exists. When the `noclobber` option is set, you can still overwrite a file by using `>|` instead of the `>` operator. + +### Redirecting input + +Some commands like `tr` and `datamash` can only work with data from the standard input. This isn't an issue when you are piping data from another command, for example: + +```bash +# filter lines containing 'the' from the input file 'greeting.txt' +# and then display the results in uppercase using the 'tr' command +$ grep 'the' greeting.txt | tr 'a-z' 'A-Z' +HI THERE +``` + +You can use the `<` redirection operator if you want to pass data from a file to such commands. The default prefix here is `0`, which is the file descriptor for `stdin` data. Here's an example: + +```bash +$ tr 'a-z' 'A-Z' ![info](./images/info.svg) ![warning](./images/warning.svg) Don't use `cat filename | cmd` for passing file content as `stdin` data, unless you need to concatenate data from multiple input files. See [wikipedia: UUOC](https://en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat) and [Useless Use of Cat Award](https://porkmail.org/era/unix/award.html) for more details. + +### Redirecting error + +Recall that the file descriptor for `stderr` is `2`. So, you can use `2>` to redirect standard error to a file. Use `2>>` if you need to append the contents. Here's an example: + +```bash +# assume 'abcdxyz' doesn't exist as a shell command +$ abcdxyz +abcdxyz: command not found + +# the error in such cases will be part of the stderr stream, not stdout +# so, you'll need to use 2> here +$ abcdxyz 2> cmderror.log +$ cat cmderror.log +abcdxyz: command not found + +$ rm cmderror.log +``` + +>![info](./images/info.svg) Use `/dev/null` as a filename if you need to discard the results. + +### Combining stdout and stderr + +Newer versions of Bash provide these handy shortcuts: + +* `&>` redirect both `stdout` and `stderr` (overwrites an existing file) +* `&>>` redirect both `stdout` and `stderr` (appends to existing file) +* `|&` pipe both `stdout` and `stderr` as input to another command + +Here's an example which assumes `xyz.txt` doesn't exist, thus leading to errors: + +```bash +# using '>' will redirect only the stdout stream +# stderr will be displayed on the terminal +$ grep 'log' file_size.txt xyz.txt > op.txt +grep: xyz.txt: No such file or directory + +# using '&>' will redirect both the stdout and stderr streams +$ grep 'log' file_size.txt xyz.txt &> op.txt +$ cat op.txt +file_size.txt:104K power.log +file_size.txt:746K report.log +grep: xyz.txt: No such file or directory + +$ rm op.txt +``` + +And here's an example with the `|&` operator: + +```bash +# filter lines containing 'log' from the given file arguments +# and then filter lines containing 'or' from the combined stdout and stderr +$ grep 'log' file_size.txt xyz.txt |& grep 'or' +file_size.txt:746K report.log +grep: xyz.txt: No such file or directory +``` + +For earlier Bash versions, you'll have to manually redirect the streams: + +* `1>&2` redirects file descriptor `1` (`stdout`) to the file descriptor `2` (`stderr`) +* `2>&1` redirects file descriptor `2` (`stderr`) to the file descriptor `1` (`stdout`) + +Here are some examples: + +```bash +# note that the order of redirections is important here +# you can also use: 2> op.txt 1>&2 +$ grep 'log' file_size.txt xyz.txt > op.txt 2>&1 +$ cat op.txt +file_size.txt:104K power.log +file_size.txt:746K report.log +grep: xyz.txt: No such file or directory +$ rm op.txt + +$ grep 'log' file_size.txt xyz.txt 2>&1 | grep 'or' +file_size.txt:746K report.log +grep: xyz.txt: No such file or directory +``` + +### Waiting for stdin + +Sometimes, you might mistype a command without providing input. And instead of getting an error, you'll see the cursor patiently waiting for something. This isn't the shell hanging up on you. The command is waiting for you to type data, so that it can perform its task. + +Say, you typed `cat` and pressed the Enter key. Seeing the blinking cursor, you type some text and press the Enter key again. You'll see the text you just typed echoed back to you as `stdout` (which is the functionality of the `cat` command). This will continue again and again, until you tell the shell that you are done. How to do that? Press `Ctrl+d` on a fresh line or press `Ctrl+d` twice at the end of a line. In the latter case, you'll not get a newline character at the end of the data. + +```bash +# press Enter key and Ctrl+d after typing all the required characters +$ cat +knock knock +knock knock +anybody here? +anybody here? + +# 'tr' command here translates lowercase to uppercase +$ tr 'a-z' 'A-Z' +knock knock +KNOCK KNOCK +anybody here? +ANYBODY HERE? +``` + +> ![info](./images/info.svg) Getting output immediately after each input line depends on the command's functionality. Commands like `sort` and `shuf` will wait for the entire input data before producing the output. +> +> ```bash +> # press Ctrl+d after the third input line +> $ sort +> lion +> zebra +> bee +> bee +> lion +> zebra +> ``` + +Here's an example which has output redirection as well: + +```bash +# press Ctrl+d after the line containing 'histogram' +# filter lines containing 'is' +$ grep 'is' > op.txt +hi there +this is a sample line +have a nice day +histogram + +$ cat op.txt +this is a sample line +histogram + +$ rm op.txt +``` + +>![info](./images/info.svg) See also [unix.stackexchange: difference between Ctrl+c and Ctrl+d](https://unix.stackexchange.com/q/16333/109046). + +### Here Documents + +Here Documents is another way to provide `stdin` data. In this case, the termination condition is a line matching a predefined string which is specified after the `<<` redirection operator. This is especially helpful for automation, since pressing `Ctrl+d` interactively isn't desirable. Here's an example: + +```bash +# EOF is typically used as the special string +$ cat << 'EOF' > fruits.txt +> banana 2 +> papaya 3 +> mango 10 +> EOF + +$ cat fruits.txt +banana 2 +papaya 3 +mango 10 +$ rm fruits.txt +``` + +In the above example, the termination string was enclosed in single quotes to prevent parameter expansion, command substitution, etc. You can also use `\string` for this purpose. If you use `<<-` instead of `<<`, leading tab characters can be added at the start of input lines without being part of the actual data. + +>![info](./images/info.svg) Just like `$` and a space represents the primary prompt (`PS1` shell variable), `>` and a space at the start of lines represents the secondary prompt `PS2` (applicable for multiline commands). Don't type these characters when you use Here Documents in a shell script. + +>![info](./images/info.svg) See [bash manual: Here Documents](https://www.gnu.org/software/bash/manual/bash.html#Here-Documents) and [stackoverflow: here documents](https://stackoverflow.com/q/2953081/4082052) for more examples and details. + +### Here Strings + +This is similar to Here Documents, but the termination string isn't used. The redirection operator is `<<<`. Here are some examples: + +```bash +$ tr 'a-z' 'A-Z' <<< hello +HELLO +$ tr 'a-z' 'A-Z' <<< 'hello world' +HELLO WORLD + +$ greeting='hello world' +$ tr 'a-z' 'A-Z' > op.txt <<< "$greeting" +$ cat op.txt +HELLO WORLD +$ rm op.txt +``` + +### Further Reading + +* [Short introduction to shell redirection](https://mywiki.wooledge.org/BashGuide/InputAndOutput#Redirection) +* [Illustrated Redirection Tutorial](https://wiki.bash-hackers.org/howto/redirection_tutorial) +* [stackoverflow: Redirect a stream to another file descriptor using >&](https://stackoverflow.com/q/818255/4082052) +* [Difference between 2>&1 >foo and >foo 2>&1](https://mywiki.wooledge.org/BashFAQ/055) +* [stackoverflow: Redirect and append both stdout and stderr to a file](https://stackoverflow.com/q/876239/4082052) +* [unix.stackexchange: Examples for <> redirection](https://unix.stackexchange.com/q/164391/109046) + +## Grouping commands + +You can use `(list)` and `{ list; }` compound commands to redirect content for several commands. The former is executed in a subshell whereas the latter is executed in the current shell context. Spaces around `()` are optional but necessary for the `{}` version. From [bash manual: Lists of Commands](https://www.gnu.org/software/bash/manual/bash.html#Lists): + +>A `list` is a sequence of one or more pipelines separated by one of the operators `;`, `&`, `&&`, or `||`, and optionally terminated by one of `;`, `&`, or a newline. + +Here are some examples of command groupings: + +```bash +# change to the 'example_files/text_files' directory for this section + +# the 'sed' command here gives the first line of the input +# rest of the lines are then processed by the 'sort' command +# thus, the header will always be the first line in the output +$ (sed -u '1q' ; sort) < scores.csv +Name,Maths,Physics,Chemistry +Cy,97,98,95 +Ith,100,100,100 +Lin,78,83,80 + +# save first three and last two lines from 'sample.txt' to 'op.txt' +$ { head -n3 sample.txt; tail -n2 sample.txt; } > op.txt +$ cat op.txt + 1) Hello World + 2) + 3) Hi there +14) He he he +15) Adios amigo +$ rm op.txt +``` + +You might wonder why the second command did not use `< sample.txt` instead of repeating the filename twice. The reason is that some commands might read more than what is required (for buffering purposes) and thus cause issues for the remaining commands. In the `sed+sort` example, the `-u` option guarantees that `sed` will not to read more than the required data. See [unix.stackexchange: sort but keep header line at the top](https://unix.stackexchange.com/q/11856/109046) for more examples and details. + +> ![info](./images/info.svg) You don't need the `()` or `{}` groups to see the results of multiple commands on the terminal. Just the `;` separator between the commands would be enough. See also [bash manual: Command Execution Environment](https://www.gnu.org/software/bash/manual/bash.html#Command-Execution-Environment). +> +> ```bash +> $ head -n1 sample.txt ; echo 'have a nice day' +> 1) Hello World +> have a nice day +> ``` + +## List control operators + +You can use these operators to control the execution of the subsequent command depending on the exit status of the first command. From [bash manual: Lists of Commands](https://www.gnu.org/software/bash/manual/bash.html#Lists): + +>AND and OR lists are sequences of one or more pipelines separated by the control operators `&&` and `||`, respectively. AND and OR lists are executed with left associativity. + +For AND list, the second command will be executed if and only if the first command exits with `0` status. + +```bash +# first command succeeds here, so the second command is also executed +$ echo 'hello' && echo 'have a nice day' +hello +have a nice day + +# assume 'abcdxyz' doesn't exist as a shell command +# the second command will not be executed +$ abcdxyz && echo 'have a nice day' +abcdxyz: command not found + +# if you use ';' instead, the second command will still be executed +$ abcdxyz ; echo 'have a nice day' +abcdxyz: command not found +have a nice day +``` + +For OR list, the second command will be executed if and only if the first command does *not* exit with `0` status. + +```bash +# since the first command succeeds, the second one won't run +$ echo 'hello' || echo 'have a nice day' +hello + +# assume 'abcdxyz' doesn't exist as a shell command +# since the first command fails, the second one will run +$ abcdxyz || echo 'have a nice day' +abcdxyz: command not found +have a nice day +``` + +## Command substitution + +Command substitution allows you to use the standard output of a command as part of another command. Trailing newlines, if any, will be removed. You can use the newer and preferred syntax `$(command)` or the older syntax `` `command` ``. Here are some examples: + +```bash +# sample input +$ printf 'hello\ntoday is: \n' +hello +today is: +# append output from the 'date' command to the line containing 'today' +$ printf 'hello\ntoday is: \n' | sed '/today/ s/$/'"$(date +%A)"'/' +hello +today is: Monday + +# save the output of 'wc' command to a variable +# same as: line_count=`wc -l When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by `$`, `` ` ``, or `\`. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially. +> +>Command substitutions may be nested. To nest when using the backquoted form, escape the inner backquotes with backslashes. + +## Process substitution + +Instead of a file argument, you can use the output of commands with process substitution. The syntax is `<(list)`. The shell will take care of passing a filename with the standard output of those commands. Here's an example: + +```bash +# change to the 'example_files/text_files' directory for this section + +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# can also use: paste -d, <(echo 'ID'; seq 3) scores.csv +$ paste -d, <(printf 'ID\n1\n2\n3') scores.csv +ID,Name,Maths,Physics,Chemistry +1,Ith,100,100,100 +2,Cy,97,98,95 +3,Lin,78,83,80 +``` + +For the above example, you could also have used `-` to represent `stdin` piped data as seen in an earlier section. Here's an example where two substitutions are used. This essentially helps you to avoid managing multiple temporary files, similar to how the `|` pipe operator helps for single temporary file. + +```bash +# side-by-side view of sample input files +$ paste f1.txt f2.txt +1 1 +2 hello +3 3 +world 4 + +# this command gives the common lines between two files +# the files have to be sorted for the command to work properly +$ comm -12 <(sort f1.txt) <(sort f2.txt) +1 +3 +``` + +>![info](./images/info.svg) See [this unix.stackexchange thread](https://unix.stackexchange.com/q/609375/109046) for examples with `>(list)` form. + +## Exercises + +>![info](./images/info.svg) Use the `globs.sh` script for wildcards related exercises, unless otherwise mentioned. + +>![info](./images/info.svg) Create a temporary directory for exercises that may require you to create some files. You can delete such practice directories afterwards. + +**1)** Use the `echo` command to display the text as shown below. Use appropriate quoting as necessary. + +```abc +# ??? +that's great! $x = $y + $z +``` + +**2)** Use the `echo` command to display the values of the three variables in the format as shown below. + +```bash +$ n1=10 +$ n2=90 +$ op=100 + +# ??? +10 + 90 = 100 +``` + +**3)** What will be the output of the command shown below? + +```bash +$ echo $'\x22apple\x22: \x2710\x27' +``` + +**4)** List filenames starting with a digit character. + +```bash +# change to the 'scripts' directory and source the 'globs.sh' script +$ source globs.sh + +# ??? +100.sh 42.txt +``` + +**5)** List filenames whose extension do not begin with `t` or `l`. Assume extensions will have at least one character. + +```bash +# ??? +100.sh calc.py hello.py hi.sh main.c math.h +``` + +**6)** List filenames whose extension only have a single character. + +```bash +# ??? +main.c math.h +``` + +**7)** List filenames whose extension is not `txt`. + +```bash +# ??? +100.sh hello.py main.c report-00.log report-04.log +calc.py hi.sh math.h report-02.log report-98.log +``` + +**8)** Describe the wildcard pattern used in the command shown below. + +```bash +$ ls *[^[:word:]]*.* +report-00.log report-02.log report-04.log report-98.log +``` + +**9)** List filenames having only lowercase alphabets before the extension. + +```bash +# ??? +calc.py hello.py hi.sh ip.txt main.c math.h notes.txt +``` + +**10)** List filenames starting with `ma` or `he` or `hi`. + +```bash +# ??? +hello.py hi.sh main.c math.h +``` + +**11)** What commands would you use to get the outputs shown below? Assume that you do not know the depth of sub-directories. + +```bash +# change to the 'scripts' directory and source the 'ls.sh' script +$ source ls.sh + +# filenames ending with '.txt' +# ??? +ip.txt todos/books.txt todos/outing.txt + +# directories starting with 'c' or 'd' or 'g' or 'r' or 't' +# ??? +backups/dot_files/ +projects/calculator/ +projects/tictactoe/ +todos/ +``` + +**12)** Create and change to an empty directory. Then, use brace expansion along with relevant commands to get the results shown below. + +```bash +# ??? +$ ls report* +report_2020.txt report_2021.txt report_2022.txt + +# use 'cp' command here +# ??? +$ ls report* +report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt +``` + +**13)** What does the `set` builtin command do? + +**14)** What does the `|` pipe operator do? And when would you add the `tee` command? + +**15)** Can you infer what the following command does? *Hint*: see `help printf`. + +```bash +$ printf '%s\n' apple car dragon +apple +car +dragon +``` + +**16)** Use brace expansion along with relevant commands and shell features to get the result shown below. *Hint*: see previous question. + +```bash +$ ls ip.txt +ls: cannot access 'ip.txt': No such file or directory + +# ??? +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +``` + +**17)** With `ip.txt` containing text as shown in the previous question, use brace expansion and relevant commands to get the result shown below. + +```bash +# ??? +$ cat ip.txt +item_10 +item_12 +item_14 +item_16 +item_18 +item_20 +apple_1_banana_6 +apple_1_banana_7 +apple_1_banana_8 +apple_2_banana_6 +apple_2_banana_7 +apple_2_banana_8 +apple_3_banana_6 +apple_3_banana_7 +apple_3_banana_8 +``` + +**18)** What are the differences between `<` and `|` shell operators, if any? + +**19)** Which character is typically used to represent `stdin` data as a file argument? + +**20)** What do the following operators do? + +*a)* `1>` +*b)* `2>` +*c)* `&>` +*d)* `&>>` +*e)* `|&` + +**21)** What will be the contents of `op.txt` if you use the following `grep` command? + +```bash +# press Ctrl+d after the line containing 'histogram' +$ grep 'hi' > op.txt +hi there +this is a sample line +have a nice day +histogram + +$ cat op.txt +``` + +**22)** What will be the contents of `op.txt` if you use the following commands? + +```bash +$ qty=42 +$ cat << end > op.txt +> dragon +> unicorn +> apple $qty +> ice cream +> end + +$ cat op.txt +``` + +**23)** Correct the command to get the expected output shown below. + +```bash +$ books='cradle piranesi soulhome bastion' + +# something is wrong with this command +$ sed 's/\b\w/\u&/g' <<< '$books' +$Books + +# ??? +Cradle Piranesi Soulhome Bastion +``` + +**24)** Correct the command to get the expected output shown below. + +```bash +# something is wrong with this command +$ echo 'hello' ; seq 3 > op.txt +hello +$ cat op.txt +1 +2 +3 + +# ??? +$ cat op.txt +hello +1 +2 +3 +``` + +**25)** What will be the output of the following commands? + +```bash +$ printf 'hello' | tr 'a-z' 'A-Z' && echo ' there' + +$ printf 'hello' | tr 'a-z' 'A-Z' || echo ' there' +``` + +**26)** Correct the command(s) to get the expected output shown below. + +```bash +# something is wrong with these commands +$ nums=$(seq 3) +$ echo $nums +1 2 3 + +# ??? +1 +2 +3 +``` + +**27)** Will the following two commands produce equivalent output? If not, why not? + +```bash +$ paste -d, <(seq 3) <(printf '%s\n' item_{1..3}) + +$ printf '%s\n' {1..3},item_{1..3} +``` + +# Viewing Part or Whole File Contents + +In this chapter, you'll learn how to view contents of files from within the terminal. If the contents are too long, you can choose to view one screenful at a time or get only the starting/ending portions of the input. The commands used for these purposes also have other functionalities, some of which will be discussed in this chapter as well. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. + +## cat + +The `cat` command derives its name from con**cat**enate. It is primarily used to combine the contents of multiple files to be saved in a file or sent as input to another command. + +Commonly used options are shown below: + +* `-n` prefix line number and a tab character to each input line +* `-b` like `-n` but doesn't number empty lines +* `-s` squeeze consecutive empty lines to a single empty line +* `-v` view special characters like NUL using the [caret notation](https://en.wikipedia.org/wiki/ASCII_control_characters#Control_code_chart) +* `-e` view special characters as well as mark the end of line +* `-A` includes `-e` and also helps to spot tab characters + +Here are some examples to showcase `cat`'s main utility. One or more files can be given as arguments. + +>![info](./images/info.svg) As mentioned earlier, the [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. You need to `cd` into the `example_files/text_files` directory to follow along the examples shown in this chapter. + +```bash +# view contents of a single file +$ cat greeting.txt +Hi there +Have a nice day + +# another example +$ cat fruits.txt +banana +papaya +mango + +# concatenate multiple files +$ cat greeting.txt fruits.txt +Hi there +Have a nice day +banana +papaya +mango +``` + +To save the output of concatenation, use redirection: + +```bash +$ cat greeting.txt fruits.txt > op.txt + +$ cat op.txt +Hi there +Have a nice day +banana +papaya +mango +``` + +You can represent `stdin` data using `-` as a file argument. If file arguments are not present, `cat` will read from `stdin` data if present or wait for interactive input. Note that `-` is also supported by many more commands to indicate `stdin` data. + +```bash +# concatenate contents of 'greeting.txt' and 'stdin' data +$ echo 'apple banana cherry' | cat greeting.txt - +Hi there +Have a nice day +apple banana cherry +``` + +>![info](./images/info.svg) Using `cat` to view the contents of a file, to concatenate them, etc is well and good. But, using `cat` when it is not needed is a bad habit that you should avoid. See [wikipedia: UUOC](https://en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat) and [Useless Use of Cat Award](https://porkmail.org/era/unix/award.html) for more details. + +`cat` also helps you spot special characters using the [caret notation](https://en.wikipedia.org/wiki/ASCII_control_characters#Control_code_chart): + +```bash +# example for backspace and carriage return characters +$ printf 'car\bd\nbike\rp\n' +cad +pike +$ printf 'car\bd\nbike\rp\n' | cat -v +car^Hd +bike^Mp + +# example with tab characters and end-of-line marker +$ printf '1 2\t3\f4\v5 \n' | cat -A +1 2^I3^L4^K5 $ +``` + +## tac + +You can concatenate files using `tac` as well, but the output will be printed in the reverse (line wise). If you pass multiple input files, each file content will be reversed separately. Here are some examples: + +```bash +$ printf 'apple\nbanana\ncherry\n' | tac +cherry +banana +apple + +# won't be same as: cat greeting.txt fruits.txt | tac +$ tac greeting.txt fruits.txt +Have a nice day +Hi there +mango +papaya +banana +``` + +>![warning](./images/warning.svg) If the last line of input doesn't end with a newline, the output will also not have that newline character. + +```bash +$ printf 'apple\nbanana\ncherry' | tac +cherrybanana +apple +``` + +## less + +The `cat` command is not suitable for viewing contents of large files in the terminal. The `less` command automatically fits the content to the size of terminal, allows scrolling and has nifty features for effective viewing. Usually, `man` command uses `less` as the `pager` to display the documentation. The navigation options are similar to the Vim text editor. + +Commonly used commands are given below. You can press the `h` key for builtin help. + +* `↑` and `↓` arrow keys to move up and down by a line + * you can also use `k` and `j` keys (same keys as those used in the Vim text editor) +* `f` and `b` keys to move forward and backward by a screenful of content + * `Space` key also moves forward by a screen +* mouse scroll moves up and down by a few lines +* `g` or `Home` go to the start of the file +* `G` or `End` go to the end of the file +* `/pattern` followed by `Enter` search for the given pattern in the forward direction + * pattern refers to regular expressions and depends on the regex library in your system + * the flavor is Extended Regular Expressions (ERE) on my system + * see `man re_format` for more details +* `?pattern` followed by `Enter` search for the given pattern in the backward direction +* `n` go to the next match +* `N` go to the previous match +* `q` quit + +As an example, use `less /usr/share/dict/words` to open a dictionary file and practice the commands discussed above. If your `pager` is set to `less` for manual pages, you can also try something like `man ls` for practice. + +Similar to the `cat` command, you can use the `-s` option to squeeze consecutive blank lines. But unlike `cat -n`, you need to use `less -N` to prefix line numbers. The lowercase `-n` option will turn off numbering. + +**Further Reading** + +* `less` command is an [improved version](https://unix.stackexchange.com/q/604/109046) of the `more` command +* [unix.stackexchange: differences between most, more and less](https://unix.stackexchange.com/q/81129/109046) +* My [Vim Reference Guide](https://github.com/learnbyexample/vim_reference) ebook + +## tail + +By default, `tail` displays the last 10 lines of input file(s). If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `tail -n +N`, you can get all the lines starting from the `N`th line. + +Here's an example file that'll be used for illustration purposes: + +```bash +$ cat sample.txt + 1) Hello World + 2) + 3) Hi there + 4) How are you + 5) + 6) Just do-it + 7) Believe it + 8) + 9) banana +10) papaya +11) mango +12) +13) Much ado about nothing +14) He he he +15) Adios amigo +``` + +Here are some examples with `-n` option: + +```bash +# last two lines (input has 15 lines) +$ tail -n2 sample.txt +14) He he he +15) Adios amigo + +# all lines starting from the 11th line +# space between -n and +N is optional +$ tail -n +11 sample.txt +11) mango +12) +13) Much ado about nothing +14) He he he +15) Adios amigo +``` + +If you pass multiple input files, each file will be processed separately. By default, the output is nicely formatted with filename headers and empty line separators which you can override with the `-q` (quiet) option. + +```bash +$ tail -n2 fruits.txt sample.txt +==> fruits.txt <== +papaya +banana + +==> sample.txt <== +14) He he he +15) Adios amigo +``` + +The `-c` option works similar to the `-n` option, but with bytes instead of lines: + +```bash +# last three bytes +# note that the input doesn't end with a newline character +$ printf 'apple pie' | tail -c3 +pie + +# starting from the fifth byte +$ printf 'car\njeep\nbus\n' | tail -c +5 +jeep +bus +``` + +**Further Reading** + +* [wikipedia: File monitoring with tail -f and -F options](https://en.wikipedia.org/wiki/Tail_(Unix)#File_monitoring) +* [unix.stackexchange: How does the tail -f option work?](https://unix.stackexchange.com/q/18760/109046) +* [How to deal with output buffering?](https://mywiki.wooledge.org/BashFAQ/009) + +## head + +By default, `head` displays the first 10 lines of input file(s). If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `head -n -N`, you can get all the input lines except the last `N` lines. + +```bash +# first three lines +$ head -n3 sample.txt + 1) Hello World + 2) + 3) Hi there + +# except the last 11 lines +$ head -n -11 sample.txt + 1) Hello World + 2) + 3) Hi there + 4) How are you +``` + +You can select a range of lines by combining both `head` and `tail` commands. + +```bash +# 9th to 11th lines +# same as: tail -n +9 sample.txt | head -n3 +$ head -n11 sample.txt | tail -n +9 + 9) banana +10) papaya +11) mango +``` + +If you pass multiple input files, each file will be processed separately. By default, the output is nicely formatted with filename headers and empty line separators which you can override with the `-q` (quiet) option. + +```bash +$ printf '1\n2\n' | head -n1 greeting.txt - +==> greeting.txt <== +Hi there + +==> standard input <== +1 +``` + +The `-c` option works similar to the `-n` option, but with bytes instead of lines: + +```bash +# first three bytes +$ printf 'apple pie' | head -c3 +app + +# excluding the last four bytes +$ printf 'car\njeep\nbus\n' | head -c -4 +car +jeep +``` + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which option(s) would you use to get the output shown below? + +```bash +$ printf '\n\n\ndragon\n\n\nunicorn\n\n\n' | cat # ??? + + 1 dragon + + 2 unicorn + +``` + +**2)** Pass appropriate arguments to the `cat` command to get the output shown below. + +```bash +$ cat greeting.txt +Hi there +Have a nice day + +$ echo '42 apples and 100 bananas' | cat # ??? +42 apples and 100 bananas +Hi there +Have a nice day +``` + +**3)** Will the two commands shown below produce the same output? If not, why not? + +```bash +$ cat fruits.txt ip.txt | tac + +$ tac fruits.txt ip.txt +``` + +**4)** Go through the manual for the `tac` command and use appropriate options and arguments to get the output shown below. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +# ??? +%=%= +brown +green +%=%= +apple +banana +``` + +**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? + +**6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? + +**7)** Use appropriate commands and shell features to get the output shown below. + +```bash +$ printf 'carpet\njeep\nbus\n' +carpet +jeep +bus + +# use the above 'printf' command for input data +$ c=# ??? +$ echo "$c" +car +``` + +**8)** How would you display all the input lines except the first one? + +```bash +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? +fig +carpet +jeep +bus +``` + +**9)** Which command(s) would you use to get the output shown below? + +```bash +$ cat fruits.txt +banana +papaya +mango +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +# ??? +banana +papaya +%=%= +apple +``` + +**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. + +```bash +$ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? +carp +``` + +**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. + +```bash +# ??? +brown banana +``` + +**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. + +```bash +# ??? +mango + 3.14 +``` + +# Searching Files and Filenames + +This chapter will show how to search file contents based on literal strings or regular expressions. After that, you'll learn how to locate files based on their names and other properties like size, last modified, etc. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. + +## grep + +Quoting from [wikipedia](https://en.wikipedia.org/wiki/Grep): + +>**`grep`** is a command-line utility for searching plain-text data sets for lines that match a regular expression. Its name comes from the `ed` command `g/re/p` (**g**lobally search a **r**egular **e**xpression and **p**rint), which has the same effect. + +The `grep` command has lots and lots of features, so much so that I wrote [a book](https://github.com/learnbyexample/learn_gnugrep_ripgrep) about it. The most common usage is filtering lines from the input using a regular expression (regexp). + +### Common options + +Commonly used options are shown below. Examples will be discussed in later sections. + +* `--color=auto` highlight the matching portions, filenames, line numbers, etc using colors +* `-i` ignore case while matching +* `-v` print non-matching lines +* `-n` prefix line numbers for matching lines +* `-c` display only the count of number of matching lines +* `-l` print only the filenames matching the given expression +* `-L` print filenames NOT matching the pattern +* `-w` match pattern only as whole words +* `-x` match pattern only as whole lines +* `-F` interpret pattern as a fixed string (i.e. not a regular expression) +* `-o` print only matching parts +* `-A N` print matching line and `N` number of lines after the matched line +* `-B N` print matching line and `N` number of lines before the matched line +* `-C N` print matching line and `N` number of lines before and after the matched line +* `-m N` print a maximum of `N` matching lines +* `-q` no standard output, quit immediately if match found, useful in scripts +* `-s` suppress error messages, useful in scripts +* `-r` recursively search all files in the specified input folders (by default searches current directory) +* `-R` like `-r`, but follows symbolic links as well +* `-h` do not prefix filename for matching lines (default behavior for single input file) +* `-H` prefix filename for matching lines (default behavior for multiple input files) + +### Literal search + +The following examples would all be suited for `-F` option as these do not use regular expressions. `grep` is smart enough to do the right thing in such cases. + +```bash +# lines containing 'an' +$ printf 'apple\nbanana\nmango\nfig\ntango\n' | grep 'an' +banana +mango +tango + +# case insensitive matching +$ printf 'Cat\ncut\ncOnCaT\nfour cats\n' | grep -i 'cat' +Cat +cOnCaT +four cats + +# match only whole words +$ printf 'par value\nheir apparent\ntar-par' | grep -w 'par' +par value +tar-par + +# count empty lines +$ printf 'hi\n\nhello\n\n\n\nbye\n' | grep -cx '' +4 + +# matching line and two lines after +$ printf 'red\nblue\ngreen\nbrown\nyellow' | grep -A2 'blue' +blue +green +brown +``` + +Here's an example with line numbers and matched portions in color: + +![example with --color option](images/grep_color.png) + +### Regular Expressions + +By default, `grep` treats the search pattern as Basic Regular Expression (BRE) + +* `-G` option can be used to specify explicitly that BRE is needed +* `-E` option will enable Extended Regular Expression (ERE) + * in `GNU grep`, BRE and ERE only differ in how metacharacters are specified, no difference in features +* `-F` option will cause the search patterns to be treated literally +* `-P` if available, this option will enable Perl Compatible Regular Expression (PCRE) + +The following reference is for **Extended Regular Expressions**. + +**Anchors** + +* `^` restricts the match to the start of the string +* `$` restricts the match to the end of the string +* `\<` restricts the match to the start of word +* `\>` restricts the match to the end of word +* `\b` restricts the match to the start/end of words +* `\B` matches wherever `\b` doesn't match + +**Dot metacharacter and Quantifiers** + +* `.` match any character, including the newline character +* `?` match `0` or `1` times +* `*` match `0` or more times +* `+` match `1` or more times +* `{m,n}` match `m` to `n` times +* `{m,}` match at least `m` times +* `{,n}` match up to `n` times (including `0` times) +* `{n}` match exactly `n` times + +**Character classes** + +* `[set123]` match any of these characters once +* `[^set123]` match except any of these characters once +* `[3-7AM-X]` range of characters from `3` to `7`, `A`, another range from `M` to `X` +* `\w` similar to `[a-zA-Z0-9_]` for matching word characters +* `\s` similar to `[ \t\n\r\f\v]` for matching whitespace characters +* `\W` match non-word characters +* `\S` match non-whitespace characters +* `[[:digit:]]` similar to `[0-9]` +* `[[:alnum:]_]` similar to `\w` + * see [grep manual](https://www.gnu.org/software/grep/manual/grep.html#Character-Classes-and-Bracket-Expressions) for full list + +**Alternation and Grouping** + +* `pat1|pat2|pat3` match `pat1` or `pat2` or `pat3` +* `()` group patterns, `a(b|c)d` is same as `abd|acd` + * also serves as a capture group +* `\N` backreference, gives matched portion of `N`th capture group + * `\1` backreference to the first capture group + * `\2` backreference to the second capture group and so on up to `\9` + +Quoting from the manual for BRE vs ERE differences: + +>In basic regular expressions the meta-characters `?`, `+`, `{`, `|`, `(`, and `)` lose their special meaning; instead use the backslashed versions `\?`, `\+`, `\{`, `\|`, `\(`, and `\)`. + +### Regexp examples + +```bash +# lines ending with 'ar' +$ printf 'spared no one\npar\nspar\ndare' | grep 'ar$' +par +spar + +# extract 'part' or 'parrot' or 'parent' case insensitively +$ echo 'par apartment PARROT parent' | grep -ioE 'par(en|ro)?t' +part +PARROT +parent + +# extract quoted text +$ echo 'I like "mango" and "guava"' | grep -oE '"[^"]+"' +"mango" +"guava" + +# 8 character lines having same 3 lowercase letters at start and end +$ grep -xE '([a-z]{3})..\1' /usr/share/dict/words +mesdames +respires +restores +testates +``` + +### Line comparisons between files + +The `-f` and `-x` options can be combined to get common lines between two files or the difference when `-v` is used as well. Add `-F` if you want to treat the search strings literally (recall that regexp is the default). + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# common lines between two files +$ grep -Fxf colors_1 colors_2 +yellow + +# lines present in colors_2 but not in colors_1 +$ grep -Fvxf colors_1 colors_2 +blue +black +dark green + +# lines present in colors_1 but not in colors_2 +$ grep -Fvxf colors_2 colors_1 +teal +light blue +brown +``` + +### Perl Compatible Regular Expression + +PCRE has many advanced features compared to BRE/ERE. Here are some examples: + +```bash +# numbers >= 100, uses possessive quantifiers +$ echo '0501 035 154 12 26 98234' | grep -oP '0*+\d{3,}' +0501 +154 +98234 + +# extract digits only if preceded by = +$ echo '100 apple=42, fig=314 red:255' | grep -oP '=\K\d+' +42 +314 + +# all digits and optional hyphen combo from the start of the line +$ echo '123-87-593 42 fig 314-12-111' | grep -oP '\G\d+-?' +123- +87- +593 + +# all whole words except 'bat' and 'map' +$ echo 'car2 bat cod map combat' | grep -oP '\b(bat|map)\b(*SKIP)(*F)|\w+' +car2 +cod +combat +``` + +See `man pcrepattern` or [PCRE online manual](https://www.pcre.org/original/doc/html/pcrepattern.html) for documentation. + +### Recursive search + +You can use the `-r` option to search recursively within the specified directories. By default, the current directory will be searched. Use `-R` if you want symbolic links found within the input directories to be followed as well. You do not need `-R` option for specifying symbolic links as arguments. + +Here are some basic examples. Recursive search will work as if `-H` option was specified as well, even if only one file was matched. Also, hidden files are included by default. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh +$ ls -AF +backups/ colors_1 colors_2 .hidden projects/ + +# recursively search in the 'backups' directory +$ grep -r 'clear' backups +backups/dot_files/.bash_aliases:alias c=clear +# add -h option to prevent filename prefix in the output +$ grep -rh 'clear' backups +alias c=clear + +# by default, the current directory is used for recursive search +$ grep -rl 'clear' +.hidden +backups/dot_files/.bash_aliases +``` + +You can further prune the files to be searched using the *include/exclude* options. Note that these options will work even if recursive search is not active. + +| Option | Description | +| -------------------- | -------------- | +| --include=GLOB | search only files that match GLOB | +| --exclude=GLOB | skip files that match GLOB | +| --exclude-from=FILE | skip files that match any file pattern from FILE | +| --exclude-dir=GLOB | skip directories that match GLOB | + +```bash +# default recursive search +$ grep -r 'Hello' +projects/python/hello.py:print("Hello, Python!") +projects/shell/hello.sh:echo "Hello, Bash!" + +# limit the search to only filenames ending with '.py' +$ grep -r --include='*.py' 'Hello' +projects/python/hello.py:print("Hello, Python!") + +# alternatively, you can use shell globs instead of recursive+include/exclude +$ shopt -s globstar +$ grep -H 'Hello' **/*.py +projects/python/hello.py:print("Hello, Python!") +``` + +>![info](./images/info.svg) [ripgrep](https://github.com/BurntSushi/ripgrep) is a recommended alternative to `GNU grep` with a highly optimized regexp engine, parallel search, ignoring files based on `.gitignore` and so on. + +### grep and xargs + +You can use the shell `|` operator to pass the output of a command as input to another command. Suppose a command gives you a list of filenames and you want to pass this list as input *arguments* to another command, what would you do? One solution is to use the `xargs` command. Here's a basic example (assuming filenames won't conflict with shell metacharacters): + +```bash +# an example command producing a list of filenames +$ grep -rl 'clear' +.hidden +backups/dot_files/.bash_aliases + +# same as: head -n1 .hidden backups/dot_files/.bash_aliases +$ grep -rl 'clear' | xargs head -n1 +==> .hidden <== +ghost + +==> backups/dot_files/.bash_aliases <== +alias p=pwd +``` + +Characters like space, newline, semicolon, etc are special to the shell. So, filenames containing these characters have to be properly quoted. Or, where applicable, you can use a list of filenames separated by the ASCII NUL character (since filenames cannot have the NUL character). You can use `grep -Z` to separate the output with NUL and `xargs -0` to treat the input as NUL separated. Here's an example: + +```bash +# consider this command that generates a list of filenames +$ grep -rl 'blue' +.hidden +colors_1 +colors_2 +backups/color list.txt + +# example to show issues due to filenames containing shell metacharacters +# 'backups/color list.txt' is treated as two different files +$ grep -rl 'blue' | xargs grep -l 'teal' +colors_2 +grep: backups/color: No such file or directory +grep: list.txt: No such file or directory + +# use 'grep -Z' + 'xargs -0' combo for a robust solution +# match files containing both 'blue' and 'teal' +$ grep -rlZ 'blue' | xargs -0 grep -l 'teal' +colors_1 +``` + +Note that the command passed to `xargs` doesn't accept custom made aliases and functions. So, if you had aliased `grep` to `grep --color=auto`, don't be surprised if the output isn't colorized. See [unix.stackexchange: have xargs use alias instead of binary](https://unix.stackexchange.com/q/141367/109046) for details and workarounds. + +>![info](./images/info.svg) You can use `xargs -r` to avoid running the command when the filename list doesn't have any non-blank character (i.e. when the list is empty). +> +> ```bash +> # there's no file containing 'violet' +> # so, xargs doesn't get any filename, but grep is still run +> $ grep -rlZ 'violet' | xargs -0 grep -L 'brown' +> (standard input) +> +> # using -r option avoids running the command in such cases +> $ grep -rlZ 'violet' | xargs -r0 grep -L 'brown' +> ``` + +>![warning](images/warning.svg) ![warning](images/warning.svg) Do not use `xargs -P` to combine the output of parallel runs, as you are likely to get a mangled result. The [parallel](https://www.gnu.org/software/parallel/) command would be a better option. See [unix.stackexchange: xargs vs parallel](https://unix.stackexchange.com/q/104778/109046) for more details. See also [unix.stackexchange: when to use xargs](https://unix.stackexchange.com/q/24954/109046). + +### Further Reading + +* My ebook [GNU GREP and RIPGREP](https://github.com/learnbyexample/learn_gnugrep_ripgrep) + * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) +* [Why GNU grep is fast](https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html) +* [unix.stackexchange: grep -r vs find+grep](https://unix.stackexchange.com/q/131535/109046) + +## find + +The `find` command has comprehensive features to filter files and directories based on their name, size, timestamp and so on. And more importantly, `find` helps you to perform actions on such filtered files. + +### Filenames + +By default, you'll get every entry (including hidden ones) in the current directory and sub-directories when you use `find` without any options or paths. To search within specific path(s), they should be immediately mentioned after `find`, i.e. before any options. + +```bash +# change to the 'scripts' directory and source the 'find.sh' script +$ source find.sh +$ ls -F +backups/ hello_world.py* ip.txt report.log todos/ +errors.log hi.sh* projects/ scripts@ + +$ cd projects +# same as: find . +$ find +. +./.venv +./tictactoe +./tictactoe/game.py +./calculator +./calculator/calc.sh + +$ cd .. +$ find todos +todos +todos/books.txt +todos/TRIP.txt +todos/wow.txt +``` + +>![info](./images/info.svg) Note that symbolic links won't be followed by default. You can use `-L` option for such cases. + +To match filenames based on a particular criteria, you can use wildcards or regular expressions. For wildcards, you can use `-name` or the case-insensitive version `-iname`. These will match only the basename, so you'll get a warning if you use `/` as part of the pattern. You can use `-path` and `-ipath` if you need to include `/` as well in the pattern. Unlike `grep`, the glob pattern is matched against the entire basename (as there are no start/end anchors in globs). + +```bash +# filenames ending with '.log' +# 'find .' indicates current working directory (CWD) as the path to search +$ find . -name '*.log' +./report.log +./backups/aug.log +./backups/jan.log +./errors.log + +# match filenames containing 'ip' case-insensitively +# note the use of '*' on both sides of 'ip' to match the whole filename +# . is optional when CWD is the only path to search +$ find -iname '*ip*' +./todos/TRIP.txt +./scripts +./ip.txt + +# names containing 'k' within 'backups' and 'todos' directories +$ find backups todos -name '*k*' +backups +backups/bookmarks.html +todos/books.txt +``` + +You can use the `-not` (or `!`) operator to invert the matching condition: + +```bash +# same as: find todos ! -name '*[A-Z]*' +$ find todos -not -name '*[A-Z]*' +todos +todos/books.txt +todos/wow.txt +``` + +You can use `-regex` and `-iregex` (case-insensitive) to match filenames based on regular expressions. In this case, the pattern will match the entire path, so use of `/` is possible without needing to use special options. The default regexp flavor is `emacs` which you can change by using the `-regextype` option. + +```bash +# filename containing only uppercase alphabets and file extension is '.txt' +# note the use of '.*/' to match the entire file path +$ find -regex '.*/[A-Z]+\.txt' +./todos/TRIP.txt + +# here 'egrep' flavor is being used +# filename starting and ending with the same word character (case-insensitive) +# and file extension is '.txt' +$ find -regextype egrep -iregex '.*/(\w).*\1\.txt' +./todos/wow.txt +``` + +### File type + +The `-type` option helps to filter files based on their types like regular file, directory, symbolic link, etc. + +```bash +# regular files +$ find projects -type f +projects/tictactoe/game.py +projects/calculator/calc.sh + +# regular files that are hidden as well +$ find -type f -name '.*' +./.hidden +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc + +# directories +$ find projects -type d +projects +projects/.venv +projects/tictactoe +projects/calculator + +# symbolic links +$ find -type l +./scripts +``` + +>![info](./images/info.svg) You can use `,` to separate multiple file types. For example, `-type f,l` will match both regular files and symbolic links. + +### Depth + +The path being searched is considered as depth `0`, files within the search path are at depth `1`, files within a sub-directory are at depth `2` and so on. Note that these global options should be specified before other kind of options like `-type`, `-name`, etc. + +`-maxdepth` option restricts the search to the specified maximum depth: + +```bash +# non-hidden regular files only in the current directory +# sub-directories will not be checked +# -not -name '.*' can also be used instead of -name '[^.]*' +$ find -maxdepth 1 -type f -name '[^.]*' +./report.log +./hi.sh +./errors.log +./hello_world.py +./ip.txt +``` + +`-mindepth` option specifies the minimum depth: + +```bash +# recall that path being searched is considered as depth 0 +# and contents within the search path are at depth 1 +$ find -mindepth 1 -maxdepth 1 -type d +./projects +./todos +./backups + +$ find -mindepth 3 -type f +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +### Age + +Consider the following file properties: + +* `a` accessed +* `c` status changed +* `m` modified + +The above prefixes need to be combined with `time` (based on 24 hour periods) or `min` (based on minutes) options. For example, `-mtime` (24 hour) option checks for last modified timestamp and `-amin` (minute) checks for last accessed timestamp. These options accept a number (integer or fractional) argument, that can be further prefixed by `+` or `-` symbols. Here are some examples: + +```bash +# modified less than 24 hours ago +$ find -maxdepth 1 -type f -mtime 0 +./hello_world.py +./ip.txt + +# accessed between 24 to 48 hours ago +$ find -maxdepth 1 -type f -atime 1 +./ip.txt +# accessed within the last 24 hours +$ find -maxdepth 1 -type f -atime -1 +./hello_world.py +# accessed within the last 48 hours +$ find -maxdepth 1 -type f -atime -2 +./hello_world.py +./ip.txt + +# modified more than 20 days back +$ find -maxdepth 1 -type f -mtime +20 +./.hidden +./report.log +./errors.log +``` + +>![info](./images/info.svg) The `-daystart` qualifier will measure time only from the beginning of the day. For example, `-daystart -mtime 1` will check the files that were modified yesterday. + +### Size + +You can use the `-size` option to filter based on file sizes. By default, the number argument will be considered as 512-byte blocks. You can use the suffix `c` to specify the size in bytes. The suffixes `k` (kilo), `M` (mega) and `G` (giga) are calculated in powers of 1024. + +```bash +# greater than 10 * 1024 bytes +$ find -type f -size +10k +./report.log +./errors.log + +# greater than 9 bytes and less than 50 bytes +$ find -type f -size +9c -size -50c +./hi.sh +./hello_world.py +./ip.txt + +# exactly 10 bytes +$ find -type f -size 10c +./ip.txt +``` + +>![info](./images/info.svg) You can also use the `-empty` option instead of `-size 0`. + +### Acting on matched files + +The `-exec` option helps you to pass the matching files to another command. You can choose to execute the command once for every file (by using `\;`) or just once for all the matching files (by using `+`). However, if the number of files are too many, `find` will use more command invocations as necessary. The `;` character is escaped since it is a shell metacharacter (you can also quote it as an alternative to escaping). + +You need to use `{}` to represent the file(s) passed as argument(s) to the command being executed. Here are some examples: + +```bash +# count the number of characters for each matching file +# wc is called separately for each matching file +$ find -type f -size +9k -exec wc -c {} \; +1234567 ./report.log +54321 ./errors.log + +# here, both matching files are passed together to the wc command +$ find -type f -size +9k -exec wc -c {} + +1234567 ./report.log + 54321 ./errors.log +1288888 total +``` + +As mentioned in the [Managing Files and Directories](#managing-files-and-directories) chapter, the `-t` option for `cp` and `mv` commands will help you specify the target directory before the source files. Here's an example: + +```bash +$ mkdir rc_files +$ find backups/dot_files -type f -exec cp -t rc_files {} + + +$ find rc_files -type f +rc_files/.bashrc +rc_files/.inputrc +rc_files/.vimrc + +$ rm -r rc_files +``` + +>![info](./images/info.svg) You can use the `-delete` option instead of calling the `rm` command to delete the matching files. However, it cannot remove non-empty directories and there are other gotchas to be considered. See the manual for more details. + +### Multiple criteria + +You can specify multiple matching criteria such as `-name`, `-size`, `-mtime`, etc. You can use operators between them and group them within `\(` and `\)` to construct complex expressions. + +* `-a` or `-and` or absence of an operator means both expressions have to be satisfied + * second expression won't be evaluated if the first one is false +* `-o` or `-or` means either of the expressions have to be satisfied + * second expression won't be evaluated if the first one is true +* `-not` inverts the result of the expression + * you can also use `!` but that might need escaping or quoting depending on the shell + +```bash +# names containing both 'x' and 'ip' in any order (case-insensitive) +$ find -iname '*x*' -iname '*ip*' +./todos/TRIP.txt +./ip.txt + +# names containing 'sc' or size greater than 10k +$ find -name '*sc*' -or -size +10k +./report.log +./scripts +./errors.log + +# except filenames containing 'o' or `r` or 'txt' +$ find -type f -not \( -name '*[or]*' -or -name '*txt*' \) +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./.hidden +./hi.sh +``` + +### Prune + +The `-prune` option is helpful when you want to prevent `find` from descending into specific directories. By default, `find` will traverse all the files even if the given conditions will result in throwing away those results from the output. So, using `-prune` not only helps in speeding up the process, it could also help in cases where trying to access a file within the exclusion path would've resulted in an error. + +```bash +# regular files ending with '.log' +$ find -type f -name '*.log' +./report.log +./backups/aug.log +./backups/jan.log +./errors.log + +# exclude the 'backups' directory +# note the use of -path when '/' is needed in the pattern +$ find -type f -not -path './backups/*' -prune -name '*.log' +./report.log +./errors.log +``` + +Using `-not -path '*/.git/*' -prune` can be handy when dealing with Git based version control projects. + +### find and xargs + +Similar to `grep -Z` and `xargs -0` combination seen earlier, you can use `find -print0` and `xargs -0` combination. The `-exec` option is sufficient for most use cases, but `xargs -P` (or the [parallel](https://www.gnu.org/software/parallel/) command) can be handy if you need parallel execution for performance reasons. + +Here's an example of passing filtered files to `sed` (**s**tream **ed**itor, will be discussed in the [Multipurpose Text Processing Tools](#multipurpose-text-processing-tools) chapter): + +```bash +$ find -name '*.log' +./report.log +./backups/aug.log +./backups/jan.log +./errors.log + +# for the filtered files, replace all occurrences of 'apple' with 'fig' +# 'sed -i' will edit the files inplace, so no output on the terminal +$ find -name '*.log' -print0 | xargs -r0 -n2 -P2 sed -i 's/apple/fig/g' +``` + +In the above example, `-P2` is used to allow `xargs` to run two processes at a time (default is one process). You can use `-P0` to allow `xargs` to launch as many processes as possible. The `-n2` option is used to limit the number of file arguments passed to each `sed` call to `2`, otherwise `xargs` is likely to pass as many arguments as possible and thus reduce/negate the effect of parallelism. Note that the values used for `-n` and `-P` in the above illustration are just random examples, you'll have to fine tune them for your particular use case. + +### Further Reading + +* [mywiki.wooledge: using find](https://mywiki.wooledge.org/UsingFind) +* [unix.stackexchange: find and tar example](https://unix.stackexchange.com/q/282762/109046) +* [unix.stackexchange: Why is looping over find's output bad practice?](https://unix.stackexchange.com/q/321697/109046) + +## locate + +`locate` is a faster alternative to the `find` command for searching files by name. It is based on a database, which gets updated by a [cron](https://en.wikipedia.org/wiki/Cron) job. So, newer files may be not present in results unless you update the database. Use this command if it is available in your distro (for example, `sudo apt install mlocate` on Debian-like systems) and you remember some part of filename. Very useful if you have to search the entire filesystem in which case `find` command will take a very long time compared to `locate`. + +Here are some examples: + +* `locate 'power'` print path of filenames containing `power` in the whole filesystem + * implicitly, `locate` would change the string to `*power*` as no globbing characters are present in the string specified +* `locate -b '\power.log'` print path matching the string `power.log` exactly at the end of the path + * `/home/learnbyexample/power.log` matches + * `/home/learnbyexample/lowpower.log'` will not match since there are other characters at the start of the filename + * use of `\` prevents the search string from implicitly being replaced by `*power.log*` +* `locate -b '\proj_adder'` the `-b` option is also handy to print only the matching directory name, otherwise every file under that folder would also be displayed + +>![info](./images/info.svg) See also [unix.stackexchange: pros and cons of find and locate](https://unix.stackexchange.com/q/60205/109046). + +## Exercises + +>![info](./images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. + +>![info](./images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. + +**1)** Display lines containing `an` from the input files `blocks.txt`, `ip.txt` and `uniform.txt`. Show the results with and without filename prefix. + +```bash +# ??? +blocks.txt:banana +ip.txt:light orange +uniform.txt:mango + +# ??? +banana +light orange +mango +``` + +**2)** Display lines containing the whole word `he` from the `sample.txt` input file. + +```bash +# ??? +14) He he he +``` + +**3)** Match only whole lines containing `car` irrespective of case. The matching lines should be displayed with line number prefix as well. + +```bash +$ printf 'car\nscared\ntar car par\nCar\n' | grep # ??? +1:car +4:Car +``` + +**4)** Display all lines from `purchases.txt` except those that contain `tea`. + +```bash +# ??? +coffee +washing powder +coffee +toothpaste +soap +``` + +**5)** Display all lines from `sample.txt` that contain `do` but not `it`. + +```bash +# ??? +13) Much ado about nothing +``` + +**6)** For the input file `sample.txt`, filter lines containing `do` and also display the line that comes after such a matching line. + +```bash +# ??? + 6) Just do-it + 7) Believe it +-- +13) Much ado about nothing +14) He he he +``` + +**7)** For the input file `sample.txt`, filter lines containing `are` or `he` as whole words as well as the line that comes before such a matching line. Go through `info grep` or the [online manual](https://www.gnu.org/software/grep/manual/grep.html) and use appropriate options such that there's no separator between the groups of matching lines in the output. + +```bash +# ??? + 3) Hi there + 4) How are you +13) Much ado about nothing +14) He he he +``` + +**8)** Extract all pairs of `()` with/without text inside them, provided they do not contain `()` characters inside. + +```bash +$ echo 'I got (12) apples' | grep # ??? +(12) + +$ echo '((2 +3)*5)=25 and (4.3/2*()' | grep # ??? +(2 +3) +() +``` + +**9)** For the given input, match all lines that start with `den` or end with `ly`. + +```bash +$ lines='reply\n1 dentist\n2 lonely\neden\nfly away\ndent\n' + +$ printf '%b' "$lines" | grep # ??? +reply +2 lonely +dent +``` + +**10)** Extract words starting with `s` and containing both `e` and `t` in any order. + +```bash +$ words='sequoia subtle exhibit sets tests sit store_2' + +$ echo "$words" | grep # ??? +subtle +sets +store_2 +``` + +**11)** Extract all whole words having the same first and last word character. + +```bash +$ echo 'oreo not a _oh_ pip roar took 22' | grep # ??? +oreo +a +_oh_ +pip +roar +22 +``` + +**12)** Match all input lines containing `*[5]` literally. + +```bash +$ printf '4*5]\n(9-2)*[5]\n[5]*3\nr*[5\n' | grep # ??? +(9-2)*[5] +``` + +**13)** Match whole lines that start with `hand` and immediately followed by `s` or `y` or `le` or no further character. + +```bash +$ lines='handed\nhand\nhandy\nunhand\nhands\nhandle\nhandss\n' + +$ printf '%b' "$lines" | grep # ??? +hand +handy +hands +handle +``` + +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. + +```bash +$ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep # ??? +fig +dog + +$ echo 'dragon,42,unicorn,3.14,shapeshifter\n' | grep # ??? +42,unicorn,3.14 +``` + +**15)** Recursively search for files containing `ello`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +projects/python/hello.py +projects/shell/hello.sh +colors_1 +colors_2 +``` + +**16)** Search for files containing `blue` recursively, but do not search within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +.hidden +colors_1 +colors_2 +``` + +**17)** Search for files containing `blue` recursively, but not if the file also contains `teal`. + +```bash +# change to the 'scripts' directory and source the 'grep.sh' script +$ source grep.sh + +# ??? +.hidden +colors_2 +backups/color list.txt +``` + +**18)** Find all regular files within the `backups` directory. + +```bash +# change to the 'scripts' directory and source the 'find.sh' script +$ source find.sh + +# ??? +backups/dot_files/.bashrc +backups/dot_files/.inputrc +backups/dot_files/.vimrc +backups/aug.log +backups/bookmarks.html +backups/jan.log +``` + +**19)** Find all regular files whose extension starts with `p` or `s` or `v`. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./hi.sh +./backups/dot_files/.vimrc +./hello_world.py +``` + +**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. + +```bash +# ??? +./todos/TRIP.txt +./todos/wow.txt +``` + +**21)** Find all regular files whose path has at least one directory name starting with `p` or `d`. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**22)** Find all directories whose name contains `b` or `d`. + +```bash +# ??? +./todos +./backups +./backups/dot_files +``` + +**23)** Find all hidden directories. + +```bash +# ??? +./projects/.venv +``` + +**24)** Find all regular files at exact depth of `2`. + +```bash +# ??? +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**25)** What's the difference between `find -mtime` and `find -atime`? And, what is the time period these options work with? + +**26)** Find all empty regular files. + +```bash +# ??? +./projects/tictactoe/game.py +./projects/calculator/calc.sh +./todos/books.txt +./todos/TRIP.txt +./todos/wow.txt +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +./backups/aug.log +./backups/bookmarks.html +./backups/jan.log +``` + +**27)** Create a directory named `filtered_files`. Then, copy all regular files that are greater than `1` byte in size but whose name don't end with `.log` to this directory. + +```bash +# ??? +$ ls -A filtered_files +hello_world.py .hidden hi.sh ip.txt +``` + +**28)** Find all hidden files, but not if they are part of the `filtered_files` directory created earlier. + +```bash +# ??? +./.hidden +./backups/dot_files/.bashrc +./backups/dot_files/.inputrc +./backups/dot_files/.vimrc +``` + +**29)** Delete the `filtered_files` directory created earlier. Then, go through the `find` manual and figure out how to list only executable files. + +```bash +# ??? +./hi.sh +./hello_world.py +``` + +**30)** List at least one use case for piping the `find` output to the `xargs` command instead of using the `find -exec` option. + +**31)** How does the `locate` command work faster than the equivalent `find` command? + +# File Properties + +In this chapter, you'll learn how to view file details like line and word counts, file and disk sizes, file types, extract parts of file path, etc. You'll also learn how to change file properties like timestamps and permissions. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts and sample input files used in this chapter. + +## wc + +The `wc` command is typically used to count the number of lines, words and characters for the given input(s). Here are some basic examples: + +```bash +# change to the 'example_files/text_files' directory +$ cat greeting.txt +Hi there +Have a nice day + +# by default, gives newline/word/byte count (in that order) +$ wc greeting.txt + 2 6 25 greeting.txt + +# get only the specified counts +$ wc -l greeting.txt +2 greeting.txt +$ wc -w greeting.txt +6 greeting.txt +$ wc -c greeting.txt +25 greeting.txt +$ wc -wc greeting.txt + 6 25 greeting.txt +``` + +Filename won't be printed for stdin data. This is helpful to save the results in a variable for scripting purposes. + +```bash +$ wc -l = 30 +$ df -h --output=pcent,fstype,target | awk 'NR>1 && $1>=30' + 63% ext3 / + 38% ext4 /media/learnbyexample/projs + 51% ext4 /media/learnbyexample/backups +``` + +## stat + +The `stat` command is useful to get details like file type, size, inode, permissions, last accessed and modified timestamps, etc. You'll get all of these details by default. The `-c` and `--printf` options can be used to display only the required details in a particular format. + +```bash +# change to the 'scripts' directory and source the 'stat.sh' script +$ source stat.sh + +# %x gives last accessed timestamp +$ stat -c '%x' ip.txt +2022-06-01 13:25:18.693823117 +0530 + +# %y gives last modified timestamp +$ stat -c '%y' ip.txt +2022-05-24 14:39:41.285714934 +0530 + +# %s gives file size in bytes +# \n is used to get a newline +# %i gives the inode value +# same as: stat --printf='%s\n%i\n' ip.txt +$ stat -c $'%s\n%i' ip.txt +10 +787224 + +# %N gives quoted filenames +# if input is a link, path it points to is also displayed +$ stat -c '%N' words.txt +'words.txt' -> '/usr/share/dict/words' +``` + +You can also pass multiple file arguments: + +```bash +# %s gives file size in bytes +# %n gives filenames +$ stat -c '%s %n' ip.txt hi.sh +10 ip.txt +21 hi.sh +``` + +>![info](./images/info.svg) ![info](./images/info.svg) The `stat` command should be preferred instead of parsing `ls -l` output for file details. See [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) and [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) for explanation and other alternatives. + +## touch + +As mentioned earlier, the `touch` command helps you change the timestamps of files. You can do so based on current timestamp, passing an argument, copying the value from another file and so on. + +By default, `touch` updates both access and modification timestamps to the current time. You can use `-a` to change only access timestamp and `-m` to change only modification timestamp. + +```bash +# change to the 'scripts' directory and source the 'touch.sh' script +$ source touch.sh + +# last access and modification timestamps +$ stat -c $'%x\n%y' fruits.txt +2017-07-19 17:06:01.523308599 +0530 +2017-07-13 13:54:03.576055933 +0530 + +# update access and modification values to the current time +$ touch fruits.txt +$ stat -c $'%x\n%y' fruits.txt +2022-06-14 13:01:25.921205889 +0530 +2022-06-14 13:01:25.921205889 +0530 +``` + +You can use the `-r` option to copy timestamp information from one file to another. The `-d` and `-t` options will allow you to specify timestamps directly as part of the command. + +```bash +$ stat -c '%y' hi.sh +2022-06-14 13:00:46.170416890 +0530 + +# copy modified timestamp from 'ip.txt' to 'hi.sh' +$ touch -m -r ip.txt hi.sh +$ stat -c '%y' hi.sh +2022-05-24 14:39:41.285714934 +0530 + +# pass timestamp as an argument +$ touch -m -d '2000-01-01 00:00:01' hi.sh +$ stat -c '%y' hi.sh +2000-01-01 00:00:01.000000000 +0530 +``` + +As seen in the [Managing Files and Directories](#managing-files-and-directories) chapter, `touch` creates a new file if the target file doesn't exist yet. You can use the `-c` option to prevent this behavior. + +```bash +$ ls report.txt +ls: cannot access 'report.txt': No such file or directory +$ touch report.txt +$ ls report.txt +report.txt + +$ touch -c xyz.txt +$ ls xyz.txt +ls: cannot access 'xyz.txt': No such file or directory +``` + +## file + +The `file` command helps you identify text encoding (ASCII, UTF-8, etc), whether the file is executable and so on. + +Here are some examples to show how the `file` command behaves for different types: + +```bash +# change to the 'scripts' directory and source the 'file.sh' script +$ source file.sh +$ ls -F +hi.sh* ip.txt moon.png sunrise.jpg + +$ file ip.txt hi.sh +ip.txt: ASCII text +hi.sh: Bourne-Again shell script, ASCII text executable + +$ printf 'αλεπού\n' | file - +/dev/stdin: UTF-8 Unicode text + +$ printf 'hi\r\n' | file - +/dev/stdin: ASCII text, with CRLF line terminators +``` + +Example for image files: + +```bash +# output of 'sunrise.jpg' wrapped for illustration purposes +$ file sunrise.jpg moon.png +sunrise.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density + 96x96, segment length 16, baseline, precision 8, 76x76, components 3 +moon.png: PNG image data, 76 x 76, 8-bit colormap, non-interlaced +``` + +You can use the `-b` option to avoid filenames in the output: + +```bash +$ file -b ip.txt +ASCII text +``` + +Here is an example of finding particular type of files, say `image` files. + +```bash +# assuming filenames do not contain ':' or newline characters +# awk here helps to print the first field of lines containing 'image data' +$ find -type f -exec file {} + | awk -F: '/\/{print $1}' +./sunset.jpg +./moon.png +``` + +>![info](./images/info.svg) See also `identify` command which "describes the format and characteristics of one or more image files". + +## basename + +By default, the `basename` command will remove the leading directory component from the given path argument. Any trailing slashes will be removed before determining the portion to be extracted. + +```bash +$ basename /home/learnbyexample/example_files/scores.csv +scores.csv + +# quote the arguments as needed +$ basename 'path with spaces/report.log' +report.log +``` + +You can use the `-s` option to remove a suffix from the filename. Usually used to remove the file extension. + +```bash +$ basename -s'.csv' /home/learnbyexample/example_files/scores.csv +scores + +# suffix will be removed only once +$ basename -s'.txt' purchases.txt.txt +purchases.txt +``` + +The `basename` command requires `-a` or `-s` (which implies `-a`) to work with multiple arguments. + +```bash +$ basename -a /backups/jan_2021.tar.gz /home/learnbyexample/report.log +jan_2021.tar.gz +report.log + +# -a is implied when -s is used +$ basename -s'.txt' logs/purchases.txt logs/report.txt +purchases +report +``` + +## dirname + +By default, the `dirname` command removes the trailing path component (after removing any trailing slashes). + +```bash +$ dirname /home/learnbyexample/example_files/scores.csv +/home/learnbyexample/example_files + +# one or more trailing slashes will not affect the output +$ dirname /home/learnbyexample/example_files/ +/home/learnbyexample + +# unlike basename, multiple arguments are accepted by default +$ dirname /home/learnbyexample/example_files/scores.csv ../report/backups/ +/home/learnbyexample/example_files +../report +``` + +You can use shell features like command substitution to combine the effects of `basename` and `dirname` commands. + +```bash +# extract the second last path component +$ basename $(dirname /home/learnbyexample/example_files/scores.csv) +example_files +``` + +## chmod + +You can use the `chmod` command to change file and directory permissions. Consider this example: + +```bash +$ mkdir practice_chmod +$ cd practice_chmod +$ echo 'learnbyexample' > ip.txt + +# this info can also be seen in the first column of 'ls -l' output +$ stat -c '%A' ip.txt +-rw-rw-r-- +``` + +In the above output, the 10 characters displayed in the last line are related to file type and permissions. First character indicates the **file type**. The most common ones are shown below: + +* `-` regular file +* `d` directory +* `l` symbolic link + +The other nine characters represent three sets of **file permissions** for *user* (`u`), *group* (`g`) and *others* (`o`), in that order. + +* *user* — file owner +* *group* — users having file access as part of a group +* *others* — everyone else + +Only `rwx` file properties will be discussed in this section. For other types of properties, refer to the [coreutils manual: File permissions](https://www.gnu.org/software/coreutils/manual/coreutils.html#File-permissions). + +**Permission reference table for files:** + +| Character | Meaning | Value | +| --------- | ------------- | ----- | +| `r` | read | `4` | +| `w` | write | `2` | +| `x` | execute | `1` | +| `-` | no permission | `0` | + +Here's an example showing both `rwx` and numerical representations of a file's permissions: + +```bash +$ stat -c '%A' ip.txt +-rw-rw-r-- + +# r(4) + w(2) + 0 = 6 +# r(4) + 0 + 0 = 4 +$ stat -c '%a' ip.txt +664 +``` + +>![info](./images/info.svg) Note that the permissions are not straightforward to understand for directories. If a directory only has the `x` permission, you can `cd` into it but you cannot read the contents (using `ls` for example). If a directory only has the `r` permission, you cannot `cd` into it, but you'll be able to read the contents (along with "cannot access" error). For this reason, `rx` permissions are almost always enabled/disabled together. The `w` permission allows you to add or remove contents, provided `x` is active. + +**Changing permissions for all three categories** + +You can provide numbers for `ugo` (in that order) to change permissions. This is best understood with examples: + +```bash +$ printf '#!/bin/bash\n\necho hi\n' > hi.sh +$ stat -c '%a %A' hi.sh +664 -rw-rw-r-- + +# r(4) + w(2) + x(1) = 7 +# r(4) + 0 + x(1) = 5 +$ chmod 755 hi.sh +$ stat -c '%a %A' hi.sh +755 -rwxr-xr-x +``` + +Here's an example for a directory: + +```bash +$ mkdir dot_files +$ stat -c '%a %A' dot_files +775 drwxrwxr-x + +$ chmod 700 dot_files +$ stat -c '%a %A' dot_files +700 drwx------ +``` + +You can also use `mkdir -m` instead of the `mkdir+chmod` combination seen above. The argument to the `-m` option uses the same syntax as `chmod` (including the format that'll be discussed next). + +```bash +$ mkdir -m 750 backups +$ stat -c '%a %A' backups +750 drwxr-x--- +``` + +>![info](./images/info.svg) You can use `chmod -R` to recursively change permissions. Use `find+exec` if you want to apply changes only for files filtered by some criteria. + +**Changing permissions for specific categories** + +You can assign (`=`), add (`+`) or remove (`-`) permissions by using those symbols followed by one or more `rwx` permissions. This depends on the `umask` value: + +```bash +$ umask +0002 +``` + +`umask` value of `0002` means: + +* read and execute permissions without `ugo` prefix affects all the three categories +* write permissions without `ugo` prefix affects only `user` and `group` categories + +Here are some examples without `ugo` prefixes: + +```bash +# remove execute permission for all three categories +$ chmod -x hi.sh + +# add write permission only for 'user' and 'group' +$ chmod +w ip.txt + +$ touch sample.txt +$ chmod 702 sample.txt +# give only read permission for all three categories +# write/execute permissions, if any, will be removed +$ chmod =r sample.txt +$ stat -c '%a %A' sample.txt +444 -r--r--r-- + +# give read and write permissions for 'user' and 'group' +# and read permission for 'others' +# execute permissions, if any, will be removed +$ chmod =rw hi.sh +``` + +Here are some examples with `ugo` prefixes. You can use `a` to refer to all the three categories. For example, `a+w` is same as `ugo+w`. + +```bash +# remove read and write permissions only for 'others' +$ chmod o-rw sample.txt + +# add execute permission for 'group' and 'others' +$ chmod go+x hi.sh + +# give read and write permissions for all three categories +# execute permissions, if any, will be removed +$ chmod a=rw hi.sh +``` + +You can use `,` to separate multiple permissions: + +```bash +# remove execute permission for 'group' and 'others' +# remove write permission for 'others' +$ chmod go-x,o-w hi.sh +``` + +**Further Reading** + +* [Linux Permissions Primer](https://danielmiessler.com/study/unixlinux_permissions/) +* [unix.stackexchange: why chmod +w filename not giving write permission to other](https://unix.stackexchange.com/q/429421/109046) + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. + +>![info](./images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. + +**1)** Save the number of lines in the `greeting.txt` input file to the `lines` shell variable. + +```bash +# ??? +$ echo "$lines" +2 +``` + +**2)** What do you think will be the output of the following command? + +```bash +$ echo 'dragons:2 ; unicorns:10' | wc -w +``` + +**3)** Use appropriate options and arguments to get the output shown below. + +```bash +$ printf 'apple\nbanana\ncherry' | wc # ??? + 15 183 sample.txt + 2 19 - + 17 202 total +``` + +**4)** Go through the `wc` manual and use appropriate options and arguments to get the output shown below. + +```bash +$ printf 'greeting.txt\0scores.csv' | wc # ??? +2 6 25 greeting.txt +4 4 70 scores.csv +6 10 95 total +``` + +**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? + +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +# ??? find+du +16K ./projects/errors.log +7.4M ./report.log + +# ??? ls and shell features + 16K projects/errors.log +7.4M report.log +``` + +**7)** Report sizes of files/directories in the current path in powers of `1000` without descending into sub-directories. Also, show a total at the end. + +```bash +# change to the 'scripts' directory and source the 'du.sh' script +$ source du.sh + +# ??? +50k projects +7.7M report.log +8.2k todos +7.8M total +``` + +**8)** What does the `du --apparent-size` option do? + +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? + +**10)** Display the size of `scores.csv` and `timings.txt` files in the format shown below. + +```bash +$ stat # ??? +scores.csv: 70 +timings.txt: 49 +``` + +**11)** Which `touch` option will help you prevent file creation if it doesn't exist yet? + +**12)** Assume `new_file.txt` doesn't exist in the current working directory. What would be the output of the `stat` command shown below? + +```bash +$ touch -t '202010052010.05' new_file.txt +$ stat -c '%y' new_file.txt +# ??? +``` + +**13)** Is the following `touch` command valid? If so, what would be the output of the `stat` command that follows? + +```bash +# change to the 'scripts' directory and source the 'touch.sh' script +$ source touch.sh + +$ stat -c '%n: %y' fruits.txt +fruits.txt: 2017-07-13 13:54:03.576055933 +0530 + +$ touch -r fruits.txt f{1..3}.txt +$ stat -c '%n: %y' f*.txt +# ??? +``` + +**14)** Use appropriate option(s) to get the output shown below. + +```bash +$ printf 'αλεπού\n' | file - +/dev/stdin: UTF-8 Unicode text + +$ printf 'αλεπού\n' | file # ??? +UTF-8 Unicode text +``` + +**15)** Is the following command valid? If so, what would be the output? + +```bash +$ basename -s.txt ~///test.txt/// +# ??? +``` + +**16)** Given the file path in the shell variable `p`, how'd you obtain the output shown below? + +```bash +$ p='~/projects/square_tictactoe/python/game.py' +$ dirname # ??? +~/projects/square_tictactoe +``` + +**17)** Explain what each of the characters mean in the following `stat` command's output. + +```bash +$ stat -c '%A' ../scripts/ +drwxrwxr-x +``` + +**18)** What would be the output of the second `stat` command shown below? + +```bash +$ touch new_file.txt +$ stat -c '%a %A' new_file.txt +664 -rw-rw-r-- + +$ chmod 546 new_file.txt +$ stat -c '%a %A' new_file.txt +# ??? +``` + +**19)** How would you specify directory permissions using the `mkdir` command? + +```bash +# instead of this +$ mkdir back_up +$ chmod 750 back_up +$ stat -c '%a %A' back_up +750 drwxr-x--- +$ rm -r back_up + +# do this +$ mkdir # ??? +$ stat -c '%a %A' back_up +750 drwxr-x--- +``` + +**20)** Change the file permission of `book_list.txt` to match the output of the second `stat` command shown below. Don't use the number `220`, specify the changes in terms of `rwx` characters. + +```bash +$ touch book_list.txt +$ stat -c '%a %A' book_list.txt +664 -rw-rw-r-- + +# ??? +$ stat -c '%a %A' book_list.txt +220 --w--w---- +``` + +**21)** Change the permissions of `test_dir` to match the output of the second `stat` command shown below. Don't use the number `757`, specify the changes in terms of `rwx` characters. + +```bash +$ mkdir test_dir +$ stat -c '%a %A' test_dir +775 drwxrwxr-x + +# ??? +$ stat -c '%a %A' test_dir +757 drwxr-xrwx +``` + +# Managing Processes + +This chapter gives a basic overview of process management for interactive usage only. Handling processes for other use cases, such as system administration, requires a more robust solution (see [mywiki.wooledge: Process Management](https://mywiki.wooledge.org/ProcessManagement) to get started for such use cases). + +## Definitions + +Here are some definitions that will be handy to know for this chapter's contents: + +* **Program** is a set of instructions written to perform a task +* **Process** is any running program +* **Daemon** are background processes +* **Job** is a process that is not a daemon + * i.e. jobs are interactive programs under user control + +## Running jobs in background + +Some commands and scripts can take more than few minutes to complete, and you might still need to continue using the shell. If you are not dependent on the current shell environment, you could just open another shell instance and continue working. + +Another option is to push the job to the background, either at the time of command invocation itself or after the fact. Make sure to redirect standard output and error to avoid interfering with your continued interactive usage. Appending an `&` character to the command will execute it in the background. + +```bash +$ tkdiff ip.txt ip.txt.bkp & +[1] 12726 +``` + +In the above example, `[1]` refers to the job number and `12726` is the PID (process ID). You can use the `jobs` and `ps` commands to track active jobs: + +```bash +$ jobs +[1]+ Running tkdiff ip.txt ip.txt.bkp & + +$ ps + PID TTY TIME CMD + 9657 pts/1 00:00:00 bash + 12726 pts/1 00:00:00 wish + 12730 pts/1 00:00:00 ps +``` + +But what if you forgot to append `&` to the command? You can follow these steps: + +* `Ctrl+z` — suspend the current running job +* `bg` — push the recently suspended job to the background +* continue using shell +* `fg` — bring the recently pushed background job to the foreground + * you can use `fg %n` to bring the `n`th job number to the foreground + +Here's a demo that you can try: + +```bash +# sleep for 30 seconds (used here for illustration purposes) +# press Ctrl+z to suspend this job +# you'll get the job number, status and the command in the output +$ sleep 30 +^Z +[1]+ Stopped sleep 30 + +# bg puts the job considered as the current by the shell to the background +$ bg +[1]+ sleep 30 & + +# use 'jobs' or 'ps' to check list of jobs +# '+' after the job number is used to indicate the current job +$ jobs +[1]+ Running sleep 30 & +$ ps + PID TTY TIME CMD + 2380 pts/0 00:00:00 bash + 6160 pts/0 00:00:00 sleep + 6162 pts/0 00:00:00 ps + +# fg brings the most recently pushed background job to the foreground +$ fg +sleep 30 +$ +``` + +>![info](images/info.svg) `jobs`, `bg` and `fg` are shell builtins. See [bash manual: Job Control](https://www.gnu.org/software/bash/manual/bash.html#Job-Control) for more details. See also [this tutorial on job control](https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes). + +>![info](images/info.svg) See also [I want to run something in the background and then log out](https://mywiki.wooledge.org/ProcessManagement#I_want_to_run_something_in_the_background_and_then_log_out.) — `screen`, `tmux`, `nohup`, `disown`, etc. + +## ps + +The `ps` command gives a snapshot of the current processes. A few examples were already seen earlier in this chapter. Here's an example with the `-f` option (full-format listing): + +```bash +$ ps -f +UID PID PPID C STIME TTY TIME CMD +learnby+ 12299 12298 0 16:39 pts/0 00:00:00 bash +learnby+ 12311 12299 0 16:39 pts/0 00:00:00 ps -f +``` + +The fields in the above example are effective user ID (UID), process ID (PID), parent process ID (PPID), processor utilization (C), starting time (STIME), controlling terminal (TTY), cumulative CPU time (TIME) and command with all its arguments (CMD). You can use the `-o` option to customize the fields you want. The `--sort` option will help you to sort based on specific fields. See [ps manual: Standard Format Specifiers](https://www.mankier.com/1/ps#Standard_Format_Specifiers) for complete list of formats available. + +The `-e` (or `-A`) option selects all processes. This option is typically used in combination with `grep` for filtering: + +```bash +$ ps -e | grep 'vim' + 6195 ? 00:03:13 gvim +``` + +>![info](./images/info.svg) See also [linuxjourney: ps tutorial](https://linuxjourney.com/lesson/monitor-processes-ps-command). + +## pgrep + +The `pgrep` command helps you filter processes based on their name and attributes. By default, it matches against the process name, for example: + +```bash +$ ps -e | grep 'vim' + 2006 ? 00:00:27 gvim + 3992 pts/2 00:00:00 vim + +$ pgrep 'vim' +2006 +3992 +``` + +You can use the `-l` option to display the process name as well (PID is shown by default). + +```bash +$ pgrep -l 'vim' +2006 gvim +3992 vim +``` + +To match the process name exactly (instead of matching anywhere), use the `-x` option. + +```bash +$ pgrep -x 'vim' +3992 +``` + +The `-a` option will list the full command line (the `-l` option seen earlier gives only the name, not the arguments). + +```bash +$ pgrep -a 'vim' +2006 gvim -p notes.txt src/managing-processes.md +3992 vim substitution.md +``` + +>![info](./images/info.svg) There are several more options like filtering based on effective UID, PPID, etc. See [pgrep manual](https://www.mankier.com/1/pgrep) for more details. + +## kill + +Sometimes, a process might not be responding to your interaction, might be taking too long, accidentally uses too much memory, and so on. You can use the `kill` command to manage such processes. + +As mentioned at the beginning of this chapter, these examples are suggested for interactive processes initiated by you (other usage, for example in scripts, will require different strategy). Be 100% sure before you attempt to send signals to manage processes. + +You can pass signals by name or by their associated number. Use `kill -l` to get a full list of signals. See also [unix.stackexchange: List of Signals](https://unix.stackexchange.com/q/317492/109046) and [unix.stackexchange: What causes various signals to be sent?](https://unix.stackexchange.com/q/6332/109046) + +```bash +# first 20 signals (out of 64) listed below +$ kill -l + 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP + 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 +11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM +16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP +... +``` + +You can use PID or job number to specify the process to which the signal has to be sent. By default, `SIGTERM` (`15`) is sent, which is a polite way to ask the program to terminate. Here's an example: + +```bash +# 'sleep' is used here to emulate a long running process +# press Ctrl+z to suspend this command +$ sleep 100 +^Z +[1]+ Stopped sleep 100 + +# terminate job number 1 +# by default, SIGTERM is sent +$ kill %1 +# just press Enter +$ +[1]+ Terminated sleep 100 +``` + +Note that in the above example, pressing `Ctrl+z` actually sends the `SIGTSTP` (`20`) signal. Programs usually handle such signals to find a safer spot to suspend. Pressing `Ctrl+c` sends the `SIGINT` (`2`) signal, usually used to abort a process (depends on how the program handles it). You can use `Ctrl+\` to send `SIGQUIT` (`3`), typically used to ask the program to quit and give a [core dump](https://en.wikipedia.org/wiki/Core_dump). See also [stackoverflow: gracefully shutdown processes](https://stackoverflow.com/q/690415/4082052). + +Here's an illustration to show how to pass signals by their names and numerical values: + +```bash +$ sleep 100 & +[1] 10051 + +# suspend the above job, similar to using Ctrl+z +# -20 refers to the signal number 20, i.e. SIGTSTP +# 10051 is the PID +$ kill -20 10051 + +[1]+ Stopped sleep 100 + +# resume the job in background +$ bg +[1]+ sleep 100 & + +# -s option allows you to specify signal by its name +# '-s SIGTERM' is optional here, since that is the default +$ kill -s SIGTERM 10051 +$ +[1]+ Terminated sleep 100 +``` + +>![info](./images/info.svg) ![warning](./images/warning.svg) If you need to terminate a process at all costs, you can use `SIGKILL` (`9`). This is a signal that cannot be blocked by programs. Use `Ctrl+z` to suspend a runaway job and then apply `kill -9` instead of trying to abort such jobs using `Ctrl+c`. See also [unix.stackexchange: why kill -9 should be avoided](https://unix.stackexchange.com/q/8916/109046). + +>![info](./images/info.svg) Note that your system will likely have several different implementations of the `kill` command. The shell builtin version was discussed in this section. + +## top + +The `top` command displays processes in a tabular format along with information like PID, process name, memory usage and so on. Here's a sample screenshot: + +![sample screenshot for the top command](images/top_example.png) + +This command opens an interactive session, and automatically updates the information being displayed as well. You can press `M` (uppercase) to sort the processes by memory usage. Press `e` repeatedly to display memory sizes in terms of mega/giga/etc. Press `h` for help and press `q` to quit the session. + +>![info](./images/info.svg) Press `W` (uppercase) to write the current settings to the `toprc` configuration file and quit. The next time you use the `top` command, it will be displayed in the format that was saved. + +>![info](./images/info.svg) See also alternative implementations like [htop](https://github.com/htop-dev/htop/) and [btop](https://github.com/aristocratos/btop). + +## free + +The `free` command displays information about your system memory. Here's an example: + +```bash +# -h option shows the results in human readable format +$ free -h + total used free shared buff/cache available +Mem: 7.6Gi 2.4Gi 2.3Gi 267Mi 2.9Gi 4.7Gi +Swap: 3.6Gi 0B 3.6Gi +``` + +## Further Reading + +* [mywiki.wooledge: Process Management](https://mywiki.wooledge.org/ProcessManagement) +* [ryanstutorials: Process Management](https://ryanstutorials.net/linuxtutorial/processes.php) +* [digitalocean: Managing Linux Processes](https://www.digitalocean.com/community/tutorials/how-to-use-ps-kill-and-nice-to-manage-processes-in-linux) +* [Linux ate my ram](https://www.linuxatemyram.com/) — Linux is borrowing unused memory for disk caching. This makes it look like you are low on memory, but you are not! Everything is fine! + +## Exercises + +**1)** How would you invoke a command to be executed in the background? And what would you do to push a job to the background after it has already been launched? What commands can you use to track active jobs? + +**2)** What do `+` and `-` symbols next to job numbers indicate? + +**3)** When would you use `fg %n` and `bg %n` instead of just `fg` and `bg` respectively? + +**4)** Which option will help you customize the output fields needed for the `ps` command? + +**5)** What's the difference between `pgrep -a` and `pgrep -l` options? + +**6)** If the job number is `2`, would you use `kill %2` or `kill 2` to send `SIGTERM` to that process? + +**7)** Which signal does the `Ctrl+c` shortcut send to the currently running process? + +**8)** Which command helps you to continuously monitor processes, along with details like PID, memory usage, etc? + +**9)** Which key will help you manipulate kill tasks from within the `top` session? + +**10)** What does the `free` command do? + +# Multipurpose Text Processing Tools + +Many CLI text processing tools have been in existence for about half a century. And newer tools are being written to solve ever expanding text processing problems. Just knowing that a particular tool exists or searching for a tool before attempting to write your own solution can be a time saver. Also, popular tools are likely to be optimized for speed, hardened against bugs from wide usage, discussed on forums, and so on. + +`grep` was already covered in the [Searching Files and Filenames](#searching-files-and-filenames) chapter. In addition, `sed`, `awk` and `perl` are essential tools to solve a wide variety of text processing problems from the command line. In this chapter, you'll learn field processing, use regular expressions for search and replace requirements, perform operations based on multiple lines and files, etc. + +>![info](./images/info.svg) The examples presented in this chapter only cover some of the functionalities. I've written separate books to cover these tools with more detailed explanations, examples and exercises. See [https://learnbyexample.github.io/books/](https://learnbyexample.github.io/books/) for links to these books. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. + +## sed + +The command name `sed` is derived from **s**tream **ed**itor. Here, stream refers to data being passed via shell pipes. Thus, the command's primary functionality is to act as a text editor for **stdin** data with **stdout** as the output target. You can also edit file input and save the changes back to the same file if needed. + +### Substitution + +`sed` has various commands to manipulate text input. The **substitute** command is most commonly used, whose syntax is `s/REGEXP/REPLACEMENT/FLAGS`. Here are some basic examples: + +```bash +# for each input line, change only the first ',' to '-' +$ printf '1,2,3,4\na,b,c,d\n' | sed 's/,/-/' +1-2,3,4 +a-b,c,d + +# change all matches by adding the 'g' flag +$ printf '1,2,3,4\na,b,c,d\n' | sed 's/,/-/g' +1-2-3-4 +a-b-c-d +``` + +Here's an example with file input: + +```bash +$ cat greeting.txt +Hi there +Have a nice day + +# change 'day' to 'weekend' +$ sed 's/day/weekend/g' greeting.txt +Hi there +Have a nice weekend +``` + +What if you want to issue multiple substitute commands (or use several other `sed` commands)? It will depend on the command being used. Here's an example where you can use the `-e` option or separate the commands with a `;` character. + +```bash +# change all occurrences of 'day' to 'weekend' +# add '.' to the end of each line +$ sed 's/day/weekend/g; s/$/./' greeting.txt +Hi there. +Have a nice weekend. + +# same thing with -e option +$ sed -e 's/day/weekend/g' -e 's/$/./' greeting.txt +Hi there. +Have a nice weekend. +``` + +### Inplace editing + +You can use the `-i` option for inplace editing. Pass an argument to this option to save the original input as a backup. + +```bash +$ cat ip.txt +deep blue +light orange +blue delight + +# output from sed is written back to 'ip.txt' +# original file is preserved in 'ip.txt.bkp' +$ sed -i.bkp 's/blue/green/g' ip.txt +$ cat ip.txt +deep green +light orange +green delight +``` + +### Filtering features + +`sed` also has features to filter the lines like `grep`. And you can apply other `sed` commands for these filtered lines as needed. + +```bash +# -n disables automatic printing +# 'p' command prints the contents of pattern space +# same as: grep 'at' +$ printf 'sea\neat\ndrop\n' | sed -n '/at/p' +eat + +# 'd' command deletes the matching lines +# same as: grep -v 'at' +$ printf 'sea\neat\ndrop\n' | sed '/at/d' +sea +drop + +# change commas to hyphens only if the input line contains '2' +$ printf '1,2,3,4\na,b,c,d\n' | sed '/2/ s/,/-/g' +1-2-3-4 +a,b,c,d + +# change commas to hyphens if the input line does NOT contain '2' +$ printf '1,2,3,4\na,b,c,d\n' | sed '/2/! s/,/-/g' +1,2,3,4 +a-b-c-d +``` + +You can use `q` and `Q` commands to quit `sed` once a matching line is found: + +```bash +# quit after a line containing 'st' is found +$ printf 'apple\nsea\neast\ndust' | sed '/st/q' +apple +sea +east + +# matching line won't be printed in this case +$ printf 'apple\nsea\neast\ndust' | sed '/st/Q' +apple +sea +``` + +Apart from regexp, filtering can also be done based on line numbers, address ranges, etc. + +```bash +# perform substitution only for the second line +# use '$' instead of a number to indicate last input line +$ printf 'gates\nnot\nused\n' | sed '2 s/t/*/g' +gates +no* +used + +# address range example, same as: sed -n '3,8!p' +# you can also use regexp to construct address ranges +$ seq 15 24 | sed '3,8d' +15 +16 +23 +24 +``` + +If you need to issue multiple commands for filtered lines, you can group those commands within `{}` characters. Here's an example: + +```bash +# for lines containing 'e', replace 's' with '*' and 't' with '=' +# note that the second line isn't changed as there's no 'e' +$ printf 'gates\nnot\nused\n' | sed '/e/{s/s/*/g; s/t/=/g}' +ga=e* +not +u*ed +``` + +### Regexp substitution + +Here are some regexp based substitution examples. The `-E` option enables **ERE** (default is **BRE**). Most of the syntax discussed in the [Regular Expressions](#regular-expressions) section for the `grep` command applies for `sed` as well. + +```bash +# replace all sequences of non-digit characters with '-' +$ echo 'Sample123string42with777numbers' | sed -E 's/[^0-9]+/-/g' +-123-42-777- + +# replace numbers >= 100 which can have optional leading zeros +$ echo '0501 035 154 12 26 98234' | sed -E 's/\b0*[1-9][0-9]{2,}\b/X/g' +X 035 X 12 26 X + +# reduce \\ to single \ and delete if it is a single \ +$ echo '\[\] and \\w and \[a-zA-Z0-9\_\]' | sed -E 's/(\\?)\\/\1/g' +[] and \w and [a-zA-Z0-9_] + +# remove two or more duplicate words that are separated by a space +# \b prevents false matches like 'the theatre', 'sand and stone' etc +$ echo 'aa a a a 42 f_1 f_1 f_13.14' | sed -E 's/\b(\w+)( \1)+\b/\1/g' +aa a 42 f_1 f_13.14 + +# & backreferences the matched portion +# \u changes the next character to uppercase +$ echo 'hello there. how are you?' | sed 's/\b\w/\u&/g' +Hello There. How Are You? + +# replace only the third matching occurrence +$ echo 'apple:123:banana:fig' | sed 's/:/-/3' +apple:123:banana-fig +# change all ':' to ',' only from the second occurrence +$ echo 'apple:123:banana:fig' | sed 's/:/,/2g' +apple:123,banana,fig +``` + +The `/` character is idiomatically used as the regexp delimiter. But any character other than `\` and the newline character can be used instead. This helps to avoid or reduce the need for escaping delimiter characters. + +```bash +$ echo '/home/learnbyexample/reports' | sed 's#/home/learnbyexample/#~/#' +~/reports + +$ echo 'home path is:' | sed 's,$, '"$HOME"',' +home path is: /home/learnbyexample +``` + +### Further Reading + +* My ebook [GNU SED](https://github.com/learnbyexample/learn_gnused) + * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) +* [unix.stackexchange: common search and replace examples with sed and other tools](https://unix.stackexchange.com/q/112023/109046) + +## awk + +`awk` is a programming language and primarily used for field based processing. `awk` also provides filtering capabilities like those supported by `grep` and `sed` along with some more nifty features. And similar to many command line utilities, `awk` can accept input from both `stdin` and files. + +### Regexp filtering + +To make it easier to use programming features from the command line, there are several shortcuts, for example: + +* `awk '/regexp/'` is a shortcut for `awk '$0 ~ /regexp/{print $0}'` +* `awk '!/regexp/'` is a shortcut for `awk '$0 !~ /regexp/{print $0}'` + +```bash +# same as: grep 'at' and sed -n '/at/p' +$ printf 'gate\napple\nwhat\nkite\n' | awk '/at/' +gate +what + +# same as: grep -v 'e' and sed -n '/e/!p' +$ printf 'gate\napple\nwhat\nkite\n' | awk '!/e/' +what +``` + +### Awk special variables + +Brief description for some of the special variables are given below: + +* `$0` contains input record content +* `$1` first field +* `$2` second field and so on +* `FS` input field separator +* `OFS` output field separator +* `NF` number of fields +* `RS` input record separator +* `ORS` output record separator +* `NR` number of records (i.e. line number) + +### Default field processing + +`awk` automatically splits input into fields based on one or more sequence of **space** or **tab** or **newline** characters. In addition, any of these three characters at the start or end of input gets trimmed and won't be part of field contents. The fields are accessible using `$N` where `N` is the field number you need. You can also pass an expression instead of numeric literal to specify the field required. + +Here are some examples: + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# print the second field of each input line +$ awk '{print $2}' table.txt +bread +cake +banana + +# print lines only if the last field is a negative number +$ awk '$NF<0' table.txt +blue cake mug shirt -7 + +# change 'b' to 'B' only for the first field +# gsub() is like the sed substitution command with 'g' flag +# use sub() when 'g' flag is not needed +$ awk '{gsub(/b/, "B", $1)} 1' table.txt +Brown bread mat hair 42 +Blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +### Condition and Action + +The examples so far have used a few different ways to construct a typical `awk` one-liner. If you haven't yet grasped the syntax, this generic structure might help: + +```bash +awk 'cond1{action1} cond2{action2} ... condN{actionN}' +``` + +If a condition isn't provided, the action is always executed. Within a block, you can provide multiple statements separated by a semicolon character. If action isn't provided, then by default, contents of `$0` variable is printed if the condition evaluates to *true*. When action isn't present, you can use semicolon to terminate the condition and start another `condX{actionX}` snippet. + +You can use a `BEGIN{}` block when you need to execute something before the input is read and a `END{}` block to execute something after all of the input has been processed. + +```bash +$ seq 2 | awk 'BEGIN{print "---"} 1; END{print "%%%"}' +--- +1 +2 +%%% +``` + +### Regexp field processing + +As seen earlier, `awk` automatically splits input into fields (based on space/tab/newline characters) which are accessible using `$N` where `N` is the field number you need. You can use the `-F` option or `FS` variable to set a regexp based field separator. Use `OFS` variable to set the output field separator. + +```bash +$ echo 'goal:amazing:whistle:kwality' | awk -F: '{print $1}' +goal +$ echo 'Sample123string42with777numbers' | awk -F'[a-zA-Z]+' '{print $2}' +123 + +$ s='Sample123string42with777numbers' +# -v option helps you set a value for the given variable +$ echo "$s" | awk -F'[0-9]+' -v OFS=, '{print $1, $(NF-1)}' +Sample,with +``` + +You can use `FPAT` to define what characters should make up the fields. `FS` splits the input record whereas `FPAT` matches the fields. The below example finds fields that are enclosed within double quotes or made up of non-comma characters. + +```bash +$ s='eagle,"fox,42",bee,frog' +$ echo "$s" | awk -v FPAT='"[^"]*"|[^,]*' '{print $2}' +"fox,42" +``` + +### Record separators + +By default, newline is used as input and output record separators. You can change them using the `RS` and `ORS` variables. + +```bash +# print records containing 'i' as well as 't' +$ printf 'Sample123string42with777numbers' | awk -v RS='[0-9]+' '/i/ && /t/' +string +with + +# empty RS is paragraph mode, uses two or more newlines as separator +$ printf 'apple\nbanana\nfig\n\n\n123\n456' | awk -v RS= 'NR==1' +apple +banana +fig + +# change ORS depending on some condition +$ seq 9 | awk '{ORS = NR%3 ? "-" : "\n"} 1' +1-2-3 +4-5-6 +7-8-9 +``` + +### State machines + +The `condX{actionX}` shortcut makes it easy to code state machines concisely, which is useful to solve problems that depend on contents of multiple records. + +Here's an example of printing the matching line as well as `c` number of lines that follow: + +```bash +# same as: grep --no-group-separator -A1 'blue' +# print matching line as well as the one that follows it +$ printf 'red\nblue\ngreen\nteal\n' | awk -v c=1 '/blue/{n=c+1} n && n--' +blue +green + +# print matching line as well as two lines that follow +$ printf 'red\nblue\ngreen\nteal\n' | awk -v c=2 '/blue/{n=c+1} n && n--' +blue +green +teal +``` + +Consider the following input file that has records bounded by distinct markers (lines containing `start` and `end`): + +```bash +$ cat uniform.txt +mango +icecream +--start 1-- +1234 +6789 +**end 1** +how are you +have a nice day +--start 2-- +a +b +c +**end 2** +par,far,mar,tar +``` + +Here are some examples of processing such bounded records: + +```bash +# same as: sed -n '/start/,/end/p' uniform.txt +$ awk '/start/{f=1} f; /end/{f=0}' uniform.txt +--start 1-- +1234 +6789 +**end 1** +--start 2-- +a +b +c +**end 2** + +# you can re-arrange and invert the conditions to create other combinations +# for example, exclude ending match +$ awk '/start/{f=1} /end/{f=0} f' uniform.txt +--start 1-- +1234 +6789 +--start 2-- +a +b +c +``` + +Here's an example of printing two consecutive records only if the first record contains `ar` and the second one contains `nice`: + +```bash +$ awk 'p ~ /ar/ && /nice/{print p ORS $0} {p=$0}' uniform.txt +how are you +have a nice day +``` + +### Two files processing + +The *key* features used in the solution below: + +* For two files as input, `NR==FNR` will be *true* only when the first file is being processed + * `FNR` is record number like `NR` but resets for each input file +* `next` will skip the rest of the code and fetch the next record +* `a[$0]` by itself is a valid statement. It will create an uninitialized element in array `a` with `$0` as the key (if the key doesn't exist yet) +* `$0 in a` checks if the given string (`$0` here) exists as a key in the array `a` + +```bash +# common lines, same as: grep -Fxf c1.txt c2.txt +$ awk 'NR==FNR{a[$0]; next} $0 in a' c1.txt c2.txt +Blue +Orange +Red +White + +# lines present in c2.txt but not in c1.txt +$ awk 'NR==FNR{a[$0]; next} !($0 in a)' c1.txt c2.txt +Black +Green +Pink +``` + +>![warning](images/warning.svg) Note that the `NR==FNR` logic will fail if the first file is empty. See [this unix.stackexchange thread](https://unix.stackexchange.com/a/237110/109046) for workarounds. + +### Removing duplicates + +`awk '!a[$0]++'` is one of the most famous `awk` one-liners. It eliminates line based duplicates while retaining input order. The following example shows this feature in action along with an illustration of how the logic works. + +```bash +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea + +$ awk '{print +a[$0] "\t" $0; a[$0]++}' purchases.txt +0 coffee +0 tea +0 washing powder +1 coffee +0 toothpaste +1 tea +0 soap +2 tea + +# only those entries with zero in first column will be retained +$ awk '!a[$0]++' purchases.txt +coffee +tea +washing powder +toothpaste +soap +``` + +### Further Reading + +* My ebook [GNU AWK](https://github.com/learnbyexample/learn_gnuawk) + * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) +* [Online gawk manual](https://www.gnu.org/software/gawk/manual/) + +## perl + +Perl is a scripting language with plenty of builtin features and a strong ecosystem. Perl one-liners can be used for text processing, similar to `grep`, `sed`, `awk` and more. And similar to many command line utilities, `perl` can accept input from both `stdin` and file arguments. + +### Basic one-liners + +```bash +# print all lines containing 'at' +# same as: grep 'at' and sed -n '/at/p' and awk '/at/' +$ printf 'gate\napple\nwhat\nkite\n' | perl -ne 'print if /at/' +gate +what + +# print all lines NOT containing 'e' +# same as: grep -v 'e' and sed -n '/e/!p' and awk '!/e/' +$ printf 'gate\napple\nwhat\nkite\n' | perl -ne 'print if !/e/' +what +``` + +The `-e` option accepts code as a command line argument. Many shortcuts are available to reduce the amount of typing needed. In the above examples, a regular expression has been used to filter the input. When the input string isn't specified, the test is performed against special variable `$_`, which has the contents of the current input line. `$_` is also the default argument for many functions like `print` and `length`. To summarize: + +* `/REGEXP/FLAGS` is a shortcut for `$_ =~ m/REGEXP/FLAGS` +* `!/REGEXP/FLAGS` is a shortcut for `$_ !~ m/REGEXP/FLAGS` + +In the examples below, `-p` option is used instead of `-n` option. This helps to automatically print the value of `$_` after processing each input line. + +```bash +# same as: sed 's/:/-/' and awk '{sub(/:/, "-")} 1' +$ printf '1:2:3:4\na:b:c:d\n' | perl -pe 's/:/-/' +1-2:3:4 +a-b:c:d + +# same as: sed 's/:/-/g' and awk '{gsub(/:/, "-")} 1' +$ printf '1:2:3:4\na:b:c:d\n' | perl -pe 's/:/-/g' +1-2-3-4 +a-b-c-d +``` + +>![info](./images/info.svg) Similar to `sed`, you can use the `-i` option for inplace editing. + +### Perl special variables + +Brief description for some of the special variables are given below: + +* `$_` contains input record content +* `@F` array containing fields (with `-a` and `-F` options) + * `$F[0]` first field + * `$F[1]` second field and so on + * `$F[-1]` last field + * `$F[-2]` second last field and so on + * `$#F` index of the last field +* `$.` number of records (i.e. line number) +* `$1` backreference to the first capture group +* `$2` backreference to the second capture group and so on +* `$&` backreference to the entire matched portion + +You'll see examples using such variables in the sections to follow. + +### Auto split + +Here are some examples based on specific fields rather than the entire line. The `-a` option will cause the input line to be split based on whitespaces and the field contents can be accessed using the `@F` special array variable. Leading and trailing whitespaces will be suppressed, so there's no possibility of empty fields. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# same as: awk '{print $2}' table.txt +$ perl -lane 'print $F[1]' table.txt +bread +cake +banana + +# same as: awk '$NF<0' table.txt +$ perl -lane 'print if $F[-1] < 0' table.txt +blue cake mug shirt -7 + +# same as: awk '{gsub(/b/, "B", $1)} 1' table.txt +$ perl -lane '$F[0] =~ s/b/B/g; print "@F"' table.txt +Brown bread mat hair 42 +Blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +When you use an array within double quotes (like `"@F"` in the example above), the fields will be printed with a space character in between. The `join` function is one of the ways to print the contents of an array with a custom field separator. Here's an example: + +```bash +# print contents of @F array with colon as the separator +$ perl -lane 'print join ":", @F' table.txt +brown:bread:mat:hair:42 +blue:cake:mug:shirt:-7 +yellow:banana:window:shoes:3.14 +``` + +>![info](./images/info.svg) In the above examples, the `-l` option has been used to remove the record separator (which is newline by default) from the input line. The record separator thus removed is added back when the `print` function is used. + +### Regexp field separator + +You can use the `-F` option to specify a regexp pattern for input field separation. + +```bash +$ echo 'apple,banana,cherry' | perl -F, -lane 'print $F[1]' +banana + +$ s='Sample123string42with777numbers' +$ echo "$s" | perl -F'\d+' -lane 'print join ",", @F' +Sample,string,with,numbers +``` + +### Powerful features + +I reach for Perl over `grep`, `sed` and `awk` when I need powerful regexp features and make use of the vast builtin functions and libraries. + +Here are some examples showing regexp features not present in BRE/ERE: + +```bash +# reverse lowercase alphabets at the end of input lines +# 'e' flag allows you to use Perl code in the replacement section +$ echo 'fig 42apples' | perl -pe 's/[a-z]+$/reverse $&/e' +fig 42selppa + +# replace arithmetic expressions with their results +$ echo '42*10 200+100 22/7' | perl -pe 's|\d+[+/*-]\d+|$&|gee' +420 300 3.14285714285714 + +# exclude terms in the search pattern +$ s='orange apple appleseed' +$ echo "$s" | perl -pe 's#\bapple\b(*SKIP)(*F)|\w+#($&)#g' +(orange) apple (appleseed) +``` + +And here are some examples showing off builtin features: + +```bash +# filter fields containing 'in' or 'it' or 'is' +$ s='goal:amazing:42:whistle:kwality:3.14' +$ echo "$s" | perl -F: -lane 'print join ":", grep {/i[nts]/} @F' +amazing:whistle:kwality + +# sort numbers in ascending order +# use {$b <=> $a} for descending order +$ echo '23 756 -983 5' | perl -lane 'print join " ", sort {$a <=> $b} @F' +-983 5 23 756 + +# sort strings in ascending order +$ s='floor bat to dubious four' +$ echo "$s" | perl -lane 'print join ":", sort @F' +bat:dubious:floor:four:to + +# unique fields, maintains input order of elements +# -M option helps you load modules +$ s='3,b,a,3,c,d,1,d,c,2,2,2,3,1,b' +$ echo "$s" | perl -MList::Util=uniq -F, -lane 'print join ",", uniq @F' +3,b,a,c,d,1,2 +``` + +### Further Reading + +* [perldoc: Perl introduction](https://perldoc.perl.org/perlintro) +* [perldoc: Regexp tutorial](https://perldoc.perl.org/perlretut) +* My ebook [Perl one-liners](https://github.com/learnbyexample/learn_perl_oneliners) + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. + +```bash +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' +a1:0xA0, a2:0xA0A1 +b1:0xFF, b2:0xBE + +$ printf 'a1:0xA0, a2:0xA0A1\nb1:0xFF, b2:0xBE\n' | sed # ??? +a1:0x50, a2:0x50A1 +b1:0x7F, b2:0xBE +``` + +**2)** Remove only the third line from the given input. + +```bash +$ seq 34 37 | # ??? +34 +35 +37 +``` + +**3)** For the input file `sample.txt`, display all lines that contain `it` but not `do`. + +```bash +# ??? + 7) Believe it +``` + +**4)** For the input file `purchases.txt`, delete all lines containing `tea`. Also, replace all occurrences of `coffee` with `milk`. Write back the changes to the input file itself. The original contents should get saved to `purchases.txt.orig`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +# ??? +$ ls purchases* +purchases.txt purchases.txt.orig +$ cat purchases.txt +milk +washing powder +milk +toothpaste +soap + +# restore the contents +# ??? +$ ls purchases* +purchases.txt +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea +``` + +**5)** For the input file `sample.txt`, display all lines from the start of the file till the first occurrence of `are`. + +```bash +# ??? + 1) Hello World + 2) + 3) Hi there + 4) How are you +``` + +**6)** Delete all groups of lines from a line containing `start` to a line containing `end` for the `uniform.txt` input file. + +```bash +# ??? +mango +icecream +how are you +have a nice day +par,far,mar,tar +``` + +**7)** Replace all occurrences of `42` with `[42]` unless it is at the edge of a word. + +```bash +$ echo 'hi42bye nice421423 bad42 cool_4242a 42c' | sed # ??? +hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c +``` + +**8)** Replace all whole words with `X` that start and end with the same word character. + +```bash +$ echo 'oreo not a _a2_ roar took 22' | sed # ??? +X not X X X took X +``` + +**9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. + +```bash +$ cat anchors.txt +#
    Regular Expressions +## Subexpression calls +## The dot meta character + +$ sed # ??? +[Regular Expressions](#regular-expressions) +[Subexpression calls](#subexpression-calls) +[The dot meta character](#the-dot-meta-character) +``` + +**10)** Replace all occurrences of `e` with `3` except the first two matches. + +```bash +$ echo 'asset sets tests site' | sed # ??? +asset sets t3sts sit3 + +$ echo 'sample item teem eel' | sed # ??? +sample item t33m 33l +``` + +**11)** The below sample strings use `,` as the delimiter and the field values can be empty as well. Use `sed` to replace only the third field with `42`. + +```bash +$ echo 'lion,,ant,road,neon' | sed # ??? +lion,,42,road,neon +$ echo ',,,' | sed # ??? +,,42, +``` + +**12)** For the input file `table.txt`, calculate and display the product of numbers in the last field of each line. Consider space as the field separator for this file. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# ??? +-923.16 +``` + +**13)** Extract the contents between `()` or `)(` from each of the input lines. Assume that the `()` characters will be present only once every line. + +```bash +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' +apple(ice)pie +(almond)pista +yo)yoyo(yo + +$ printf 'apple(ice)pie\n(almond)pista\nyo)yoyo(yo\n' | awk # ??? +ice +almond +yoyo +``` + +**14)** For the input file `scores.csv`, display the `Name` and `Physics` fields in the format shown below. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name:Physics +Ith:100 +Cy:98 +Lin:83 +``` + +**15)** Extract and display third and first words in the format shown below. + +```bash +$ echo '%whole(Hello)--{doubt}==ado==' | # ??? +doubt:whole + +$ echo 'just,\joint*,concession_42<=nice' | # ??? +concession_42:just +``` + +**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. + +```bash +$ awk # ??? +Name,Maths,Physics,Chemistry,GP +Ith,100,100,100,100 +Cy,97,98,95,96.75 +Lin,78,83,80,79.75 +``` + +**17)** From the `para.txt` input file, display all paragraphs containing any digit character. + +```bash +$ cat para.txt +hi there +how are you + +2 apples +12 bananas + + +blue sky +yellow sun +brown earth + +$ awk # ??? +2 apples +12 bananas +``` + +**18)** Input has the ASCII NUL character as the record separator. Change it to dot and newline characters as shown below. + +```bash +$ printf 'apple\npie\0banana\ncherry\0' | awk # ??? +apple +pie. +banana +cherry. +``` + +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. + +```bash +# ??? + 6) Just do-it +``` + +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. + +```bash +$ cat blocks.txt +%=%= +apple +banana +%=%= +brown +green + +$ awk -v n=1 # ??? +%=%= +apple +banana +$ awk -v n=2 # ??? +%=%= +brown +green +``` + +**21)** Display lines present in `c1.txt` but not in `c2.txt` using the `awk` command. + +```bash +$ awk # ??? +Brown +Purple +Teal +``` + +**22)** Display lines from `scores.csv` by matching the first field based on a list of names from the `names.txt` file. + +```bash +$ printf 'Ith\nLin\n' > names.txt + +$ awk # ??? +Ith,100,100,100 +Lin,78,83,80 + +$ rm names.txt +``` + +**23)** Retain only the first copy of duplicate lines from the `duplicates.txt` input file. Use only the contents of the last field for determining duplicates. + +```bash +$ cat duplicates.txt +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +yellow,toy,flower,333 +white,sky,bread,111 +light red,purse,rose,333 + +# ??? +brown,toy,bread,42 +dark red,ruby,rose,111 +blue,ruby,water,333 +dark red,sky,rose,555 +``` + +**24)** For the input file `table.txt`, print input lines if the second field starts with `b`. Construct solutions using `awk` and `perl`. + +```bash +$ awk # ??? +brown bread mat hair 42 +yellow banana window shoes 3.14 + +$ perl # ??? +brown bread mat hair 42 +yellow banana window shoes 3.14 +``` + +**25)** For the input file `table.txt`, retain only the second last field. Write back the changes to the input file itself. The original contents should get saved to `table.txt.bkp`. Afterwards, restore the contents from this backup file. + +```bash +# make the changes +$ perl # ??? +$ ls table* +table.txt table.txt.bkp +$ cat table.txt +hair +shirt +shoes + +# restore the contents +# ??? +$ ls table* +table.txt +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**26)** Reverse the first field contents of `table.txt` input file. + +```bash +# ??? +nworb bread mat hair 42 +eulb cake mug shirt -7 +wolley banana window shoes 3.14 +``` + +**27)** Sort the given comma separated input lexicographically. Change the output field separator to a `:` character. + +```bash +$ ip='floor,bat,to,dubious,four' +$ echo "$ip" | perl # ??? +bat:dubious:floor:four:to +``` + +**28)** Filter fields containing digit characters. + +```bash +$ ip='5pearl 42 east 1337 raku_6 lion 3.14' +$ echo "$ip" | perl # ??? +5pearl 42 1337 raku_6 3.14 +``` + +**29)** The input shown below has several words ending with digit characters. Change the words containing `test` to match the output shown below. That is, renumber the matching portions to `1`, `2`, etc. Words not containing `test` should not be changed. + +```bash +$ ip='test_12:test123\nanother_test_4,no_42\n' +$ printf '%b' "$ip" +test_12:test123 +another_test_4,no_42 + +$ printf '%b' "$ip" | perl # ??? +test_1:test2 +another_test_3,no_42 +``` + +**30)** For the input file `table.txt`, change contents of the third field to all uppercase. Construct solutions using `sed`, `awk` and `perl`. + +```bash +$ sed # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ awk # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 + +$ perl # ??? +brown bread MAT hair 42 +blue cake MUG shirt -7 +yellow banana WINDOW shoes 3.14 +``` + +# Sorting Stuff + +In this chapter, you'll learn how to sort input based on various criteria. And then, you'll learn about tools that typically require sorted input for performing operations like finding unique entries, comparing two files line wise and so on. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. + +## sort + +As the name implies, this command is used to sort the contents of input files. Alphabetic sort and numeric sort? Possible. How about sorting a particular column? Possible. Prioritized multiple sorting order? Possible. Randomize? Unique? Lots of features supported by this powerful command. + +### Common options + +Commonly used options are shown below. Examples will be discussed in later sections. + +* `-n` sort numerically +* `-g` general numeric sort +* `-V` version sort (aware of numbers within text) +* `-h` sort human readable numbers (ex: 4K, 3M, 12G, etc) +* `-k` sort via key (column sorting) +* `-t` single byte character as field separator (default is non-blank to blank transition) +* `-u` sort uniquely +* `-R` random sort +* `-r` reverse the sort output +* `-o` redirect sorted result to specified filename (ex: for inplace sorting) + +### Default sort + +By default, `sort` orders the input [lexicographically](https://en.wikipedia.org/wiki/Lexicographic_order) in ascending order. You can use the `-r` option to reverse the results. + +```bash +# default sort +$ printf 'banana\ncherry\napple' | sort +apple +banana +cherry + +# sort and then display the results in reversed order +$ printf 'peace\nrest\nquiet' | sort -r +rest +quiet +peace +``` + +>![info](./images/info.svg) Use `-f` option if you want to ignore case. See also [coreutils FAQ: Sort does not sort in normal order!](https://www.gnu.org/software/coreutils/faq/#Sort-does-not-sort-in-normal-order_0021). + +### Numerical sort + +There are several ways to deal with input containing numbers: + +```bash +$ printf '20\n2\n3' | sort -n +2 +3 +20 + +# sorting human readable numbers +$ sort -hr file_size.txt +1.4G games +316M projects +746K report.log +104K power.log +20K sample.txt + +# version sort +$ sort -V timings.txt +3m20.058s +3m42.833s +4m3.083s +4m11.130s +5m35.363s +``` + +### Unique sort + +The `-u` option will keep only the first copy of lines that are deemed to be equal. + +```bash +# -f option ignores case differences +$ printf 'CAT\nbat\ncat\ncar\nbat\n' | sort -fu +bat +car +CAT +``` + +### Column sort + +The `-k` option allows you to sort based on specific column(s) instead of the entire input line. By default, the empty string between non-blank and blank characters is considered as the separator. This option accepts arguments in various ways. You can specify starting and ending column numbers separated by a comma. If you specify only the starting column, the last column will be used as the ending column. Usually you just want to sort by a single column, in which case the same number is specified as both the starting and ending columns. Here's an example: + +```bash +$ cat shopping.txt +apple 50 +toys 5 +Pizza 2 +mango 25 +Banana 10 + +# sort based on 2nd column numbers +$ sort -k2,2n shopping.txt +Pizza 2 +toys 5 +Banana 10 +mango 25 +apple 50 +``` + +>![info](./images/info.svg) You can use the `-t` option to specify a single byte character as the field separator. Use `\0` to specify ASCII NUL as the separator. + +>![info](./images/info.svg) Use the `-s` option to retain the original order of input lines when two or more lines are deemed equal. You can still use multiple keys to specify your own tie breakers, `-s` only prevents the last resort comparison. + +## uniq + +This command helps you to identify and remove duplicates. Usually requires a sorted input as the comparison is made between adjacent lines only. + +### Common options + +Commonly used options are shown below. Examples will be discussed in later sections. + +* `-u` display only the unique entries +* `-d` display only the duplicate entries +* `-D` display all the copies of duplicates +* `-c` prefix count +* `-i` ignore case while determining duplicates +* `-f` skip first `N` fields + * field separation is based on one or more space/tab characters only +* `-s` skip first `N` characters +* `-w` restricts the comparison to the first `N` characters + +### Default uniq + +By default, `uniq` retains only one copy of duplicate lines: + +```bash +# same as sort -u for this case +$ printf 'brown\nbrown\nbrown\ngreen\nbrown\nblue\nblue' | sort | uniq +blue +brown +green + +# can't use sort -n -u here +$ printf '2 balls\n13 pens\n2 pins\n13 pens\n' | sort -n | uniq +2 balls +2 pins +13 pens +``` + +### Unique and duplicate entries + +The `-u` option will display only the unique entries. That is, only if a line doesn't occur more than once. + +```bash +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea + +$ sort purchases.txt | uniq -u +soap +toothpaste +washing powder +``` + +The `-d` option will display only the duplicate entries. That is, only if a line is seen more than once. To display all the copies of duplicates, use the `-D` option. + +```bash +$ sort purchases.txt | uniq -d +coffee +tea + +$ sort purchases.txt | uniq -D +coffee +coffee +tea +tea +tea +``` + +### Prefix count + +If you want to know how many times a line has been repeated, use the `-c` option. This will be added as a prefix. + +```bash +$ sort purchases.txt | uniq -c + 2 coffee + 1 soap + 3 tea + 1 toothpaste + 1 washing powder + +$ sort purchases.txt | uniq -dc + 2 coffee + 3 tea + +# sorting by number of occurrences +$ sort purchases.txt | uniq -c | sort -nr + 3 tea + 2 coffee + 1 washing powder + 1 toothpaste + 1 soap +``` + +### Partial match + +`uniq` has three options to change the matching criteria to partial parts of the input line. These aren't as powerful as the `sort -k` option, but they do come in handy for some use cases. + +```bash +# compare only first 2 characters +$ printf '1) apple\n1) almond\n2) banana\n3) cherry\n3) cup' | uniq -w2 +1) apple +2) banana +3) cherry + +# -f1 skips first field +# -s2 then skips two characters (including the blank character) +# -w2 uses next two characters for comparison ('bl' and 'ch' in this example) +$ printf '2 @blue\n10 :black\n5 :cherry\n3 @chalk' | uniq -f1 -s2 -w2 +2 @blue +5 :cherry +``` + +## comm + +The `comm` command finds common and unique lines between two sorted files. By default, you'll get a tabular output with three columns: + +* first column has lines unique to the first file +* second column has lines unique to the second file +* third column has lines common to both the files + +```bash +# side by side view of already sorted sample files +$ paste c1.txt c2.txt +Blue Black +Brown Blue +Orange Green +Purple Orange +Red Pink +Teal Red +White White + +# default three column output +$ comm c1.txt c2.txt + Black + Blue +Brown + Green + Orange + Pink +Purple + Red +Teal + White +``` + +You can use one or more of the following options to suppress columns: + +* `-1` to suppress lines unique to the first file +* `-2` to suppress lines unique to the second file +* `-3` to suppress lines common to both the files + +```bash +# only the common lines +$ comm -12 c1.txt c2.txt +Blue +Orange +Red +White + +# lines unique to the second file +$ comm -13 c1.txt c2.txt +Black +Green +Pink +``` + +## join + +By default, `join` combines two files based on the first field content (also referred as **key**). Only the lines with common keys will be part of the output. + +The key field will be displayed first in the output (this distinction will come into play if the first field isn't the key). Rest of the line will have the remaining fields from the first and second files, in that order. One or more blanks (space or tab) will be considered as the input field separator and a single space will be used as the output field separator. If present, blank characters at the start of the input lines will be ignored. + +```bash +# sample sorted input files +$ cat shopping_jan.txt +apple 10 +banana 20 +soap 3 +tshirt 3 +$ cat shopping_feb.txt +banana 15 +fig 100 +pen 2 +soap 1 + +# combine common lines based on the first field +$ join shopping_jan.txt shopping_feb.txt +banana 20 15 +soap 3 1 +``` + +>![info](./images/info.svg) Note that the collating order used for `join` should be same as the one used to `sort` the input files. Use `join -i` to ignore case, similar to `sort -f` usage. + +If a field value is present multiple times in the same input file, all possible combinations will be present in the output. As shown below, `join` will also ensure to add a final newline character even if not present in the input. + +```bash +$ join <(printf 'a f1_x\na f1_y') <(printf 'a f2_x\na f2_y') +a f1_x f2_x +a f1_x f2_y +a f1_y f2_x +a f1_y f2_y +``` + +>![info](./images/info.svg) There are many more features such as specifying field delimiter, selecting specific fields from each input file in a particular order, filling fields for non-matching lines and so on. See [join chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/join.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook for explanations and examples. + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Default `sort` doesn't work for numbers. Correct the command used below: + +```bash +# wrong output +$ printf '100\n10\n20\n3000\n2.45\n' | sort +10 +100 +20 +2.45 +3000 + +# expected output +$ printf '100\n10\n20\n3000\n2.45\n' | sort # ??? +2.45 +10 +20 +100 +3000 +``` + +**2)** Which `sort` option will help you ignore case? + +```bash +$ printf 'Super\nover\nRUNE\ntea\n' | LC_ALL=C sort # ??? +over +RUNE +Super +tea +``` + +**3)** Go through the `sort` manual and use appropriate options to get the output shown below. + +```bash +# wrong output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort -n +-1.53 ++120 +3.14e+4 +42.1e-2 + +# expected output +$ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort # ??? +-1.53 +42.1e-2 ++120 +3.14e+4 +``` + +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](#shell-features) chapter. + +```bash +# ??? +Name,Maths,Physics,Chemistry +Lin,78,83,80 +Cy,97,98,95 +Ith,100,100,100 +``` + +**5)** Sort the contents of `duplicates.txt` by the fourth column numbers in descending order. Retain only the first copy of lines with the same number. + +```bash +# ??? +dark red,sky,rose,555 +blue,ruby,water,333 +dark red,ruby,rose,111 +brown,toy,bread,42 +``` + +**6)** Will `uniq` throw an error if the input is not sorted? What do you think will be the output for the following input? + +```bash +$ printf 'red\nred\nred\ngreen\nred\nblue\nblue' | uniq +# ??? +``` + +**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. + +```bash +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' +3) cherry +1) apple +2) banana +1) almond + +$ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' | # ??? +2) banana +3) cherry +``` + +**8)** Count the number of times input lines are repeated and display the results in the format shown below. + +```bash +$ printf 'brown\nbrown\nbrown\ngreen\nbrown\nblue\nblue' | # ??? + 1 green + 2 blue + 4 brown +``` + +**9)** Display lines present in `c1.txt` but not in `c2.txt` using the `comm` command. Assume that the input files are already sorted. + +```bash +# ??? +Brown +Purple +Teal +``` + +**10)** Use appropriate options to get the expected output shown below. + +```bash +# wrong usage, no output +$ join <(printf 'apple 2\nfig 5') <(printf 'Fig 10\nmango 4') + +# expected output +# ??? +fig 5 10 +``` + +**11)** What are the differences between `sort -u` and `uniq -u` options, if any? + +# Comparing Files + +In this chapter, you'll learn how to find and report differences between the contents of two files. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. + +## cmp + +The `cmp` command is useful to compare text and binary files. If the two files are same, no output is displayed and exit status is `0`. If there is a difference, it prints the first difference with details like line number and byte location and the exit status will be `1`. + +```bash +$ mkdir practice_cmp +$ cd practice_cmp +$ echo 'hello' > x1.txt +$ cp x{1,2}.txt +$ echo 'hello.' > x3.txt + +# files with same content +$ cmp x1.txt x2.txt +$ echo $? +0 + +# files with differences +$ cmp x1.txt x3.txt +x1.txt x3.txt differ: byte 6, line 1 +$ echo $? +1 +``` + +>![info](./images/info.svg) Use the `-s` option to suppress the output when you just need the exit status. The `-i` option will allow you to skip initial bytes from the input. + +## diff + +Useful to find differences between text files. All the differences are printed, which might not be desirable for long files. + +### Common options + +Commonly used options are shown below. Examples will be discussed in later sections. + +* `-i` ignore case while comparing +* `-w` ignore whitespaces +* `-b` ignore changes in the amount of whitespace +* `-B` ignore only blank lines +* `-E` ignore changes due to tab expansion +* `-z` ignore trailing whitespaces at the end of line +* `-y` two column output +* `-r` recursively compare files between the two directories specified +* `-s` convey message when two files are same +* `-q` report if files differ, not the details of differences + +### Default diff + +By default, the `diff` output shows lines from the first file input prefixed with `<` and lines from the second file input prefixed with `>`. A line containing `---` is used as the group separator. Each difference is prefixed by a command that indicates the differences (these commands are understood by tools like `patch`). + +```bash +# change to the 'example_files/text_files' directory +# side-by-side view of sample input files +$ paste f1.txt f2.txt +1 1 +2 hello +3 3 +world 4 + +$ diff f1.txt f2.txt +2c2 +< 2 +--- +> hello +4c4 +< world +--- +> 4 + +$ diff <(seq 4) <(seq 5) +4a5 +> 5 +``` + +### Ignoring whitespaces + +There are several options to ignore specific whitespace characters during comparison. Here are some examples: + +```bash +# ignore changes in the amount of whitespace +$ diff -b <(echo 'good day') <(echo 'good day') +$ echo $? +0 + +# ignore all whitespaces +$ diff -w <(echo 'hi there ') <(echo ' hi there') +$ echo $? +0 +$ diff -w <(echo 'hi there ') <(echo 'hithere') +$ echo $? +0 +``` + +### Side-by-side output + +The `-y` option is handy to view the differences side-by-side. By default, all the input lines will be present in the output and the line width is 130 print columns. You can use the `-W` option to change the width when dealing with short input lines. The `--suppress-common-lines` helps to focus only on the differences. + +```bash +$ diff -y f1.txt f2.txt +1 1 +2 | hello +3 3 +world | 4 + +$ diff -W 60 --suppress-common-lines -y f1.txt f2.txt +2 | hello +world | 4 +``` + +### Further Reading + +* `gvimdiff` edit two, three or four versions of a file with GVim and show differences +* [GUI diff and merge tools](http://askubuntu.com/questions/2946/what-are-some-good-gui-diff-and-merge-applications-available-for-ubuntu) + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? + +**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. + +```bash +$ echo '1) apple' > x1.txt +$ echo '2. apple' > x2.txt +$ cmp x1.txt x2.txt +x1.txt x2.txt differ: byte 1, line 1 + +$ cmp # ??? +$ echo $? +0 + +$ rm x[12].txt +``` + +**3)** What does the `diff -d` option do? + +**4)** Which option will help you get colored output with `diff`? + +**5)** Use appropriate options to get the desired output shown below. + +```bash +# instead of this output +$ diff -W 40 --suppress-common-lines -y f1.txt f2.txt +2 | hello +world | 4 + +# get this output +$ diff # ??? +1 ( +2 | hello +3 ( +world | 4 +``` + +**6)** Use appropriate options to get the desired output shown below. + +```bash +$ echo 'hello' > d1.txt +$ echo 'Hello' > d2.txt + +# instead of this output +$ diff d1.txt d2.txt +1c1 +< hello +--- +> Hello + +# get this output +$ diff # ??? +Files d1.txt and d2.txt are identical + +$ rm d[12].txt +``` + +# Assorted Text Processing Tools + +There are way too many specialized text processing tools. This chapter will discuss some of the commands that haven't been covered in the previous chapters. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the sample input files used in this chapter. + +## seq + +The `seq` command is a handy tool to generate a sequence of numbers in ascending or descending order. Both integer and floating-point numbers are supported. You can also customize the formatting for numbers and the separator between them. + +You need three numbers to generate an arithmetic progression — **start**, **step** and **stop**. When you pass only a single number as the stop value, the default start and step values are assumed to be `1`. Passing two numbers are considered as start and stop values (in that order). + +```bash +# start=1, step=1 and stop=3 +$ seq 3 +1 +2 +3 + +# start=25434, step=1 and stop=25437 +$ seq 25434 25437 +25434 +25435 +25436 +25437 + +# start=-5, step=1 and stop=-3 +$ seq -5 -3 +-5 +-4 +-3 + +# start=0.25, step=0.33 and stop=1.12 +$ seq 0.25 0.33 1.12 +0.25 +0.58 +0.91 +``` + +By using a negative step value, you can generate sequences in descending order. + +```bash +$ seq 3 -1 1 +3 +2 +1 +``` + +You can use the `-s` option to change the separator *between* the numbers of a sequence. A single newline character is always the character added after the final number. + +```bash +$ seq -s' - ' 4 +1 - 2 - 3 - 4 + +$ seq -s: 1.2e2 0.752 1.22e2 +120.000:120.752:121.504 +``` + +The `-w` option will equalize the width of the output numbers using leading zeros. The largest width between the start and stop values will be used. + +```bash +$ seq -w 8 10 +08 +09 +10 + +$ seq -w 0003 +0001 +0002 +0003 +``` + +You can use the `-f` option for `printf` style floating-point number formatting. + +```bash +$ seq -f'%g' -s: 1 0.75 3 +1:1.75:2.5 + +$ seq -f'%.4f' -s: 1 0.75 3 +1.0000:1.7500:2.5000 + +$ seq -f'%.3e' 1.2e2 0.752 1.22e2 +1.200e+02 +1.208e+02 +1.215e+02 +``` + +## shuf + +By default, `shuf` will randomize the order of input lines. You can use the `-n` option to limit the number of output lines. + +```bash +$ printf 'apple\nbanana\ncherry\nfig\nmango' | shuf +banana +cherry +mango +apple +fig + +$ printf 'apple\nbanana\ncherry\nfig\nmango' | shuf -n2 +mango +cherry +``` + +You can use the `-e` option to specify multiple input lines as arguments to the command. The `-r` option helps if you want to allow input lines to be repeated. This option is usually paired with `-n` to limit the number of lines in the output. + +```bash +$ shuf -n4 -r -e brown green blue +green +brown +blue +green +``` + +The `-i` option will help you generate random positive integers. + +```bash +$ shuf -n3 -i 100-200 +170 +112 +148 +``` + +## cut + +`cut` is a handy tool for many field processing use cases. The features are limited compared to `awk` and `perl` commands, but the reduced scope also leads to faster processing. + +By default, `cut` splits the input content into fields based on the tab character, which you can change using the `-d` option. The `-f` option allows you to select a desired field from each input line. To extract multiple fields, specify the selections separated by the comma character. By default, lines not containing the input delimiter will still be part of the output. You can use the `-s` option to suppress such lines. + +```bash +# second field +$ printf 'apple\tbanana\tcherry\n' | cut -f2 +banana + +# first and third field +$ printf 'apple\tbanana\tcherry\n' | cut -f1,3 +apple cherry + +# setting -d automatically changes output delimiter as well +$ echo 'one;two;three;four;five' | cut -d';' -f2,5 +two;five +``` + +You can use the `-` character to specify field ranges. The starting or ending field number can be skipped, but not both. + +```bash +# 2nd, 3rd and 4th fields +$ printf 'apple\tbanana\tcherry\tdates\n' | cut -f2-4 +banana cherry dates + +# all fields from the start till the 3rd field +$ printf 'apple\tbanana\tcherry\tdates\n' | cut -f-3 +apple banana cherry + +# 1st field and all fields from the 3rd field till the end +$ printf 'apple\tbanana\tcherry\tdates\n' | cut -f1,3- +apple cherry dates +``` + +Use the `--output-delimiter` option to customize the output separator to any string of your choice. + +```bash +# same as: tr '\t' ',' +$ printf 'apple\tbanana\tcherry\n' | cut --output-delimiter=, -f1- +apple,banana,cherry + +# multicharacter example +$ echo 'one;two;three;four' | cut -d';' --output-delimiter=' : ' -f1,3- +one : three : four +``` + +The `--complement` option allows you to invert the field selections. + +```bash +# except second field +$ printf 'apple ball cat\n1 2 3 4 5' | cut --complement -d' ' -f2 +apple cat +1 3 4 5 + +# except first and third fields +$ printf 'apple ball cat\n1 2 3 4 5' | cut --complement -d' ' -f1,3 +ball +2 4 5 +``` + +You can use the `-b` or `-c` options to select specified bytes from each input line. The syntax is same as the `-f` option. The `-c` option is intended for multibyte character selection, but for now it works exactly as the `-b` option. + +```bash +$ printf 'apple\tbanana\tcherry\n' | cut -c2,8,11 +pan + +$ printf 'apple\tbanana\tcherry\n' | cut -c2,8,11 --output-delimiter=- +p-a-n + +$ printf 'apple\tbanana\tcherry\n' | cut --complement -c13- +apple banana + +$ printf 'cat-bat\ndog:fog' | cut -c5- +bat +fog +``` + +## column + +The `column` command is a nifty tool to align input data column wise. By default, whitespace is used as the input delimiter. Space character is used to align the output columns, so whitespace characters like tab will get converted to spaces. + +```bash +$ printf 'one two three\nfour five six\nseven eight nine\n' +one two three +four five six +seven eight nine + +$ printf 'one two three\nfour five six\nseven eight nine\n' | column -t +one two three +four five six +seven eight nine +``` + +You can use the `-s` option to customize the input delimiter. Note that the output delimiter will still be made up of spaces only. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +$ column -s, -t scores.csv +Name Maths Physics Chemistry +Ith 100 100 100 +Cy 97 98 95 +Lin 78 83 80 + +$ printf '1:-:2:-:3\napple:-:banana:-:cherry\n' | column -s:-: -t +1 2 3 +apple banana cherry +``` + +>![warning](images/warning.svg) Input should have a newline at the end, otherwise you'll get an error: +> +> ```bash +> $ printf '1 2 3\na b c' | column -t +> column: line too long +> 1 2 3 +> ``` + +## tr + +`tr` helps you to map one set of characters to another set of characters. Features like range, repeats, character sets, squeeze, complement, etc makes it a must know text processing tool. + +`tr` works only on `stdin` data, so you'll need to use shell input redirection for file input. Here are some basic examples: + +```bash +# 'l' maps to '1', 'e' to '3', 't' to '7' and 's' to '5' +$ echo 'leet speak' | tr 'lets' '1375' +1337 5p3ak + +# example with shell metacharacters +$ echo 'apple;banana;cherry' | tr ';' ':' +apple:banana:cherry + +# swap case +$ echo 'Hello World' | tr 'a-zA-Z' 'A-Za-z' +hELLO wORLD + +$ tr 'a-z' 'A-Z' Paginate or columnate FILE(s) for printing. + +As stated in the above quote from the manual, the `pr` command is mainly used for those two tasks. This section will discuss only the columnate features and some miscellaneous tasks. Here's a pagination example if you are interested in exploring further. The `pr` command will add blank lines, a header and so on to make it suitable for printing. + +```bash +$ pr greeting.txt | head -n8 + + +2021-08-05 14:10 greeting.txt Page 1 + + +Hi there +Have a nice day + +``` + +The `--columns` and `-a` options can be used to merge the input lines in two different ways: + +* split the input file and then merge them as columns +* merge consecutive lines, similar to the `paste` command + +Here's an example to get started. Note that `-N` is same as using `--columns=N` where `N` is the number of columns you want in the output. The default page width is `72`, which means each column can only have a maximum of `72/N` characters (including the separator). Tab and space characters will be used to fill the columns as needed. You can use the `-J` option to prevent `pr` from truncating longer columns. The `-t` option is used here to turn off the pagination features. + +```bash +# split input into three parts +# each column width is 72/3 = 24 characters max +$ seq 9 | pr -3t +1 4 7 +2 5 8 +3 6 9 +``` + +You can customize the separator using the `-s` option. The default is a tab character which you can change to any other string value. The `-s` option also turns off line truncation, so `-J` option isn't needed. + +```bash +# tab separator +$ seq 9 | pr -3ts +1 4 7 +2 5 8 +3 6 9 + +# custom separator +$ seq 9 | pr -3ts' : ' +1 : 4 : 7 +2 : 5 : 8 +3 : 6 : 9 +``` + +However, the default page width of `72` can still cause issues, which you can prevent by using the `-w` option. The `-w` option overrides the effect of `-s` option on line truncation, so use `-J` option as well unless you really need truncation. + +```bash +$ seq 6 | pr -J -w10 -3ats'::::' +pr: page width too narrow + +$ seq 6 | pr -J -w11 -3ats'::::' +1::::2::::3 +4::::5::::6 +``` + +Use the `-a` option to merge consecutive lines, similar to the `paste` command. One advantage is that the `-s` option supports a string value, whereas with `paste` you'd need to use workarounds to get multicharacter separation. + +```bash +# same as: paste -d: - - - - +$ seq 8 | pr -4ats: +1:2:3:4 +5:6:7:8 + +# unlike paste, pr doesn't add separator if last row has less columns to fill +$ seq 10 | pr -4ats, +1,2,3,4 +5,6,7,8 +9,10 +``` + +Two or more input files can be merged column wise using the `-m` option. As seen before, `-t` is needed to ignore pagination features and `-s` can be used to customize the separator. + +```bash +# same as: paste -d' : ' <(seq 3) /dev/null /dev/null <(seq 4 6) +$ pr -mts' : ' <(seq 3) <(seq 4 6) +1 : 4 +2 : 5 +3 : 6 +``` + +## rev + +The `rev` command reverses each input line character wise. Newline character *won't* be added to the end if it wasn't present in the input. Here are some examples: + +```bash +$ echo 'This is a sample text' | rev +txet elpmas a si sihT + +$ printf 'apple\nbanana\ncherry\n' | rev +elppa +ananab +yrrehc + +$ printf 'malayalam\nnoon\n' | rev +malayalam +noon +``` + +## split + +The `split` command is useful to divide the input into smaller parts based on number of lines, bytes, file size, etc. You can also execute another command on the divided parts before saving the results. An example use case is sending a large file as multiple parts as a workaround for online transfer size limits. + +By default, the `split` command divides the input `1000` lines at a time. Newline character is the default line separator. You can pass a single file or `stdin` data as the input. Use `cat` if you need to concatenate multiple input sources. The output files will be named `xaa`, `xab`, `xac` and so on (where `x` is the prefix). If the filenames are exhausted, two more letters will be appended and the pattern will continue as needed. If the number of input lines is not evenly divisible, the last file will contain less than `1000` lines. + +```bash +# divide input 1000 lines at a time +$ seq 10000 | split + +# output filenames +$ ls x* +xaa xab xac xad xae xaf xag xah xai xaj + +# preview of some of the output files +$ head -n1 xaa xab xae xaj +==> xaa <== +1 + +==> xab <== +1001 + +==> xae <== +4001 + +==> xaj <== +9001 +``` + +>![info](./images/info.svg) For more examples, customization options and other details, see [split chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/split.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. + +## csplit + +The `csplit` command is useful to divide the input into smaller parts based on line numbers and regular expression patterns. + +You can split the input into two based on a particular line number. To do so, specify the line number after the input source (filename or `stdin` data). The first output file will have the input lines *before* the given line number and the second output file will have the rest of the contents. By default, the output files will be named `xx00`, `xx01`, `xx02` and so on (where `xx` is the prefix). The numerical suffix will automatically use more digits if needed. + +```bash +# split input into two based on line number 2 +# -q option suppresses output showing number of bytes written for each file +$ seq 4 | csplit -q - 2 + +# first output file will have the first line +# second output file will have the rest +$ head xx* +==> xx00 <== +1 + +==> xx01 <== +2 +3 +4 +``` + +You can also split the input based on a line matching the given regular expression. The output produced will vary based on `//` or `%%` delimiters being used to surround the regexp. When `/regexp/` is used, output is similar to the line number based splitting. The first output file will have the input lines *before* the first occurrence of a line matching the given regexp and the second output file will have the rest of the contents. + +Consider this sample input file: + +```bash +$ cat purchases.txt +coffee +tea +washing powder +coffee +toothpaste +tea +soap +tea +``` + +Here's an example of splitting the input file using the `/regexp/` syntax: + +```bash +# match a line containing 't' followed by zero or more characters and then 'p' +# 'toothpaste' is the only match for this input file +$ csplit -q purchases.txt '/t.*p/' + +$ head xx* +==> xx00 <== +coffee +tea +washing powder +coffee + +==> xx01 <== +toothpaste +tea +soap +tea +``` + +When `%regexp%` is used, the lines occurring before the matching line won't be part of the output. Only the line matching the given regexp and the rest of the contents will be part of the single output file. + +```bash +$ csplit -q purchases.txt '%t.*p%' + +$ cat xx00 +toothpaste +tea +soap +tea +``` + +>![info](./images/info.svg) For more examples, customization options and other details, see [csplit chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/csplit.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. + +## xargs + +By default, `xargs` executes the `echo` command for the arguments extracted from `stdin` data (or file input via the `-a` option). The `-n` option helps to customize how many arguments should be passed at a time. Together, these features can be used to reshape whitespace separated data as shown in the examples below: + +```bash +$ printf ' apple banana cherry\n\t\tdragon unicorn \n' + apple banana cherry + dragon unicorn +$ printf ' apple banana cherry\n\t\tdragon unicorn \n' | xargs -n2 +apple banana +cherry dragon +unicorn + +$ cat ip.txt +deep blue +light orange +blue delight +$ xargs -a ip.txt -n3 +deep blue light +orange blue delight +``` + +You can use the `-L` option to specify how many input lines should be combined at a time: + +```bash +# same as: pr -3ats' ' or paste -d' ' - - - +$ seq 9 | xargs -L3 +1 2 3 +4 5 6 +7 8 9 + +$ xargs -a ip.txt -L2 +deep blue light orange +blue delight + +# you can also use -l instead of -L1 +$ printf ' apple banana cherry\n\t\tdragon unicorn \n' | xargs -L1 +apple banana cherry +dragon unicorn +``` + +>![info](./images/info.svg) Note that `xargs -L1` is not the same as `awk '{$1=$1} 1'` since `xargs` will discard blank lines. Also, trailing blank characters will cause the next line to be considered as part of the current line. For example: +> +> ```bash +> # no trailing blanks +> $ printf 'xerox apple\nregex go sea\n' | xargs -L1 +> xerox apple +> regex go sea +> +> # with trailing blanks +> $ printf 'xerox apple \nregex go sea\n' | xargs -L1 +> xerox apple regex go sea +> ``` + +Use `-d` option to change the input delimiter from whitespace to some other single character. For example: + +```bash +$ printf '1,2,3,4,5,6' | xargs -d, -n3 +1 2 3 +4 5 6 +``` + +## Exercises + +>![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. + +**1)** Generate the following sequence. + +```bash +# ??? +100 +95 +90 +85 +80 +``` + +**2)** Is the sequence shown below possible to generate with `seq`? If so, how? + +```bash +# ??? +01.5,02.5,03.5,04.5,05.5 +``` + +**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. + +```bash +# ??? +supplemental +foresight +underestimates +``` + +**4)** Briefly describe the purpose of the `shuf` command options `-i`, `-e` and `-r`. + +**5)** Why does the below command not work as expected? What other tools can you use in such cases? + +```bash +# not working as expected +$ echo 'apple,banana,cherry,dates' | cut -d, -f3,1,3 +apple,cherry + +# expected output +# ??? +cherry,apple,cherry +``` + +**6)** Display except the second field in the format shown below. Can you construct two different solutions? + +```bash +$ echo 'apple,banana,cherry,dates' | cut # ??? +apple cherry dates + +$ echo '2,3,4,5,6,7,8' | cut # ??? +2 4 5 6 7 8 +``` + +**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? + +```bash +$ printf 'apple\nbanana\ncherry\ndates\n' | cut # ??? +app +ban +che +dat +``` + +**8)** Display only the first and third columns of the `scores.csv` input file in the format as shown below. Note that only space characters are present between the two columns, not tab. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name Physics +Ith 100 +Cy 98 +Lin 83 +``` + +**9)** Display the contents of `table.txt` in the format shown below. + +```bash +# ??? +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 +``` + +**10)** Implement [ROT13](https://en.wikipedia.org/wiki/ROT13) cipher using the `tr` command. + +```bash +$ echo 'Hello World' | tr # ??? +Uryyb Jbeyq +$ echo 'Uryyb Jbeyq' | tr # ??? +Hello World +``` + +**11)** Retain only alphabets, digits and whitespace characters. + +```bash +$ echo 'Apple_42 cool,blue Dragon:army' | # ??? +Apple42 coolblue Dragonarmy +``` + +**12)** Use `tr` to get the output shown below. + +```bash +$ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr # ??? +how are you +``` + +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? + +```bash +# this works individually for each input file +$ paste -sd, fruits.txt ip.txt +banana,papaya,mango +deep blue,light orange,blue delight + +# expected output +# ??? +banana,papaya,mango,deep blue,light orange,blue delight +``` + +**14)** Use appropriate options to get the expected output shown below. + +```bash +# default output +$ paste fruits.txt ip.txt +banana deep blue +papaya light orange +mango blue delight + +# expected output +$ paste # ??? +banana +deep blue +papaya +light orange +mango +blue delight +``` + +**15)** Use the `pr` command to get the expected output shown below. + +```bash +$ seq -w 16 | pr # ??? +01,02,03,04 +05,06,07,08 +09,10,11,12 +13,14,15,16 + +$ seq -w 16 | pr # ??? +01,05,09,13 +02,06,10,14 +03,07,11,15 +04,08,12,16 +``` + +**16)** Use the `pr` command to join the input files `fruits.txt` and `ip.txt` as shown below. + +```bash +# ??? +banana : deep blue +papaya : light orange +mango : blue delight +``` + +**17)** The `cut` command doesn't support a way to choose the last `N` fields. Which tool presented in this chapter can be combined to work with `cut` to get the output shown below? + +```bash +# last two characters from each line +$ printf 'apple\nbanana\ncherry\ndates\n' | # ??? +le +na +ry +es +``` + +**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. + +```bash +# split input by 3 lines (max) at a time +# ??? + +$ head xa? +==> xaa <== +coffee +tea +washing powder + +==> xab <== +coffee +toothpaste +tea + +==> xac <== +soap +tea + +$ rm xa? +``` + +**19)** Go through `split` documentation and use appropriate options to get the output shown below. + +```bash +$ echo 'apple,banana,cherry,dates' | split # ??? + +$ head xa? +==> xaa <== +apple, +==> xab <== +banana, +==> xac <== +cherry, +==> xad <== +dates + +$ rm xa? +``` + +**20)** Split the input file `purchases.txt` such that the text before a line containing `powder` is part of the first file and the rest are part of the second file as shown below. + +```bash +# ??? + +$ head xx0? +==> xx00 <== +coffee +tea + +==> xx01 <== +washing powder +coffee +toothpaste +tea +soap +tea + +$ rm xx0? +``` + +**21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. + +```bash +$ cat scores.csv +Name,Maths,Physics,Chemistry +Ith,100,100,100 +Cy,97,98,95 +Lin,78,83,80 + +# ??? +Name,Ith,Cy,Lin +Maths,100,97,78 +Physics,100,98,83 +Chemistry,100,95,80 +``` + +**22)** Reshape the contents of `table.txt` to the expected output shown below. + +```bash +$ cat table.txt +brown bread mat hair 42 +blue cake mug shirt -7 +yellow banana window shoes 3.14 + +# ??? +brown bread mat hair +42 blue cake mug +shirt -7 yellow banana +window shoes 3.14 +``` + +# Shell Scripting + +This chapter will cover basics of shell scripting with `bash`. You'll learn about declaring variables, control structures, working with arguments passed to a script, getting user input and so on. + +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has all the shell scripts discussed in this chapter. However, it is recommended that you type the scripts manually using your favorite text editor and refer to the `example_files/shell_scripting` directory only when necessary. + +## Need for scripting + +From [wikipedia: Scripting language](https://en.wikipedia.org/wiki/Scripting_language): + +>A scripting language or script language is a programming language for a runtime system that automates the execution of tasks that would otherwise be performed individually by a human operator. Scripting languages are usually interpreted at runtime rather than compiled. + +>Typical scripting languages are intended to be very fast to learn and write in, either as short source code files or interactively in a read–eval–print loop (REPL, language shell). This generally implies relatively simple syntax and semantics; typically a "script" (code written in the scripting language) is executed from start to finish, as a "script", with no explicit entry point. + +From [wikipedia: Shell script](https://en.wikipedia.org/wiki/Shell_script): + +>A shell script is a computer program designed to be run by the Unix shell, a command-line interpreter. The various dialects of shell scripts are considered to be scripting languages. Typical operations performed by shell scripts include file manipulation, program execution, and printing text. A script which sets up the environment, runs the program, and does any necessary cleanup or logging, is called a wrapper. + +See also [Difference between scripting and programming languages](https://stackoverflow.com/q/17253545/4082052). + +## Executable script + +There are several ways you can execute commands from a file. This section shows an example of creating an executable script. Consider this sample script saved in a file named `hello.sh`: + +```bash +#!/bin/bash + +echo "Hello $USER" +echo "Today is $(date -u +%A)" +echo 'Have a nice day' +``` + +The first line in the above script has two parts: + +* `/bin/bash` is the path of `bash` interpreter + * you can use `type bash` to get the path on your system +* `#!` is known as [shebang or hashbang](https://en.wikipedia.org/wiki/Shebang_(Unix)) which directs the program loader to use the interpreter path provided + * see also [stackoverflow: comparison between #!/usr/bin/env and #!/bin/bash?](https://stackoverflow.com/q/21612980/4082052) + * the `#` character starts a comment, `#!` is only special at the start of the script + +Use `chmod` to add executable permission to the file and then run the script: + +```bash +$ chmod +x hello.sh + +$ ./hello_world.sh +Hello learnbyexample +Today is Wednesday +Have a nice day +``` + +If you want to use just the script name to execute it, the file has to be located in one of the `PATH` folders. Otherwise, you'll have to provide the script's path (absolute or relative) in order to execute it (as shown in the above illustration). + +>![info](images/info.svg) `.sh` is typically used as the file extension for shell scripts. It is also common to *not* have an extension at all, especially for executable scripts. + +## Passing file argument to bash + +You can also just pass a regular file as an argument to the `bash` command. In this case, the shebang isn't needed (though it wouldn't cause any issues either, since it will be treated as a comment). + +```bash +$ cat greeting.sh +echo 'hello' +echo 'have a nice day' + +$ bash greeting.sh +hello +have a nice day +``` + +## Sourcing script + +Yet another way to execute a script is to *source* it using the `source` (or `.`) builtin command. A major difference from the previous methods is that the script is executed in the current shell environment context instead of a sub-shell. A common use case is sourcing `~/.bashrc` and alias/functions (if they are saved in a separate file). + +Here's an example: + +```bash +$ cat prev_cmd.sh +prev=$(fc -ln -2 | sed 's/^\s*//; q') +echo "$prev" + +# 'echo' here is just a sample command for illustration purposes +$ echo 'hello' +hello +# sourcing the script correctly gives the previous command +$ source prev_cmd.sh +echo 'hello' + +$ echo 'hello' +hello +# no output when the script is executed in a sub-shell +$ bash prev_cmd.sh +``` + +>![info](./images/info.svg) `fc` is a builtin command to manipulate the history of commands you've used from the terminal. See [bash manual: History Builtins](https://www.gnu.org/software/bash/manual/bash.html#Bash-History-Builtins) for more details. + +## Comments + +Single line comments can be inserted after the `#` character, either at the start of a line or after an instruction. + +```bash +$ cat comments.sh +# this is a comment on its own line +echo 'hello' # and this is a comment after a command + +$ bash comments.sh +hello +``` + +>![info](images/info.svg) See this [unix.stackexchange thread](https://unix.stackexchange.com/q/37411/109046) for emulating multiline comments. + +## Variables + +Here's a basic example of assigning a variable and accessing its value: + +```bash +$ name='learnbyexample' + +$ echo "$name" +learnbyexample +``` + +As seen above, you need to use the `$` prefix while accessing the value stored in a variable. You can use `${variable}` syntax to distinguish between the variable and other parts of the string. Using appropriate quotes is recommended, unless otherwise necessary. + +You can append to a variable by using the `+=` operator. Here's an example: + +```bash +$ colors='blue' +$ echo "$colors" +blue + +$ colors+=' green' +$ echo "$colors" +blue green +``` + +You can use the `declare` builtin to add attributes to variables. For example, the `-i` option for treating the variable as an integer, `-r` option for readonly, etc. These attributes can change the behavior of operators like `=` and `+=` for those variables. See [bash manual: Shell-Parameters](https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters) and [bash manual: declare](https://www.gnu.org/software/bash/manual/bash.html#index-declare) for more details. + +```bash +$ declare -i num=5 +$ echo "$num" +5 +$ num+=42 +$ echo "$num" +47 + +$ declare -r color='brown' +$ echo "$color" +brown +$ color+=' green' +bash: color: readonly variable +``` + +>![info](./images/info.svg) ![warning](./images/warning.svg) Assigning variables is one of the most common source for errors. Unlike most programming languages, spaces are *not* allowed around the `=` sign. That is because space is a shell metacharacter. Another common issue is using quotes (or not) around the value. Here are some examples: +> +> ```bash +> $ num = 42 +> num: command not found +> +> $ greeting=hello world +> world: command not found +> $ greeting='hello world' +> $ echo "$greeting" +> hello world +> +> # using quotes is NOT desirable here +> $ dir_path=~/reports +> $ echo "$dir_path" +> /home/learnbyexample/reports +> $ dir_path='~/reports' +> $ echo "$dir_path" +> ~/reports +> ``` + +## Arrays + +From [bash manual: Arrays](https://www.gnu.org/software/bash/manual/bash.html#Arrays): + +>Bash provides one-dimensional indexed and associative array variables. Any variable may be used as an indexed array; the `declare` builtin will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously. Indexed arrays are referenced using integers and are zero-based; associative arrays use arbitrary strings. + +Here's an example of assigning an indexed array and various ways of accessing the elements: + +```bash +$ fruits=('apple' 'fig' 'mango') + +# first element +$ echo "${fruits[0]}" +apple + +# last element +$ echo "${fruits[-1]}" +mango + +# all elements (example with for loop will be discussed later on) +$ echo "${fruits[@]}" +apple fig mango +$ printf '%s\n' "${fruits[@]}" +apple +fig +mango +``` + +## Parameter Expansion + +Bash provides several useful ways to extract and modify contents of parameters and variables (including arrays). Some of these features will be discussed in this section. + +*1)* Substring extraction using `${parameter:offset}` syntax to get all characters from the given index: + +```bash +$ city='Lucknow' + +# all characters from index 4 onwards +# indexing starts from 0 +$ echo "${city:4}" +now + +# last two characters +# space before the negative sign is compulsory here, +# since ${parameter:-word} is a different feature +$ echo "${city: -2}" +ow +``` + +When applied to arrays, substring extraction will give you those elements: + +```bash +$ fruits=('apple' 'fig' 'mango') + +# all elements from index 1 +$ echo "${fruits[@]:1}" +fig mango +``` + +*2)* Substring extraction using `${parameter:offset:length}` syntax to get specific number of characters from the given index: + +```bash +$ city='Lucknow' + +# 4 characters starting from index 0 +# can also use: echo "${city::4}" +$ echo "${city:0:4}" +Luck + +# 2 characters starting from index -4 (4th character from the end) +$ echo "${city: -4:2}" +kn + +# except last 2 characters +$ echo "${city::-2}" +Luckn +``` + +*3)* `${#parameter}` will give you the length of the string and `${#array[@]}` will give you the number of elements in the array: + +```bash +$ city='Lucknow' +$ echo "${#city}" +7 + +$ fruits=('apple' 'fig' 'mango') +$ echo "${#fruits[@]}" +3 +``` + +*4)* `${parameter#glob}` will remove the shortest match from the start of the string. You can also use extended globs if enabled via `shopt` builtin. `${parameter##glob}` will remove the longest match from the start of the string. Here are some examples: + +```bash +$ s='this is his life history' + +# shortest match is deleted +$ echo "${s#*is}" + is his life history +# longest match is deleted +$ echo "${s##*is}" +tory + +# assuming extglob is enabled +$ echo "${s#+([^ ])}" +his is his life history +$ echo "${s##+([^ ])}" + is his life history + +# for arrays, the processing is applied to each element +$ fruits=('apple' 'fig' 'mango') +$ echo "${fruits[@]#*[aeiou]}" +pple g ngo +``` + +*5)* You can use `${parameter%glob}` to remove the shortest match from the end of the string. `${parameter%%glob}` will remove the longest match from the end of the string. Here are some examples: + +```bash +$ s='this is his life history' + +$ echo "${s%is*}" +this is his life h +$ echo "${s%%is*}" +th + +$ fruits=('apple' 'fig' 'mango') +$ echo "${fruits[@]%[aeiou]*}" +appl f mang +``` + +*6)* `${parameter/glob/string}` replaces the first matching occurrence with the given replacement string and `${parameter//glob/string}` will replace all the matching occurrences. You can leave out the `/string` portion when you want to delete the matching occurrences. The `glob` will match the longest portion, similar to greedy behavior in regular expressions. Here are some examples: + +```bash +$ ip='this is a sample string' + +# first occurrence of 'is' is replaced with '123' +$ echo "${ip/is/123}" +th123 is a sample string +# all occurrences of 'is' are replaced with '123' +$ echo "${ip//is/123}" +th123 123 a sample string + +# replace all occurrences of 'am' or 'in' with '-' +$ echo "${ip//@(am|in)/-}" +this is a s-ple str-g + +# matches from the first 'is' to the last 's' in the input +$ echo "${ip/is*s/ X }" +th X tring + +# deletes first occurrence of 's' +$ echo "${ip/s}" +thi is a sample string +# deletes all occurrences of 's' +$ echo "${ip//s}" +thi i a ample tring +``` + +*7)* You can use `${parameter/#glob/string}` to match only at the start of the string and `${parameter/%glob/string}` to match only at the end of the string. + +```bash +$ ip='spare' + +# remove only from the start of the string +$ echo "${ip/#sp}" +are +$ echo "${ip/#par}" +spare +# example with replacement string +$ echo "${ip/#sp/fl}" +flare + +# remove only from the end of the string +$ echo "${ip/%re}" +spa +$ echo "${ip/%par}" +spare +``` + +*8)* `${parameter^glob}` can change only the first character to uppercase if matched by the glob. `${parameter^^glob}` changes all the matching characters to uppercase (anywhere in the input string). You should provide a glob that only matches one character in length. If the glob is omitted, entire parameter will be matched. These rules also apply to the lowercase and swap case versions discussed later. + +```bash +$ fruit='apple' + +# uppercase the first character +$ echo "${fruit^}" +Apple +# uppercase the entire parameter +$ echo "${fruit^^}" +APPLE + +# first character doesn't match the 'g-z' range, so no change +$ echo "${fruit^[g-z]}" +apple +# uppercase all letters in the 'g-z' range +$ echo "${fruit^^[g-z]}" +aPPLe +# uppercase all letters in the 'a-e' or 'j-m' ranges +$ echo "${fruit^^[a-ej-m]}" +AppLE + +# this won't work since 'sky-' is not a single character +$ color='sky-rose' +$ echo "${color^^*-}" +sky-rose +``` + +*9)* To change the characters to lowercase, use `,` and `,,` as shown below: + +```bash +$ fruit='APPLE' + +$ echo "${fruit,}" +aPPLE +$ echo "${fruit,,}" +apple + +$ echo "${fruit,,[G-Z]}" +ApplE +``` + +*10)* To swap case, use `~` and `~~` as shown below. Note that this seems to be deprecated, since it is no longer mentioned in the `bash` manual. + +```bash +$ fruit='aPPle' + +# swap case only for the first character +$ echo "${fruit~}" +APPle +# swap case for all the characters +$ echo "${fruit~~}" +AppLE + +# swap case for characters matching the given character set +$ echo "${fruit~~[g-zG-Z]}" +appLe +``` + +>![info](images/info.svg) See [bash manual: Shell Parameter Expansion](https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion) for more details and other types of expansions. + +## Command Line Arguments + +Command line arguments passed to a script (or a function) are saved in positional parameters starting with `1`, `2`, `3` etc. `0` contains the name of the shell or shell script. `@` contains all the positional parameters starting from `1`. Use `#` to get the number of positional parameters. Similar to variables, you need to use a `$` prefix to get the value stored in these parameters. If the parameter number requires more than a single digit, you have to necessarily enclose them in `{}` (for example, `${12}` to get the value of the twelfth parameter). + +Here's an example script that accepts two arguments: + +```bash +$ cat command_line_arguments.sh +echo "No. of lines in '$1' is $(wc -l < "$1")" +echo "No. of lines in '$2' is $(wc -l < "$2")" + +$ seq 12 > 'test file.txt' + +$ bash command_line_arguments.sh hello.sh test\ file.txt +No. of lines in 'hello.sh' is 5 +No. of lines in 'test file.txt' is 12 +``` + +**Further Reading** + +* [unix.stackexchange: shell script choking on whitespace or other special characters](https://unix.stackexchange.com/q/131766/109046) +* [bash manual: Special Parameters](https://www.gnu.org/software/bash/manual/bash.html#Special-Parameters) + +## Conditional Expressions + +You can test a condition within `[[` and `]]` to get a success (`0`) or failure (`1` or higher) exit status and take action accordingly. Bash provides several options and operators that you can use. Space is required after `[[` and before `]]` for this compound command to function. + +>![info](./images/info.svg) Operators `;`, `&&` and `||` will be used in this section to keep the examples terser. `if-else` and other control structures will be discussed later. + +### Options + +The `-e` option checks if the given path argument exists or not. Add a `!` prefix to negate the condition. + +```bash +# change to the 'example_files/shell_scripting' directory for this section + +$ [[ -e hello.sh ]] && echo 'found' || echo 'not found' +found + +$ [[ -e xyz.txt ]] && echo 'found' || echo 'not found' +not found + +# exit status +$ [[ -e hello.sh ]] ; echo $? +0 +$ [[ -e xyz.txt ]] ; echo $? +1 +$ [[ ! -e xyz.txt ]] ; echo $? +0 +``` + +You can use `-d` and `-f` to check if the path is a valid directory and file respectively. The `-s` option checks if the file exists and its size is greater than zero. The `-x` option checks if the file exists and is executable. See `help test` and [bash manual: Conditional Expressions](https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions) for a complete list of such options. + +### String comparisons + +* `s1 = s2` or `s1 == s2` checks if two strings are equal + * unquoted portions of `s2` will be treated as a wildcard while testing against `s1` + * `extglob` would be considered as enabled for such comparisons +* `s1 != s2` checks if strings are *not* equal + * unquoted portions of `s2` will be treated as a wildcard while testing against `s1` + * `extglob` would be considered as enabled for such comparisons +* `s1 < s2` checks if `s1` sorts before `s2` lexicographically +* `s1 > s2` checks if `s1` sorts after `s2` lexicographically +* `s1 =~ s2` checks if `s1` matches the POSIX extended regular expression provided by `s2` + * exit status will be `2` if `s2` is not a valid regexp + +Here are some examples for equal and not-equal comparisons: + +```bash +$ fruit='apple' +$ [[ $fruit == 'apple' ]] && echo 'true' || echo 'false' +true +$ [[ $fruit == 'banana' ]] && echo 'true' || echo 'false' +false + +# glob should be constructed to match the entire string +$ [[ hello == h* ]] && echo 'true' || echo 'false' +true +# don't quote the glob! +$ [[ hello == 'h*' ]] && echo 'true' || echo 'false' +false + +# another example to emphasize that the glob should match the entire string +$ [[ hello == e*o ]] && echo 'true' || echo 'false' +false +$ [[ hello == *e*o ]] && echo 'true' || echo 'false' +true + +$ [[ hello != *a* ]] && echo 'true' || echo 'false' +true +$ [[ hello != *e* ]] && echo 'true' || echo 'false' +false +``` + +Here are some examples for greater-than and less-than comparisons: + +```bash +$ [[ apple < banana ]] && echo 'true' || echo 'false' +true +$ [[ par < part ]] && echo 'true' || echo 'false' +true + +$ [[ mango > banana ]] && echo 'true' || echo 'false' +true +$ [[ sun > moon && fig < papaya ]] && echo 'true' || echo 'false' +true + +# don't use this to compare numbers! +$ [[ 20 > 3 ]] && echo 'true' || echo 'false' +false +# -gt and other such operators will be discussed later +$ [[ 20 -gt 3 ]] && echo 'true' || echo 'false' +true +``` + +Here are some examples for regexp comparison. You can use the special array `BASH_REMATCH` to retrieve specific portions of the string that was matched. Index `0` gives entire matched portion, `1` gives the portion matched by the first capture group and so on. + +```bash +$ fruit='apple' +$ [[ $fruit =~ ^a ]] && echo 'true' || echo 'false' +true +$ [[ $fruit =~ ^b ]] && echo 'true' || echo 'false' +false + +# entire matched portion +$ [[ $fruit =~ a.. ]] && echo "${BASH_REMATCH[0]}" +app +# portion matched by the first capture group +$ [[ $fruit =~ a(..) ]] && echo "${BASH_REMATCH[1]}" +pp +``` + +### Numeric comparisons + +* `n1 -eq n2` checks if two numbers are equal +* `n1 -ne n2` checks if two numbers are *not* equal +* `n1 -gt n2` checks if `n1` is greater than `n2` +* `n1 -ge n2` checks if `n1` is greater than or equal to `n2` +* `n1 -lt n2` checks if `n1` is less than `n2` +* `n1 -le n2` checks if `n1` is less than or equal to `n2` + +Only positive or negative integer comparisons are supported by these operators. + +```bash +$ [[ 20 -gt 3 ]] && echo 'true' || echo 'false' +true + +$ n1='42' +$ n2='25' +$ [[ $n1 -gt 30 && $n2 -lt 12 ]] && echo 'true' || echo 'false' +false +``` + +Numeric arithmetic operations and comparisons can also be performed within the `((` and `))` compound command. Here are some sample comparisons: + +```bash +$ (( 20 > 3 )) && echo 'true' || echo 'false' + +$ n1='42' +$ n2='25' +$ (( n1 > 30 && n2 < 12 )) && echo 'true' || echo 'false' +false +``` + +>![info](images/info.svg) Note that the `$` prefix was *not* used for variables in the above example. See [bash manual: Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) for more details. + +## Accepting user input interactively + +You can use the `read` builtin command to accept input from the user interactively. If multiple variables are given as arguments to the `read` command, values will be assigned based on whitespace separation by default. Any pending values will be assigned to the last variable. Here are some examples: + +```bash +# press 'Enter' after the 'read' command +# and also after you've finished entering the input +$ read color +light green +$ echo "$color" +light green + +# example with multiple variables +$ read fruit qty +apple 10 +$ echo "${fruit}: ${qty}" +apple: 10 +``` + +The `-p` option helps you to add a user prompt. Here is an example of getting two arguments from the user: + +```bash +$ cat user_input.sh +read -p 'Enter two integers separated by spaces: ' num1 num2 +sum=$(( num1 + num2 )) +echo "$num1 + $num2 = $sum" + +$ bash user_input.sh +Enter two integers separated by spaces: -2 42 +-2 + 42 = 40 +``` + +>![info](images/info.svg) You can use the `-a` option to assign an array, the `-d` option to specify a custom delimiter instead of newline and so on. See `help read` and [bash manual: Builtins](https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins) for more details. + +## if then else + +The keywords needed to construct an `if` control structure are `if`, `then`, `fi` and optionally `else` and `elif`. You can use compound commands like `[[` and `((` to provide the test condition. You can also directly use a command's exit status. Here's an example script: + +```bash +$ cat if_then_else.sh +if (( $# != 1 )) ; then + echo 'Error! One file argument expected.' 1>&2 + exit 1 +else + if [[ ! -f $1 ]] ; then + printf 'Error! %q is not a valid file\n' "$1" 1>&2 + exit 1 + else + echo "No. of lines in '$1' is $(wc -l < "$1")" + fi +fi +``` + +`1>&2` is used in the above script to redirect error messages to the `stderr` stream. Sample script invocations are shown below: + +```bash +$ bash if_then_else.sh +Error! One file argument expected. +$ echo $? +1 + +$ bash if_then_else.sh xyz.txt +Error! xyz.txt is not a valid file +$ echo $? +1 + +$ bash if_then_else.sh hello.sh +No. of lines in 'hello.sh' is 5 +$ echo $? +0 +``` + +Sometimes you just need to know if the intended command operation was successful or not and then take an action depending on the outcome. In such cases, you can provide the command directly after the `if` keyword. Note that `stdout` and `stderr` of the command will still be active unless redirected or suppressed using appropriate options. + +For example, the `grep` command supports `-q` option to suppress `stdout`. Here's a script using that feature: + +```bash +$ cat search.sh +read -p 'Enter a search pattern: ' search + +if grep -q "$search" hello.sh ; then + echo "match found" +else + echo "match not found" +fi +``` + +Sample invocations for the above script: + +```bash +$ bash search.sh +Enter a search pattern: echo +match found + +$ bash search.sh +Enter a search pattern: xyz +match not found +``` + +## for loop + +To construct a `for` loop, you'll need the `for`, `do` and `done` keywords. Here are some examples: + +```bash +# iterate over numbers generated using brace expansion +$ for num in {2..4}; do echo "$num"; done +2 +3 +4 + +# iterate over files matched using wildcards +# echo is used here for dry run testing +$ for file in [gh]*.sh; do echo mv "$file" "$file.bkp"; done +mv greeting.sh greeting.sh.bkp +mv hello.sh hello.sh.bkp +``` + +As seen in the above examples, the space separated arguments provided after the `in` keyword are automatically assigned to the variable provided after the `for` keyword during each iteration. + +Here's a modified example of the last example that accepts user provided command line arguments: + +```bash +$ cat for_loop.sh +for file in "$@"; do + echo mv "$file" "$file.bkp" +done + +$ bash for_loop.sh [gh]*.sh +mv greeting.sh greeting.sh.bkp +mv hello.sh hello.sh.bkp + +$ bash for_loop.sh report.log ip.txt fruits.txt +mv report.log report.log.bkp +mv ip.txt ip.txt.bkp +mv fruits.txt fruits.txt.bkp +``` + +Here's an example of iterating over an array: + +```bash +$ files=('report.log' 'pass_list.txt') +$ for f in "${files[@]}"; do echo "$f"; done +report.log +pass_list.txt +``` + +>![info](images/info.svg) You can use `continue` and `break` to alter the loop flow depending on specific conditions. See [bash manual: Bourne Shell Builtins](https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins) for more details. + +>![info](./images/info.svg) `for file;` is same as `for file in "$@";` since `in "$@"` is the default. I'd recommend using the explicit version. + +## while loop + +Here's a simple `while` loop construct. You'll see a more practical example later in this chapter. + +```bash +$ cat while_loop.sh +i="$1" +while (( i > 0 )) ; do + echo "$i" + (( i-- )) +done + +$ bash while_loop.sh 3 +3 +2 +1 +``` + +## Reading a file + +The `while` loop combined with the `read` builtin helps you to process the content of a file. Here's an example of reading input contents line by line: + +```bash +$ cat read_file_lines.sh +while IFS= read -r line; do + # do something with each line + wc -l "$line" +done < "$1" + +$ printf 'hello.sh\ngreeting.sh\n' > files.txt +$ bash read_file_lines.sh files.txt +5 hello.sh +2 greeting.sh +``` + +The intention in the above script is to treat each input line literally. So, the `IFS` special variable is set to empty string to prevent stripping of leading and trailing whitespaces. The `-r` option to the `read` builtin allows `\` in input to be treated literally. Note that the input filename is accepted as the first command line argument and redirected as `stdin` to the `while` loop. You also need to make sure that the last line of input ends with a newline character, otherwise the last line won't be processed. + +You can change `IFS` to split the input line into different fields and specify appropriate number of variables to the `read` builtin. Here's an example: + +```bash +$ cat read_file_fields.sh +while IFS=' : ' read -r field1 field2; do + echo "$field2,$field1" +done < "$1" + +$ bash read_file_fields.sh <(printf 'apple : 3\nfig : 100\n') +3,apple +100,fig +``` + +You can pass a number to the `-n` option for the `read` builtin to process the input that many characters at a time. Here's an example: + +```bash +$ while read -r -n2 ip; do echo "$ip"; done <<< '\word' +\w +or +d +``` + +>![info](./images/info.svg) The `xargs` command can also be used for some of the cases discussed above. See [unix.stackexchange: parse each line of a text file as a command argument](https://unix.stackexchange.com/q/149726/109046) for an example. + +## Functions + +From [bash manual: Shell Functions](https://www.gnu.org/software/bash/manual/bash.html#Shell-Functions): + +>Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like a "regular" command. When the name of a shell function is used as a simple command name, the list of commands associated with that function name is executed. Shell functions are executed in the current shell context; no new process is created to interpret them. + +You can use either of the syntax shown below to declare functions: + +```bash +fname () compound-command [ redirections ] + +function fname [()] compound-command [ redirections ] +``` + +Arguments to functions are passed in the same manner as those discussed earlier for shell scripts. Here's an example: + +```bash +$ cat functions.sh +add_border () +{ + size='10' + color='grey' + if (( $# == 1 )) ; then + ip="$1" + elif (( $# == 2 )) ; then + if [[ $1 =~ ^[0-9]+$ ]] ; then + size="$1" + else + color="$1" + fi + ip="$2" + else + size="$1" + color="$2" + ip="$3" + fi + + op="${ip%.*}_border.${ip##*.}" + echo convert -border "$size" -bordercolor "$color" "$ip" "$op" +} + +add_border flower.png +add_border 5 insect.png +add_border red lake.png +add_border 20 blue sky.png +``` + +In the above example, `echo` is used to display the command that will be executed. Remove `echo` if you want this script to actually create new images with the given parameters. The function accepts one to three arguments and uses default values when some of the arguments are not passed. Here's the output: + +```bash +$ bash functions.sh +convert -border 10 -bordercolor grey flower.png flower_border.png +convert -border 5 -bordercolor grey insect.png insect_border.png +convert -border 10 -bordercolor red lake.png lake_border.png +convert -border 20 -bordercolor blue sky.png sky_border.png +``` + +>![info](images/info.svg) Use `mogrify` instead of `convert` if you want to modify the input image inplace instead of creating a new image. These image manipulation commands are part of the [ImageMagick](https://imagemagick.org/) suite. As an exercise, modify the above function to generate error if the arguments passed do not match the expected usage. You can also accept output image name (or perhaps a different suffix) as an additional argument. + +The shell script and user defined functions (which in turn might call itself or another function) can both have positional arguments. In such cases, the shell takes cares of restoring positional arguments to the earlier state once a function completes its tasks. + +Functions have exit status as well, which is based on the last executed command by default. You can use the `return` builtin to provide your own custom exit status. + +## Debugging + +You can use the following `bash` options for debugging purposes: + +* `-x` print commands and their arguments as they are executed +* `-v` verbose option, print shell input lines as they are read + +Here's an example with `bash -x` option: + +```bash +$ bash -x search.sh ++ read -p 'Enter a search pattern: ' search +Enter a search pattern: xyz ++ grep -q xyz hello.sh ++ echo 'match not found' +match not found +``` + +The lines starting with `+` show the command being executed with expanded values if applicable (the `search` variable to `grep -q` for example). Multiple `+` will be used if there are multiple expansions. Here's how `bash -xv` would behave for the same script: + +```bash +$ bash -xv search.sh +read -p 'Enter a search pattern: ' search ++ read -p 'Enter a search pattern: ' search +Enter a search pattern: xyz + +if grep -q "$search" hello.sh ; then + echo "match found" +else + echo "match not found" +fi ++ grep -q xyz hello.sh ++ echo 'match not found' +match not found +``` + +>![info](images/info.svg) You can also use `set -x` or `set -v` or `set -xv` from within the script to debug from a particular point onwards. You can turn off such debugging by using `+` instead of `-` as the option prefix (for example, `set +x`). + +## shellcheck + +[shellcheck](https://www.shellcheck.net/) is a static analysis tool that gives warnings and suggestions for scripts. You can use it online or install the tool for offline use. Given the various `bash` gotchas, this tool is highly recommended for both beginners and advanced users. + +Consider this script: + +```bash +$ cat bad_script.sh +#!/bin/bash + +greeting = 'hello world' +echo "$greeting" +``` + +Here's how `shellcheck` reports the issue: + +```abc +$ shellcheck bad_script.sh + +In bad_script.sh line 3: +greeting = 'hello world' + ^-- SC1068: Don't put spaces around the = in assignments + (or quote to make it literal). + +For more information: + https://www.shellcheck.net/wiki/SC1068 -- Don't put spaces around the = in ... +``` + +>![info](images/info.svg) Use the `-s` option (`shellcheck -s bash` for example) to specify the shell being used, if the script doesn't have a shebang. + +>![info](images/info.svg) ![warning](./images/warning.svg) Note that `shellcheck` will not catch all types of issues. And suggestions should not be blindly accepted without understanding if that makes sense in the given context. + +## Resource lists + +Here are some more learning resources: + +**Shell Scripting** + +* [Bash Guide](https://mywiki.wooledge.org/BashGuide) — aspires to teach good practice techniques for using Bash, and writing simple scripts +* [Bash Scripting Tutorial](https://ryanstutorials.net/bash-scripting-tutorial/) — solid foundation in how to write Bash scripts, to get the computer to do complex, repetitive tasks for you +* [bash-handbook](https://github.com/denysdovhan/bash-handbook) — for those who want to learn Bash without diving in too deeply +* [Serious Shell Programming](https://freebsdfrau.gitbook.io/serious-shell-programming/) — focuses on POSIX-compliant Bourne Shell for portability + +**Handy tools, tips and reference** + +* [shellcheck](https://www.shellcheck.net/) — linting tool to avoid common mistakes and improve your script +* [Bash reference cheatsheet](https://devmanual.gentoo.org/tools-reference/bash/index.html) — nicely formatted and explained well +* [Bash scripting cheatsheet](https://devhints.io/bash) — quick reference to getting started with Bash scripting +* Comprehensive lists on `mywiki.wooledge.org` website: + * [Bash FAQ](https://mywiki.wooledge.org/BashFAQ) + * [Bash Practices](https://mywiki.wooledge.org/BashGuide/Practices) + * [Bash Pitfalls](https://mywiki.wooledge.org/BashPitfalls) +* [Google shell style guide](https://google.github.io/styleguide/shellguide.html) +* Reliability and robustness + * [safe ways to do things in bash](https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md) + * [better scripting](https://robertmuth.blogspot.in/2012/08/better-bash-scripting-in-15-minutes.html) + * [robust scripting](https://www.davidpashley.com/articles/writing-robust-shell-scripts/) + +**Specific topics** + +* Reading file(s) + * [Reading file](https://mywiki.wooledge.org/BashFAQ/001) + * [Loop through the lines of two files in parallel](https://unix.stackexchange.com/q/82541/109046) +* [arrays](https://mywiki.wooledge.org/BashGuide/Arrays) +* [nameref](https://unix.stackexchange.com/q/288886/109046) + * also see this [FAQ](https://mywiki.wooledge.org/BashFAQ/006) +* getopts + * [getopts tutorial](https://wiki.bash-hackers.org/howto/getopts_tutorial) + * [handling command-line arguments](https://mywiki.wooledge.org/BashFAQ/035) + * [stackoverflow: getopts example](https://stackoverflow.com/q/16483119/4082052) +* [Sending and Trapping Signals](https://mywiki.wooledge.org/SignalTrap) + +## Exercises + +>![info](./images/info.svg) Use a temporary working directory before attempting the exercises. You can delete such practice directories afterwards. + +**1)** What's wrong with the script shown below? Also, will the error go away if you use `bash try.sh` instead? + +```bash +$ printf ' \n!#/bin/bash\n\necho hello\n' > try.sh +$ chmod +x try.sh +$ ./try.sh +./try.sh: line 2: !#/bin/bash: No such file or directory +hello + +# expected output +$ ./try.sh +hello +``` + +**2)** Will the command shown below work? If so, what would be the output? + +```bash +$ echo echo hello | bash +``` + +**3)** When would you `source` a script instead of using `bash` or creating an executable using shebang? + +**4)** How would you display the contents of a variable with `shake` appended? + +```bash +$ fruit='banana' + +$ echo # ??? +bananashake +``` + +**5)** What changes would you make to the code shown below to get the expected output? + +```bash +# default behavior +$ n=100 +$ n+=100 +$ echo "$n" +100100 + +# expected output +$ echo "$n" +200 +``` + +**6)** Is the following code valid? If so, what would be the output of the `echo` command? + +```bash +$ declare -a colors +$ colors[3]='green' +$ colors[1]='blue' + +$ echo "${colors[@]}" +# ??? +``` + +**7)** How would you get the last three characters of a variable's contents? + +```bash +$ fruit='banana' + +# ??? +ana +``` + +**8)** Will the second `echo` command give an error? If not, what will be the output? + +```bash +$ fruits=('apple' 'fig' 'mango') +$ echo "${#fruits[@]}" +3 + +$ echo "${#fruits}" +# ??? +``` + +**9)** For the given array, use parameter expansion to remove characters until first/last space. + +```bash +$ colors=('green' 'dark brown' 'deep sky blue white') + +# remove till first space +$ printf '%s\n' # ??? +green +brown +sky blue white + +# remove till last space +$ printf '%s\n' # ??? +green +brown +white +``` + +**10)** Use parameter expansion to get the expected outputs shown below. + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo # ??? +apple:banana:cherry + +$ echo # ??? +apple +``` + +**11)** Is it possible to achieve the expected outputs shown below using parameter expansion? If so, how? + +```bash +$ ip='apple:banana:cherry:dragon' + +$ echo # ??? +apple 42 dragon + +$ echo # ??? +fig:banana:cherry:dragon + +$ echo # ??? +apple:banana:cherry:end +``` + +**12)** For the given input, change case as per the expected outputs shown below. + +```bash +$ ip='This is a Sample STRING' + +$ echo # ??? +THIS IS A SAMPLE STRING + +$ echo # ??? +this is a sample string + +$ echo # ??? +tHIS IS A sAMPLE string +``` + +**13)** Why does the conditional expression shown below fail? + +```bash +$ touch ip.txt +$ [[-f ip.txt]] && echo 'file exists' +[[-f: command not found +``` + +**14)** What is the difference between `==` and `=~` string comparison operators? + +**15)** Why does the conditional expression used below show `failed` both times? Modify the expressions such that the first one correctly says `matched` instead of `failed`. + +```bash +$ f1='1234.txt' +$ f2='report_2.txt' + +$ [[ $f1 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed +$ [[ $f2 == '+([0-9]).txt' ]] && echo 'matched' || echo 'failed' +failed +``` + +**16)** Extract the digits that follow a `:` character for the given variable contents. + +```bash +$ item='chocolate:50' +# ??? +50 + +$ item='50 apples, fig:100, books-12' +# ??? +100 +``` + +**17)** Modify the expression shown below to correctly report `true` instead of `false`. + +```bash +$ num=12345 +$ [[ $num > 3 ]] && echo 'true' || echo 'false' +false +``` + +**18)** Write a shell script named `array.sh` that accepts array input from the user followed by another input as index. Display the corresponding value at that index. Couple of examples are shown below. + +```bash +$ bash array.sh +enter array elements: apple banana cherry +enter array index: 1 +element at index '1' is: banana + +$ bash array.sh +enter array elements: dragon unicorn centaur +enter array index: -1 +element at index '-1' is: centaur +``` + +**19)** Write a shell script named `case.sh` that accepts exactly two command line arguments. The first argument can be `lower`, `upper` or `swap` and this should be used to transform the contents of the second argument. Examples script invocations are shown below, including what should happen if the command line arguments do not meet the script expectations. + +```bash +$ ./case.sh upper 'how are you?' +HOW ARE YOU? + +$ ./case.sh lower PineAPPLE +pineapple + +$ ./case.sh swap 'HeLlo WoRlD' +hElLO wOrLd + +$ ./case.sh lower +Error! Two arguments expected. +$ echo $? +1 + +$ ./case.sh upper apple fig +Error! Two arguments expected. + +$ ./case.sh lowercase DRAGON +Error! 'lowercase' command not recognized. +$ echo $? +1 + +$ ./case.sh apple lower 2> /dev/null +$ echo $? +1 +``` + +**20)** Write a shell script named `loop.sh` that displays the number of lines for each of the files passed as command line arguments. + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt + +$ bash loop.sh items_1.txt +number of lines in 'items_1.txt' is: 3 + +$ bash loop.sh items_1.txt items_2.txt +number of lines in 'items_1.txt' is: 3 +number of lines in 'items_2.txt' is: 5 +``` + +**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? + +```bash +$ printf 'apple\nbanana\ncherry\n' > items_1.txt +$ printf 'dragon\nowl\nunicorn\ntroll\ncentaur\n' > items_2.txt +$ printf 'items_1.txt\nitems_2.txt\n' > list.txt + +$ bash read_file.sh list.txt +apple,banana,cherry +dragon,owl,unicorn,troll,centaur + +$ xargs # ??? +apple,banana,cherry +dragon,owl,unicorn,troll,centaur +``` + +**22)** Write a function named `add_path` which prefixes the path of the current working directory to the arguments it receives and displays the results. Examples are shown below. + +```bash +$ add_path() # ??? + +$ cd +$ pwd +/home/learnbyexample +$ add_path ip.txt report.log +/home/learnbyexample/ip.txt /home/learnbyexample/report.log + +$ cd cli-computing +$ pwd +/home/learnbyexample/cli-computing +$ add_path f1 +/home/learnbyexample/cli-computing/f1 +``` + +**23)** What do the options `bash -x` and `bash -v` do? + +**24)** What is `shellcheck` and when would you use it? + +# Shell Customization + +This chapter will discuss some of the `bash` features that you can use to customize the command line environment. + +## Environment Variables + +From [wikipedia: Environment variable](https://en.wikipedia.org/wiki/Environment_variable): + +>An environment variable is a dynamic-named value that can affect the way running processes will behave on a computer. They are part of the environment in which a process runs. For example, a running process can query the value of the TEMP environment variable to discover a suitable location to store temporary files, or the HOME or USERPROFILE variable to find the directory structure owned by the user running the process. + +See [bash manual: Shell Variables](https://www.gnu.org/software/bash/manual/bash.html#Shell-Variables) for complete list of `bash` variables. Some of them are presented below and some (`HISTCONTROL` for example) will be discussed later in this chapter. + +* `HOME` The current user's home directory; the default for the `cd` builtin command. The value of this variable is also used by tilde expansion +* `PS1` The primary prompt string. The default value is `\s-\v\$ ` +* `PS2` The secondary prompt string. The default value is `> ` +* `PATH` A colon-separated list of directories in which the shell looks for commands. A zero-length (null) directory name in the value of `PATH` indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon +* `PWD` The current working directory as set by the `cd` builtin +* `OLDPWD` The previous working directory as set by the `cd` builtin +* `SHELL` This environment variable expands to the full pathname to the shell + +You can use the `printenv` command to display the name and value of all the environment variables. Providing arguments will display the values only for those variables. + +```bash +$ printenv SHELL PWD HOME +/bin/bash +/home/learnbyexample/cli-computing +/home/learnbyexample +``` + +>![info](images/info.svg) ![warning](images/warning.svg) It is recommended to use lowercase for user defined variable names to avoid potential conflict with environment variables. You might have noticed that I used only lowercase names in the [Shell Scripting](#shell-scripting) chapter. + +>![info](./images/info.svg) See also [unix.stackexchange: How to correctly add a path to PATH?](https://unix.stackexchange.com/q/26047/109046). + +## Aliases and Functions + +To create an alias, use the appropriately named `alias` command. Without any arguments, it will list all the currently defined aliases. If you want to know what an existing alias does, provide one or more names as arguments. To actually create an alias, give a name, followed by `=` and then the command to be aliased. There should be no spaces around the `=` operator. Use `type name` to check if that name is already taken by some command. Here are some examples: + +```bash +# mapping 'p' to the 'pwd' command +$ type p +bash: type: p: not found +$ alias p='pwd' +$ p +/home/learnbyexample/cli-computing + +# adding '--color=auto' to 'ls' invocation +$ type -a ls +ls is /bin/ls +$ alias ls='ls --color=auto' +$ type -a ls +ls is aliased to 'ls --color=auto' +ls is /bin/ls +``` + +Here's how you can check what the above aliases do: + +```bash +$ alias p ls +alias p='pwd' +alias ls='ls --color=auto' +``` + +>![info](./images/info.svg) As seen above, aliases have higher precedence compared to commands in the PATH. You can use a `\` prefix (for example `\ls`) if you want to avoid an alias and use the original command. You can also use `command ls` instead of the escape character. + +If you need to pass arguments to your custom commands, use a function (or write a shell script). Here's an example function: + +```bash +# prefix current path to the given arguments +$ ap() { for f in "$@"; do echo "$PWD/$f"; done; } + +$ p +/home/learnbyexample +$ ap ip.txt mountain.jpg +/home/learnbyexample/ip.txt +/home/learnbyexample/mountain.jpg +``` + +>![info](./images/info.svg) The aliases and functions created above will be valid only for that particular shell session. To load these shortcuts automatically, you need to add them to special files. See the next section for details. + +You can use the `unalias` command to remove an alias. For functions, use the `unset -f` command. + +```bash +$ unalias p + +$ unset -f ap + +$ type p ap +bash: type: p: not found +bash: type: ap: not found +``` + +## Config files + +You can add customizations to special configuration files so that those settings are automatically loaded when you start an interactive shell session. + +### .bashrc + +From [bash manual: Startup Files](https://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files): + +>When an interactive shell that is not a login shell is started, Bash reads and executes commands from `~/.bashrc`, if that file exists. + +You'll likely have a `~/.bashrc` file provided by the Linux distro you've installed, with useful settings like enabling `bash` programmable completion features, aliases and so on. I leave the distro provided settings alone, unless they are related to aliases and shell options that I want to customize. + +Some of the `shopt` customizations I use are shown below. `shopt` was discussed briefly in the [Shell Features](#shell-features) chapter. See [bash manual: Shopt Builtin](https://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin) for more details. + +```bash +# append to history file instead of overwriting +shopt -s histappend + +# extended wildcard functionality +shopt -s extglob + +# helps to recursively match files within a specified path +shopt -s globstar +``` + +I prefer a simple prompt `PS1='$ '` instead of fancy colors. See [bash manual: Controlling the Prompt](https://www.gnu.org/software/bash/manual/bash.html#Controlling-the-Prompt) for customization options. You can use [bashrcgenerator](https://bashrcgenerator.com/) to easily generate fancy prompts. See also [starship](https://starship.rs/) which is a minimal, blazing-fast, and infinitely customizable prompt for any shell. + +Some history customizations are shown below. See [bash manual: History Facilities](https://www.gnu.org/software/bash/manual/bash.html#Bash-History-Facilities) for more details. See also [unix.stackexchange: common history across sessions](https://unix.stackexchange.com/q/18212/109046). + +```bash +# ignorespace prevents lines starting with space from being saved in history +# erasedups deletes previous history entries matching the current one +HISTCONTROL=ignorespace:erasedups + +# maximum number of history lines in the current shell session +# older entries will be overwritten if the size is exceeded +# use negative number for unlimited size +HISTSIZE=2000 + +# maximum number of lines in the history file +HISTFILESIZE=2000 +``` + +For aliases and functions, I use a separate file named `~/.bash_aliases` to reduce clutter in the `.bashrc` file. This is not a file that is loaded automatically, so you need to add `source ~/.bash_aliases` command in the `.bashrc` file. + +Some of my favorite aliases and functions are shown below. See my [.bash_aliases file](https://github.com/learnbyexample/scripting_course/blob/master/.bash_aliases) for more. + +```bash +alias c='clear' +alias p='pwd' +alias e='exit' + +alias c1='cd ../' +alias c2='cd ../../' +alias c3='cd ../../../' + +alias ls='ls --color=auto' +alias l='ls -ltrh' +alias la='l -A' + +alias grep='grep --color=auto' + +# save last command in history to a reference file +alias sl='fc -ln -1 | sed "s/^\s*//" >> ~/.saved_cmds.txt' +alias slg='< ~/.saved_cmds.txt grep' + +# case insensitive file search +# fs foo is same as find -iname '*foo*' +fs() { find -iname '*'"$1"'*' ; } +``` + +>![info](images/info.svg) You can use `source` with `.bashrc` or `.bash_aliases` files as arguments to apply changes from such files to the current shell session. + +### .inputrc + +You can add custom key bindings to the `~/.inputrc` file. See [bash manual: Readline Init File](https://www.gnu.org/software/bash/manual/bash.html#Readline-Init-File) for more details. + +A few examples from my `~/.inputrc` file are shown below: + +```bash +$ cat ~/.inputrc +# use up/down arrow to match history based on starting text of the command +"\e[A": history-search-backward +"\e[B": history-search-forward + +# ignore case for filename matching and completion +set completion-ignore-case on + +# single Tab press will complete if there's only one match +# multiple completions will be displayed otherwise +set show-all-if-ambiguous on +``` + +>![info](images/info.svg) You can use `bind -f ~/.inputrc` or press `Ctrl+x Ctrl+r` to apply changes from the `.inputrc` file to the current shell session. + +### Further Reading + +* [Sensible bash customizations](https://mrzool.cc/writing/sensible-bash/) +* [Shell config subfiles](https://blog.sanctum.geek.nz/shell-config-subfiles/) +* [unix.stackexchange: when to use alias, functions and scripts](https://unix.stackexchange.com/q/30925/109046) +* [unix.stackexchange: what does rc in bashrc stand for](https://unix.stackexchange.com/q/3467/109046) + +## Readline shortcuts + +Quoting from [bash manual: Readline Interaction](https://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction): + +>Often during an interactive session you type in a long line of text, only to notice that the first word on the line is misspelled. The Readline library gives you a set of commands for manipulating the text as you type it in, allowing you to just fix your typo, and not forcing you to retype the majority of the line. Using these editing commands, you move the cursor to the place that needs correction, and delete or insert the text of the corrections. + +By default, command line editing bindings are styled after [Emacs](https://www.gnu.org/software/emacs/) (a text editor). You can switch to Vi mode (another text editor) if you wish. This section will discuss some of the often used Emacs style key bindings. + +### Tab completion + +The tab key helps you complete commands, aliases, filenames and so on, depending on the context. If there is only one possible completion, it will be done on single tab press. Otherwise, you can press the tab key twice to get a list of possible matches (if there are any). + +Use `set show-all-if-ambiguous on` as seen earlier in the [.inputrc](#inputrc) section to combine the single and double tab presses into a single action. + +>![info](./images/info.svg) See [bash manual: Programmable Completion](https://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion) for more details. + +### Searching history + +You can use `Ctrl+r` to search command history. After pressing this key sequence, type characters you wish to match from history, then press the `Esc` key to return to the command prompt or press `Enter` to execute the command. + +You can press `Ctrl+r` repeatedly to move backwards through matching entries and `Ctrl+s` to move forwards. If `Ctrl+s` is not working as expected, see [unix.stackexchange: disable ctrl-s](https://unix.stackexchange.com/q/332791/109046). + +As discussed in the [.inputrc](#inputrc) section, you can use custom key mappings to search based on starting characters of the command. + +### Moving the cursor + +The documentation uses **Meta** (`M-` prefix) and notes that this key is labeled as `Alt` on many keyboards. The documentation also mentions that you can also use the `Esc` key for such combinations. + +* `Alt+b` move the cursor to the start of the current or previous word +* `Alt+f` move the cursor to the end of the next word +* `Ctrl+a` or `Home` move cursor to the beginning of the command line +* `Ctrl+e` or `End` move cursor to the end of the command line + +>![info](./images/info.svg) One difference between `Alt` and `Esc` combinations is that you can keep pressing `b` or `f` while holding the `Alt` key down. The `Esc` combinations are two different key presses, whereas `Alt` has to be kept pressed down for the shortcut to take effect. + +### Deleting characters + +* `Alt+Backspace` (or `Esc+Backspace`) delete backwards up to word boundary +* `Ctrl+w` delete backwards up to whitespace boundary +* `Ctrl+u` delete from the character before the cursor till the start of the line +* `Ctrl+k` delete from the cursor location to the end of the command line + +### Clear screen + +* `Ctrl+l` preserve whatever is typed and clear the terminal screen + +>![info](./images/info.svg) Note that `Ctrl+l` doesn't try to remove the scrollback buffer altogether. Use the `clear` command for that purpose. + +### Swap words and characters + +* `Alt+t` (or `Esc+t`) swap the previous two words +* `Ctrl+t` swap the previous two characters + * for example, if you typed `sp` instead of `ps`, press `Ctrl+t` when the cursor is to the right of `sp` + +### Insert arguments + +* `Alt+.` (or `Esc+.`) insert the last argument from the previous command, multiple presses will traverse through second last command and so on + * for example, if `cat temp.txt` was the last command used, pressing `Alt+.` will insert `temp.txt` + * you can also use `!$` to represent the last argument from the previous command + +### Further Reading + +* [bash manual: Bindable Readline Commands](https://www.gnu.org/software/bash/manual/bash.html#Bindable-Readline-Commands) +* [wiki.archlinux: Simpler introduction to Readline](https://wiki.archlinux.org/title/readline) +* [Efficient command line navigation](https://cupfullofcode.com/blog/2013/07/03/efficient-command-line-navigation/index.html) + +## Copy and paste + +Shortcuts for copy-paste operations in the terminal are shown below. You might be able to customize these shortcuts in terminal preferences. + +* `Shift+Ctrl+c` copy the highlighted portion to the clipboard +* `Shift+Ctrl+v` paste clipboard contents +* `Shift+Insert` paste the last highlighted portion (not necessarily the clipboard contents) + +You can also press middle mouse button instead of the `Shift+Insert` shortcut. This is not limited to the terminal, but works in any application. Use the `xinput` command to enable/disable mouse button clicks. First, use `xinput` without any arguments and spot the number corresponding to your mouse. As an example, assuming the device number is `11`, you can use the following commands: + +* `xinput set-button-map 11 1 0 3` to disable middle button click +* `xinput set-button-map 11 1 2 3` to enable middle button click + +## Exercises + +**1)** Which command would you use to display the name and value of all or specific environment variables? + +**2)** If you add an alias for an already existing command (`ls` for example), how would you invoke the original command instead of the alias? + +**3)** Why doesn't the alias shown below work? What would you use instead? + +```bash +# doesn't work as expected +$ alias ext='echo "${1##*.}"' +$ ext ip.txt + ip.txt + +# expected output +$ ext ip.txt +txt +$ ext scores.csv +csv +$ ext file.txt.txt +txt +``` + +**4)** How would you remove a particular alias/function definition for the current shell session? + +```bash +$ alias hw='echo hello world' +$ hw +hello world +# ??? +$ hw +hw: command not found + +$ hw() { echo hello there ; } +$ hw +hello there +# ??? +$ hw +hw: command not found +``` + +**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. + +```bash +$ echo "$PATH" +/usr/local/bin:/usr/bin:/bin:/usr/games + +# alias +$ a_p +/usr/local/bin +/usr/bin +/bin +/usr/games + +# function +$ f_p +/usr/local/bin +/usr/bin +/bin +/usr/games +``` + +**6)** Will a login shell read and execute `~/.bashrc` automatically? + +**7)** What should be the value assigned to `HISTSIZE` if you wish to have unlimited history entries? + +**8)** What does the binding `set completion-ignore-case on` do? + +**9)** Which shortcut helps you interactively search command history? + +**10)** What do the shortcuts `Alt+b` and `Alt+f` do? + +**11)** Are there differences between the `Ctrl+l` shortcut and the `clear` command? + +**12)** Which shortcut will you use to delete characters before the cursor till the start of the line? + +**13)** What do the shortcuts `Alt+t` and `Ctrl+t` do? + +**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? + From 964962115cd4038bb9859cc53dbc2b6875fa6a41 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Mon, 31 Oct 2022 18:33:49 +0530 Subject: [PATCH 69/76] fixed typos, updated answer descriptions --- exercises/exercise-solutions.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/exercises/exercise-solutions.md b/exercises/exercise-solutions.md index 8aa2c82..3dcf707 100644 --- a/exercises/exercise-solutions.md +++ b/exercises/exercise-solutions.md @@ -33,7 +33,7 @@ I do not much care if it is correct to call it a relative or absolute path. More >`~` is syntax implemented by the shell (and other programs which imitate it for convenience) which expands it into a real pathname. To illustrate, `~/Documents` is approximately the same thing as `$HOME/Documents` (again, shell syntax). Since `$HOME` should be an absolute path, the value of `$HOME/Documents` is also an absolute path. But the text `$HOME/Documents` or `~/Documents` has to be expanded by the shell in order to become the path we mean. -I spent a frustrating few hours trying to debug why one of my [autostart](https://wiki.archlinux.org/title/Autostarting) script wasn't working. Yup, you guessed it. I used `~` while providing a file path. +I spent a frustrating few hours trying to debug why one of my [autostart](https://wiki.archlinux.org/title/Autostarting) script wasn't working. Yup, you guessed it. The issue was using `~` and changing to the full path fixed it. **4)** Which key would you use to get help while the `less` command is active? @@ -310,7 +310,7 @@ quest/ > >ignore nonexistent files and arguments, never prompt -It also helps to remove write protected files (provided you have appropriate permissions to delete those files). +For example, it helps to remove write protected files (provided you have appropriate permissions to delete those files). **18)** Which option would you use to interactively delete files using the `rm` command? @@ -348,7 +348,7 @@ On Ubuntu, you can use `sudo apt install trash-cli` to install the `trash` comma **22)** Does the `cp` command allow you to rename the file or directory being copied? If so, can you rename multiple files/directories being copied? -`cp` allows renaming single file or directory by specifying a different name in the destination path. You can't rename multiple files or directories. +`cp` allows renaming single file or directory by specifying a different name in the destination path. You can't rename multiple files or directories with a single `cp` usage. **23)** What do the `-u`, `-b` and `-t` options of `cp` command do? @@ -1059,6 +1059,7 @@ $ echo "$words" | grep -owE 's\w*(t\w*e|e\w*t)\w*' **11)** Extract all whole words having the same first and last word character. ```bash +# can also use: grep -owE '(\w)(\w*\1)?' $ echo 'oreo not a _oh_ pip roar took 22' | grep -owE '\w|(\w)\w*\1' oreo a @@ -1173,8 +1174,8 @@ $ find -type f -not -name '*[g-l]*' **21)** Find all regular files whose path has at least one directory name starting with `p` or `d`. ```bash -# can also use: find -type f -regex '.*/[pd].*' -$ find -type f -path '*/[pd]*' +# can also use: find -type f -regex '.*/[pd].*/.*' +$ find -type f -path '*/[pd]*/*' ./projects/tictactoe/game.py ./projects/calculator/calc.sh ./backups/dot_files/.bashrc @@ -1194,6 +1195,7 @@ $ find -type d -name '*[bd]*' **23)** Find all hidden directories. ```bash +# can also use: find -mindepth 1 -type d -name '.*' $ find -type d -name '.?*' ./projects/.venv ``` @@ -1742,6 +1744,7 @@ hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c **8)** Replace all whole words with `X` that start and end with the same word character. ```bash +# can also use: sed -E 's/\b(\w)(\w*\1)?\b/X/g' $ echo 'oreo not a _a2_ roar took 22' | sed -E 's/\b(\w|(\w)\w*\2)\b/X/g' X not X X X took X ``` @@ -2615,7 +2618,7 @@ hello **3)** When would you `source` a script instead of using `bash` or creating an executable using shebang? -Using `source` to execute scripts helps when you want to affect the current working environment. +Using `source` to execute scripts helps when you want to work within the current shell environment instead of a sub-shell. **4)** How would you display the contents of a variable with `shake` appended? From 3c615975bdc247c456321a01dd636bf94a7b594f Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 1 Nov 2022 12:05:21 +0530 Subject: [PATCH 70/76] fixed typos, added sample chapters --- cli_computing.md | 76 +++++++++++------------ sample_chapters/cli_computing_sample.pdf | Bin 0 -> 565090 bytes 2 files changed, 38 insertions(+), 38 deletions(-) create mode 100644 sample_chapters/cli_computing_sample.pdf diff --git a/cli_computing.md b/cli_computing.md index dd2b7df..53853a0 100644 --- a/cli_computing.md +++ b/cli_computing.md @@ -565,7 +565,7 @@ There are several shortcuts you can use to be productive at the command line. Th * `Ctrl+k` delete from the current character to the end of the line * `Ctrl+c` abort the currently typed command * `Ctrl+l` clear the terminal screen and move the prompt to the top, any characters typed as part of the current command will be retained -* `↑` and `↓` arrow keys to navigate previously used command history +* `↑` and `↓` arrow keys to navigate previously used commands from the history * `Ctrl+p` and `Ctrl+n` can also be used instead of arrow keys * you can modify the command before executing such lines from the history @@ -726,7 +726,7 @@ $ cd - Relative paths are well, relative to the current working directory: * `.` refers to the current directory -* `..` refers to the directory one hierarchy above +* `..` refers to the directory one hierarchy above (i.e. parent directory) * `../..` refers to the directory two hierarchies above and so on * `cd ./-` will help you to switch to a directory named `-` in the current location * you cannot use `cd -` since that'll take you to the previous working directory @@ -1364,7 +1364,7 @@ $ ls -F backups dot_files/ hello.py loops.py manuals/ projects/ ``` -When you are dealing with a single file or directory, you can also **rename** them: +When you are dealing with a single file or directory, you can also *rename* them: ```bash # within the same directory @@ -1909,7 +1909,7 @@ This chapter focuses on Bash shell features like quoting mechanisms, wildcards, This section will quote (*heh*) the relevant definitions from the [bash manual](https://www.gnu.org/software/bash/manual/bash.html#Quoting) and provide some examples for each of the four mechanisms. -**Escape Character** +*1)* **Escape Character** >A non-quoted backslash `\` is the Bash escape character. It preserves the literal value of the next character that follows, with the exception of newline. > @@ -1944,7 +1944,7 @@ $ ls new*txt $ rm new\ file.txt ``` -**Single Quotes** +*2)* **Single Quotes** >Enclosing characters in single quotes (`'`) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. @@ -1967,7 +1967,7 @@ $ echo '@fruits = '\''apple and banana'\' @fruits = 'apple and banana' ``` -**Double Quotes** +*3)* **Double Quotes** >Enclosing characters in double quotes (`"`) preserves the literal value of all characters within the quotes, with the exception of `$`, `` ` ``, `\`, and, when history expansion is enabled, `!`. @@ -2003,7 +2003,7 @@ $ rm "$f" >![info](./images/info.svg) See also [unix.stackexchange: Why does my shell script choke on whitespace or other special characters?](https://unix.stackexchange.com/q/131766/109046). -**ANSI-C Quoting** +*4)* **ANSI-C Quoting** >Words of the form `$'string'` are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. @@ -2033,7 +2033,7 @@ ball 20 ## Wildcards -It is relatively easy to specify complete filenames as command arguments when they are few in number. And you could use features like tab completion and middle mouse button click (pastes the last highlighted text) to assist in such cases. +It is relatively easy to specify complete filenames as command arguments when they are few in number. And you could use features like tab completion and middle mouse button click (which pastes the last highlighted text) to assist in such cases. But what to do if you have to deal with tens and hundreds of files (or even more)? If applicable, one way is to match all the files based on a common pattern in their filenames, for example extensions like `.py`, `.txt` and so on. Wildcards (globs) will help in such cases. This feature is provided by the shell, and thus individual commands need not worry about implementing them. Pattern matching supported by wildcards are somewhat similar to regular expressions, but there are fundamental and syntactical differences between them. @@ -2042,9 +2042,9 @@ Some of the commonly used wildcards are listed below: * `*` match any character, zero or more times * as a special case, `*` won't match the starting `.` of hidden files unless the `dotglob` shell option is set * `?` match any character exactly once -* `[set]` match any of these characters once -* `[^set]` match any characters *except* the given set of characters - * you can also use `[!set]` to negate the character class +* `[set149]` match any of these characters once +* `[^set149]` match any characters *except* the given set of characters + * you can also use `[!set149]` to negate the character class * `[a-z]` match a range of characters from `a` to `z` * `[0-9a-fA-F]` match any hexadecimal character @@ -3512,7 +3512,7 @@ mango # Searching Files and Filenames -This chapter will show how to search file contents based on literal strings or regular expressions. After that, you'll learn how to locate files based on their names and other properties like size, last modified, etc. +This chapter will show how to search file contents based on literal strings or regular expressions. After that, you'll learn how to locate files based on their names and other properties like size, last modified timestamp and so on. >![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. @@ -3530,11 +3530,11 @@ Commonly used options are shown below. Examples will be discussed in later secti * `--color=auto` highlight the matching portions, filenames, line numbers, etc using colors * `-i` ignore case while matching -* `-v` print non-matching lines -* `-n` prefix line numbers for matching lines -* `-c` display only the count of number of matching lines +* `-v` print only non-matching lines +* `-n` prefix line numbers for output lines +* `-c` display only the count of output lines * `-l` print only the filenames matching the given expression -* `-L` print filenames NOT matching the pattern +* `-L` print filenames *not* matching the pattern * `-w` match pattern only as whole words * `-x` match pattern only as whole lines * `-F` interpret pattern as a fixed string (i.e. not a regular expression) @@ -3730,7 +3730,7 @@ See `man pcrepattern` or [PCRE online manual](https://www.pcre.org/original/doc/ ### Recursive search -You can use the `-r` option to search recursively within the specified directories. By default, the current directory will be searched. Use `-R` if you want symbolic links found within the input directories to be followed as well. You do not need `-R` option for specifying symbolic links as arguments. +You can use the `-r` option to search recursively within the specified directories. By default, the current directory will be searched. Use `-R` if you want symbolic links found within the input directories to be followed as well. You do not need the `-R` option for specifying symbolic links as arguments. Here are some basic examples. Recursive search will work as if `-H` option was specified as well, even if only one file was matched. Also, hidden files are included by default. @@ -4116,7 +4116,7 @@ $ find -name '*sc*' -or -size +10k ./scripts ./errors.log -# except filenames containing 'o' or `r` or 'txt' +# except filenames containing 'o' or 'r' or 'txt' $ find -type f -not \( -name '*[or]*' -or -name '*txt*' \) ./projects/tictactoe/game.py ./projects/calculator/calc.sh @@ -4627,7 +4627,7 @@ $ du -m report.log 8 report.log ``` -The `-h` option reports size in human readable format (uses power of 1024). Add `--si` option to get results in powers of 1000 instead. If you use `du -h`, you can pipe the output to `sort -h` for sorting purposes. +The `-h` option reports size in human readable format (uses power of 1024). Use `--si` option to get results in powers of 1000 instead. If you use `du -h`, you can pipe the output to `sort -h` for sorting purposes. ```bash $ du -sh * @@ -4714,7 +4714,7 @@ $ stat -c '%s %n' ip.txt hi.sh 21 hi.sh ``` ->![info](./images/info.svg) ![info](./images/info.svg) The `stat` command should be preferred instead of parsing `ls -l` output for file details. See [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) and [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) for explanation and other alternatives. +>![info](./images/info.svg) ![warning](./images/warning.svg) The `stat` command should be preferred instead of parsing `ls -l` output for file details. See [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) and [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) for explanation and other alternatives. ## touch @@ -4963,7 +4963,7 @@ $ stat -c '%a %A' dot_files 700 drwx------ ``` -You can also use `mkdir -m` instead of the `mkdir+chmod` combination seen above. The argument to the `-m` option uses the same syntax as `chmod` (including the format that'll be discussed next). +You can also use `mkdir -m` instead of the `mkdir+chmod` combination seen above. The argument to the `-m` option accepts the same syntax as `chmod` (including the format that'll be discussed next). ```bash $ mkdir -m 750 backups @@ -5370,7 +5370,7 @@ $ pgrep -a 'vim' Sometimes, a process might not be responding to your interaction, might be taking too long, accidentally uses too much memory, and so on. You can use the `kill` command to manage such processes. -As mentioned at the beginning of this chapter, these examples are suggested for interactive processes initiated by you (other usage, for example in scripts, will require different strategy). Be 100% sure before you attempt to send signals to manage processes. +As mentioned at the beginning of this chapter, these examples are suggested for interactive processes initiated by you (other usage, for example in scripts, will require different strategies). Be 100% sure before you attempt to send signals to manage processes. You can pass signals by name or by their associated number. Use `kill -l` to get a full list of signals. See also [unix.stackexchange: List of Signals](https://unix.stackexchange.com/q/317492/109046) and [unix.stackexchange: What causes various signals to be sent?](https://unix.stackexchange.com/q/6332/109046) @@ -5762,7 +5762,7 @@ awk 'cond1{action1} cond2{action2} ... condN{actionN}' If a condition isn't provided, the action is always executed. Within a block, you can provide multiple statements separated by a semicolon character. If action isn't provided, then by default, contents of `$0` variable is printed if the condition evaluates to *true*. When action isn't present, you can use semicolon to terminate the condition and start another `condX{actionX}` snippet. -You can use a `BEGIN{}` block when you need to execute something before the input is read and a `END{}` block to execute something after all of the input has been processed. +You can use a `BEGIN{}` block when you need to execute something before the input is read and an `END{}` block to execute something after all of the input has been processed. ```bash $ seq 2 | awk 'BEGIN{print "---"} 1; END{print "%%%"}' @@ -6615,7 +6615,7 @@ apple 50 ## uniq -This command helps you to identify and remove duplicates. Usually requires a sorted input as the comparison is made between adjacent lines only. +This command helps you to identify and remove duplicates. Usually used with sorted inputs as the comparison is made between adjacent lines only. ### Common options @@ -7491,7 +7491,7 @@ $ seq 10 | paste -d: - - - - - 1:2:3:4:5 6:7:8:9:10 -# use input redirection for file input +# use redirection for file input $ ![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has all the shell scripts discussed in this chapter. However, it is recommended that you type the scripts manually using your favorite text editor and refer to the `example_files/shell_scripting` directory only when necessary. +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has all the shell scripts discussed in this chapter. However, it is recommended that you type the scripts manually using your favorite text editor and refer to the `example_files/shell_scripting` directory only if necessary. ## Need for scripting @@ -8101,7 +8101,7 @@ Use `chmod` to add executable permission to the file and then run the script: ```bash $ chmod +x hello.sh -$ ./hello_world.sh +$ ./hello.sh Hello learnbyexample Today is Wednesday Have a nice day @@ -8609,7 +8609,7 @@ pp * `n1 -lt n2` checks if `n1` is less than `n2` * `n1 -le n2` checks if `n1` is less than or equal to `n2` -Only positive or negative integer comparisons are supported by these operators. +These operators support only integer comparisons. ```bash $ [[ 20 -gt 3 ]] && echo 'true' || echo 'false' @@ -8666,7 +8666,7 @@ Enter two integers separated by spaces: -2 42 -2 + 42 = 40 ``` ->![info](images/info.svg) You can use the `-a` option to assign an array, the `-d` option to specify a custom delimiter instead of newline and so on. See `help read` and [bash manual: Builtins](https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins) for more details. +>![info](images/info.svg) You can use the `-a` option to assign an array, the `-d` option to specify a custom delimiter instead of newline for terminating user input and so on. See `help read` and [bash manual: Builtins](https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins) for more details. ## if then else @@ -8819,7 +8819,7 @@ $ bash read_file_lines.sh files.txt 2 greeting.sh ``` -The intention in the above script is to treat each input line literally. So, the `IFS` special variable is set to empty string to prevent stripping of leading and trailing whitespaces. The `-r` option to the `read` builtin allows `\` in input to be treated literally. Note that the input filename is accepted as the first command line argument and redirected as `stdin` to the `while` loop. You also need to make sure that the last line of input ends with a newline character, otherwise the last line won't be processed. +The intention in the above script is to treat each input line literally. So, the `IFS` (input field separator) special variable is set to empty string to prevent stripping of leading and trailing whitespaces. The `-r` option to the `read` builtin allows `\` in input to be treated literally. Note that the input filename is accepted as the first command line argument and redirected as `stdin` to the `while` loop. You also need to make sure that the last line of input ends with a newline character, otherwise the last line won't be processed. You can change `IFS` to split the input line into different fields and specify appropriate number of variables to the `read` builtin. Here's an example: @@ -8843,7 +8843,7 @@ or d ``` ->![info](./images/info.svg) The `xargs` command can also be used for some of the cases discussed above. See [unix.stackexchange: parse each line of a text file as a command argument](https://unix.stackexchange.com/q/149726/109046) for an example. +>![info](./images/info.svg) The `xargs` command can also be used for some of the cases discussed above. See [unix.stackexchange: parse each line of a text file as a command argument](https://unix.stackexchange.com/q/149726/109046) for examples. ## Functions @@ -8974,7 +8974,7 @@ For more information: https://www.shellcheck.net/wiki/SC1068 -- Don't put spaces around the = in ... ``` ->![info](images/info.svg) Use the `-s` option (`shellcheck -s bash` for example) to specify the shell being used, if the script doesn't have a shebang. +>![info](images/info.svg) If the script doesn't have a shebang, you can use the `-s` option (`shellcheck -s bash` for example) to specify the shell application. >![info](images/info.svg) ![warning](./images/warning.svg) Note that `shellcheck` will not catch all types of issues. And suggestions should not be blindly accepted without understanding if that makes sense in the given context. @@ -9444,7 +9444,7 @@ alias c2='cd ../../' alias c3='cd ../../../' alias ls='ls --color=auto' -alias l='ls -ltrh' +alias l='ls -ltrhG' alias la='l -A' alias grep='grep --color=auto' @@ -9557,13 +9557,13 @@ The documentation uses **Meta** (`M-` prefix) and notes that this key is labeled ## Copy and paste -Shortcuts for copy-paste operations in the terminal are shown below. You might be able to customize these shortcuts in terminal preferences. +Shortcuts for copy-paste operations in the terminal are shown below. You might be able to customize these shortcuts in the terminal preferences. * `Shift+Ctrl+c` copy the highlighted portion to the clipboard * `Shift+Ctrl+v` paste clipboard contents * `Shift+Insert` paste the last highlighted portion (not necessarily the clipboard contents) -You can also press middle mouse button instead of the `Shift+Insert` shortcut. This is not limited to the terminal, but works in any application. Use the `xinput` command to enable/disable mouse button clicks. First, use `xinput` without any arguments and spot the number corresponding to your mouse. As an example, assuming the device number is `11`, you can use the following commands: +You can also press middle mouse button instead of the `Shift+Insert` shortcut. This is not limited to the terminal, works in many other applications too. You can use the `xinput` command to enable/disable mouse button clicks. First, use `xinput` without any arguments and spot the number corresponding to your mouse. As an example, assuming the device number is `11`, you can use the following commands: * `xinput set-button-map 11 1 0 3` to disable middle button click * `xinput set-button-map 11 1 2 3` to enable middle button click diff --git a/sample_chapters/cli_computing_sample.pdf b/sample_chapters/cli_computing_sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7a7e30b550abfe9412d125bc3a2f93cac771bc3 GIT binary patch literal 565090 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%0A@JqdC(*GA)vbWZob08Mt8c&VB{Bc(^a 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 _yg!rviH3v2? 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%0A)~_6k)_f<)z+XzoK1fQ1-nI_t~z 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 zob�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 Date: Tue, 1 Nov 2022 15:22:57 +0530 Subject: [PATCH 71/76] added links to PDF/EPUB versions --- README.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5eaa398..4b03067 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +# Release offers + +To celebrate my latest ebook release, you can download [Computing from the Command Line](https://learnbyexample.gumroad.com/l/cli_computing) for FREE till 08-Nov-2022. + +Some of my ebooks and bundles are on sale as well till 08-Nov-2022: + +* [Command line text processing with GNU Coreutils](https://learnbyexample.gumroad.com/l/cli_coreutils/cli_computing_release) is FREE +* [Magical one-liners](https://learnbyexample.gumroad.com/l/oneliners/cli_computing_release) bundle is $5 (normal price $15) — grep, sed, awk, perl and ruby one-liners +* [All books bundle](https://learnbyexample.gumroad.com/l/all-books/cli_computing_release) is $10 (normal price $28) — all my 13 programming ebooks + # Computing from the Command Line This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. @@ -20,13 +30,20 @@ See [Version_changes.md](./Version_changes.md) to keep track of changes made to # E-book -For web version of the book, visit https://learnbyexample.github.io/cli-computing/ +* You can purchase the book using these links: + * https://learnbyexample.gumroad.com/l/cli_computing + * https://leanpub.com/cli_computing +* You can also get the book as part of these bundles: + * **All books bundle** from https://learnbyexample.gumroad.com/l/all-books + * Includes all my programming books +* See https://learnbyexample.github.io/books/ for list of other books -* Links to pdf/epub versions of the book will be added once they are done -* See https://learnbyexample.github.io/books/ for a list of my other books +For a preview of the book, see [sample chapters](https://github.com/learnbyexample/cli-computing/blob/master/sample_chapters/cli_computing_sample.pdf) The book can also be [viewed as a single markdown file in this repo](./cli_computing.md). See my blogpost on [generating pdf from markdown using pandoc](https://learnbyexample.github.io/customizing-pandoc/) if you are interested in the ebook creation process. +For web version of the book, visit https://learnbyexample.github.io/cli-computing/ +
    ## Feedback and Contributing From 8d7e09d5f1f196226ef3e61ac7cd3b9bbcccd0b4 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 2 Nov 2022 09:59:42 +0530 Subject: [PATCH 72/76] added link to promo video --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b03067..d69c86c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Some of my ebooks and bundles are on sale as well till 08-Nov-2022: # Computing from the Command Line -This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. +This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. Visit https://youtu.be/PS5XEemn164 for a short video about the book.

    From 791b079034c97a78f9341189981f5d3b55732972 Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Thu, 10 Nov 2022 09:57:26 +0530 Subject: [PATCH 73/76] updated book details --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index d69c86c..40f4179 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,3 @@ -# Release offers - -To celebrate my latest ebook release, you can download [Computing from the Command Line](https://learnbyexample.gumroad.com/l/cli_computing) for FREE till 08-Nov-2022. - -Some of my ebooks and bundles are on sale as well till 08-Nov-2022: - -* [Command line text processing with GNU Coreutils](https://learnbyexample.gumroad.com/l/cli_coreutils/cli_computing_release) is FREE -* [Magical one-liners](https://learnbyexample.gumroad.com/l/oneliners/cli_computing_release) bundle is $5 (normal price $15) — grep, sed, awk, perl and ruby one-liners -* [All books bundle](https://learnbyexample.gumroad.com/l/all-books/cli_computing_release) is $10 (normal price $28) — all my 13 programming ebooks - # Computing from the Command Line This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. Visit https://youtu.be/PS5XEemn164 for a short video about the book. From 1940ec1bcd5e1d9bb381cb06a595f9b7eaf73bca Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Fri, 18 Nov 2022 19:55:20 +0530 Subject: [PATCH 74/76] added testimonials --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 40f4179..4b7c1af 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,14 @@ For web version of the book, visit https://learnbyexample.github.io/cli-computin
    +# Testimonials + +>Ive only gotten through first pages but appears a good Unix/bash primer. I’ll probably recommend for new hires out of bootcamp because they’re usually weak here +> +> — [feedback on twitter](https://twitter.com/Lizziness/status/1589866691974291456) + +
    + ## Feedback and Contributing ⚠️ ⚠️ Please DO NOT submit pull requests. Main reason being any modification requires changes in multiple places. From 22d524dad1e168a5a3031853263373ffe7facf2d Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Tue, 30 Jan 2024 18:15:50 +0530 Subject: [PATCH 75/76] added another testimonial --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b7c1af..d606110 100644 --- a/README.md +++ b/README.md @@ -42,13 +42,17 @@ For web version of the book, visit https://learnbyexample.github.io/cli-computin > > — [feedback on twitter](https://twitter.com/Lizziness/status/1589866691974291456) +>Nice book! I just started trying to get into linux today and you have some tips I haven’t found elsewhere and the text is an enjoyable read so far. +> +> — [feedback on reddit](https://old.reddit.com/r/linux4noobs/comments/1adrx6c/linux_guide_for_beginners/kk3dypr/) +
    ## Feedback and Contributing ⚠️ ⚠️ Please DO NOT submit pull requests. Main reason being any modification requires changes in multiple places. -I would highly appreciate if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. +I would highly appreciate it if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. You can reach me via: From 22064df64fae7c28692455e55eaf88a74ac80d3f Mon Sep 17 00:00:00 2001 From: Sundeep Agarwal Date: Wed, 29 May 2024 09:17:30 +0530 Subject: [PATCH 76/76] updates for version 1.1 --- LICENSE | 2 +- README.md | 35 +- Version_changes.md | 8 + cli_computing.md | 799 ++++++++++++----------- exercises/exercise-solutions.md | 135 ++-- exercises/exercises.md | 105 +-- images/cli_computing_ls.png | Bin 47711 -> 60685 bytes sample_chapters/cli_computing_sample.pdf | Bin 565090 -> 597712 bytes 8 files changed, 581 insertions(+), 503 deletions(-) diff --git a/LICENSE b/LICENSE index cd26a33..00b1931 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Sundeep Agarwal +Copyright (c) 2024 Sundeep Agarwal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d606110..ea1182a 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,16 @@ -# Computing from the Command Line +# Linux Command Line Computing -This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. Visit https://youtu.be/PS5XEemn164 for a short video about the book. +This book aims to teach Linux Command Line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed. Visit https://youtu.be/vedRFbWwx_c for a short video about the book. -

    - -

    +

    Linux Command Line Computing ebook cover image

    -The book also includes exercises to test your understanding, which is presented together as a single file in this repo — [exercises.md](./exercises/exercises.md) +The book also includes exercises to test your understanding, which are presented together as a single file in this repo — [exercises.md](./exercises/exercises.md). For solutions to the exercises, see [exercise-solutions.md](./exercises/exercise-solutions.md). See [Version_changes.md](./Version_changes.md) to keep track of changes made to the book. -[Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an earlier version of the book in this repo. +[Click this link](https://github.com/learnbyexample/cli-computing/tree/09091253463a313ddce5a95f467857ea85c25ce6) for an older version of the book in this repo. ![info](./images/info.svg) See my curated list on [Linux CLI and Shell scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources. @@ -20,17 +18,18 @@ See [Version_changes.md](./Version_changes.md) to keep track of changes made to # E-book -* You can purchase the book using these links: - * https://learnbyexample.gumroad.com/l/cli_computing - * https://leanpub.com/cli_computing +* You can purchase the pdf/epub versions of the book using these links: + * https://learnbyexample.gumroad.com/l/cli_computing + * https://leanpub.com/cli_computing * You can also get the book as part of these bundles: - * **All books bundle** from https://learnbyexample.gumroad.com/l/all-books + * **Linux CLI Text Processing** bundle from https://learnbyexample.gumroad.com/l/linux-cli-text-processing or https://leanpub.com/b/linux-cli-text-processing + * **All books bundle** from https://learnbyexample.gumroad.com/l/all-books * Includes all my programming books -* See https://learnbyexample.github.io/books/ for list of other books +* See https://learnbyexample.github.io/books/ for a list of other books -For a preview of the book, see [sample chapters](https://github.com/learnbyexample/cli-computing/blob/master/sample_chapters/cli_computing_sample.pdf) +For a preview of the book, see [sample chapters](./sample_chapters/cli_computing_sample.pdf). -The book can also be [viewed as a single markdown file in this repo](./cli_computing.md). See my blogpost on [generating pdf from markdown using pandoc](https://learnbyexample.github.io/customizing-pandoc/) if you are interested in the ebook creation process. +The book can also be [viewed as a single markdown file in this repo](./cli_computing.md). See my blogpost on [generating pdfs from markdown using pandoc](https://learnbyexample.github.io/customizing-pandoc/) if you are interested in the ebook creation process. For web version of the book, visit https://learnbyexample.github.io/cli-computing/ @@ -48,7 +47,7 @@ For web version of the book, visit https://learnbyexample.github.io/cli-computin
    -## Feedback and Contributing +# Feedback ⚠️ ⚠️ Please DO NOT submit pull requests. Main reason being any modification requires changes in multiple places. @@ -90,7 +89,7 @@ You can reach me via: * [/r/commandline/](https://old.reddit.com/r/commandline), [/r/linux4noobs/](https://old.reddit.com/r/linux4noobs/), [/r/linuxquestions/](https://old.reddit.com/r/linuxquestions/) and [/r/linux/](https://old.reddit.com/r/linux/) — helpful forums * [canva](https://www.canva.com/) — cover image * [Warning](https://commons.wikimedia.org/wiki/File:Warning_icon.svg) and [Info](https://commons.wikimedia.org/wiki/File:Info_icon_002.svg) icons by [Amada44](https://commons.wikimedia.org/wiki/User:Amada44) under public domain -* [carbon](https://carbon.now.sh/) — creating terminal screenshots with highlighted text +* [carbon](https://carbon.now.sh/) — for creating terminal screenshots with highlighted text * [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) — optimizing images * [Inkscape](https://inkscape.org/) — favicon * [mdBook](https://github.com/rust-lang/mdBook) — for web version of the book @@ -101,7 +100,7 @@ You can reach me via: # License -The book is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) +The book is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/). -The code snippets are licensed under MIT, see [LICENSE](./LICENSE) file +The code snippets are licensed under MIT, see [LICENSE](./LICENSE) file. diff --git a/Version_changes.md b/Version_changes.md index 257de74..8ff0085 100644 --- a/Version_changes.md +++ b/Version_changes.md @@ -1,5 +1,13 @@
    +### 1.1 + +* Some of the examples, exercises, descriptions and external links were updated/corrected +* Book title changed to **Linux Command Line Computing** +* New cover image + +
    + ### 1.0 * First version diff --git a/cli_computing.md b/cli_computing.md index 53853a0..7763789 100644 --- a/cli_computing.md +++ b/cli_computing.md @@ -1,14 +1,14 @@ # Preface -This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed, but some details might get covered in future versions of this book. +This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. The main focus is towards managing your files and performing text processing tasks. Topics like system administration and networking won't be discussed. ## Prerequisites You should be familiar with basic computer usage, know fundamental terms like files and directories, how to install programs and so on. You should also be already comfortable with programming basics like variables, loops and functions. -In terms of software, you should have access to the `GNU bash` shell and commonly used Linux command line tools. This could be as part of a Linux distribution or via other means such as a Virtual Machine, WSL (Windows Subsystem for Linux) and so on. More details about the working environment will be discussed in the introductory chapters. +In terms of software, you should have access to the `GNU bash` shell and commonly used Linux command line tools. This could be as part of a Linux distribution or via other means such as a Virtual Machine, WSL (Windows Subsystem for Linux) and so on. More details about the expected working environment will be discussed in the introductory chapters. -You are also expected to get comfortable with reading manuals, searching online, visiting external links provided for further reading, tinkering with illustrated examples, asking for help when you are stuck and so on. In other words, be proactive and curious instead of just consuming the content passively. +You are also expected to get comfortable with reading manuals, searching online, visiting external links provided for further reading, tinkering with the illustrated examples, asking for help when you are stuck and so on. In other words, be proactive and curious instead of just consuming the content passively. See my curated list on [Linux CLI and Shell Scripting](https://learnbyexample.github.io/curated_resources/linux_cli_scripting.html) for more learning resources. @@ -16,7 +16,7 @@ See my curated list on [Linux CLI and Shell Scripting](https://learnbyexample.gi * Code snippets shown are copy pasted from the `bash` shell (version **5.0.17**) and modified for presentation purposes. Some commands are preceded by comments to provide context and explanations, blank lines have been added to improve readability and so on. * External links are provided throughout the book for you to explore certain topics in more depth. -* The [cli-computing repo](https://github.com/learnbyexample/cli-computing) has all the [example files and scripts](https://github.com/learnbyexample/cli-computing/tree/master/example_files) used in the book. The repo also includes all the [exercises](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercises.md) as a single file, along with a separate [solutions](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercise-solutions.md) file. If you are not familiar with `git` command, click the **Code** button on the webpage to get the files. +* The [cli-computing repo](https://github.com/learnbyexample/cli-computing) has all the [example files and scripts](https://github.com/learnbyexample/cli-computing/tree/master/example_files) used in the book. The repo also includes all the [exercises](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercises.md) as a single file, along with a separate [solutions](https://github.com/learnbyexample/cli-computing/blob/master/exercises/exercise-solutions.md) file. If you are not familiar with the `git` command, click the **Code** button on the webpage to get the files. * See the [Setup](#setup) section for instructions to create a working environment for following along the contents presented in this book. ## Acknowledgements @@ -27,12 +27,12 @@ See my curated list on [Linux CLI and Shell Scripting](https://learnbyexample.gi * [/r/commandline/](https://old.reddit.com/r/commandline), [/r/linux4noobs/](https://old.reddit.com/r/linux4noobs/), [/r/linuxquestions/](https://old.reddit.com/r/linuxquestions/) and [/r/linux/](https://old.reddit.com/r/linux/) — helpful forums * [canva](https://www.canva.com/) — cover image * [Warning](https://commons.wikimedia.org/wiki/File:Warning_icon.svg) and [Info](https://commons.wikimedia.org/wiki/File:Info_icon_002.svg) icons by [Amada44](https://commons.wikimedia.org/wiki/User:Amada44) under public domain -* [carbon](https://carbon.now.sh/) — creating terminal screenshots with highlighted text +* [carbon](https://carbon.now.sh/) — for creating terminal screenshots with highlighted text * [oxipng](https://github.com/shssoichiro/oxipng), [pngquant](https://pngquant.org/) and [svgcleaner](https://github.com/RazrFalcon/svgcleaner) — optimizing images ## Feedback and Errata -I would highly appreciate if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. +I would highly appreciate it if you'd let me know how you felt about this book. It could be anything from a simple thank you, pointing out a typo, mistakes in code snippets, which aspects of the book worked for you (or didn't!) and so on. Reader feedback is essential and especially so for self-published authors. You can reach me via: @@ -50,15 +50,15 @@ When the creative muse strikes, he can be found working on yet another programmi ## License -This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/) +This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/). -Code snippets are available under [MIT License](https://github.com/learnbyexample/cli-computing/blob/master/LICENSE) +Code snippets are available under [MIT License](https://github.com/learnbyexample/cli-computing/blob/master/LICENSE). Resources mentioned in the Acknowledgements section above are available under original licenses. ## Book version -1.0 +1.1 See [Version_changes.md](https://github.com/learnbyexample/cli-computing/blob/master/Version_changes.md) to track changes across book versions. @@ -68,11 +68,11 @@ Back in 2007, I had a rough beginning as a design engineer at a semiconductor co The biggest pain points were not knowing about handy options (for example, `grep --color` to highlight matching portions, `find -exec` to apply commands on filtered files, etc) and tools (for example, `xargs` to workaround limitations of too many command line arguments). And then there were tools like `sed` and `awk` with intimidating syntax. I'm at a loss to reason out why I didn't utilize shell scripts much. I stuck to Perl and Vim instead of learning such handy tools. I also did not know about forums like [stackoverflow](https://stackoverflow.com/) and [unix.stackexchange](https://unix.stackexchange.com/) until after I left my job in 2014. -I started collating what I knew about Linux command line tools when I got chances to conduct scripting course workshops for college students. From 2016 to 2018, I started maintaining my tutorials on Linux command line, Vim and scripting languages as GitHub repos. As you might guess, I then started polishing these materials and [published them as ebooks](https://learnbyexample.github.io/books/). This is an ongoing process, with **Computing from the Command Line** being the thirteenth ebook. +I started collating what I knew about Linux command line tools when I got chances to conduct scripting course workshops for college students. From 2016 to 2018, I started maintaining my tutorials on Linux command line, Vim and scripting languages as GitHub repos. As you might guess, I then started polishing these materials and [published them as ebooks](https://learnbyexample.github.io/books/). This is an ongoing process, with **Linux Command Line Computing** being the thirteenth ebook. This book aims to teach Linux command line tools and Shell Scripting for beginner to intermediate level users. Plenty of examples are provided to make it easier to understand a particular tool and its various features. External links are provided for further reading. Important notes and warnings are formatted to stand out from normal text. -Writing a book always has a few pleasant surprises for me. This time I learned handy options like `mkdir -m` and `chmod =`, got better understanding of many shell features and so on. I'm also planning to learn and present more command line tools for the next version of this book. +Writing a book always has a few pleasant surprises for me. This time I learned handy options like `mkdir -m` and `chmod =`, got better understanding of many shell features and so on. This chapter will give a brief introduction to Linux. You'll also see suggestions and instructions for setting up a command line environment to follow along the contents presented in this book. @@ -86,7 +86,7 @@ Quoting selective parts from [wikipedia](https://en.wikipedia.org/wiki/Linux): > >Linux is one of the most prominent examples of free and open-source software collaboration. The source code may be used, modified and distributed commercially or non-commercially by anyone under the terms of its respective licenses, such as the GNU General Public License. -Apart from Linux exposure during my previous job, I've been using Linux as my desktop system since 2014 and it is very well suited for my needs. Compared to my Windows experience, Linux is light weight, secure, stable, fast and more importantly doesn't force you to upgrade hardware. Read the wikipedia article linked above for a more comprehensive coverage about Linux, where it is used and so on. +Apart from Linux exposure during my previous job, I've been using Linux since 2014 and it is very well suited for my needs. Compared to Windows, Linux is light weight, secure, stable, fast and more importantly doesn't force you to upgrade hardware. Read the wikipedia article linked above for a more comprehensive coverage about Linux, where it is used and so on. ## Linux Distros @@ -107,7 +107,7 @@ You'll usually find installation instructions from the respective distro website * [Install Ubuntu desktop](https://ubuntu.com/tutorials/install-ubuntu-desktop) * [How to run Ubuntu Desktop on a virtual machine using VirtualBox](https://ubuntu.com/tutorials/how-to-run-ubuntu-desktop-on-a-virtual-machine-using-virtualbox) -* [DistroTest](https://distrotest.net/index.php) — test a distro directly online without installation +* [DistroSea](https://distrosea.com/) — explore and test Linux distributions online If you are already on Windows or macOS, the following options can be used to get access to Linux tools: @@ -115,11 +115,11 @@ If you are already on Windows or macOS, the following options can be used to get * [Windows Subsystem for Linux](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux) — compatibility layer for running Linux binary executables natively on Windows * [brew](https://brew.sh/) — Package Manager for macOS (or Linux) ->![info](./images/info.svg) ![info](./images/info.svg) ![warning](./images/warning.svg) If you are completely new to command line usage, I'd recommend setting up a virtual machine. Or perhaps, a secondary computer that you are free to experiment with. Mistakes in command line can be more destructive compared to the graphical interface. For example, a single space typo can result in data loss, leave your machine unusable, etc. +>![info](./images/info.svg) ![warning](./images/warning.svg) If you are completely new to command line usage, I'd recommend setting up a virtual machine. Or perhaps, a secondary computer that you are free to experiment with. Mistakes in command line can be more destructive compared to the graphical interface. For example, a single space typo can result in data loss, make your machine unusable, etc. ## Setup -To follow along the contents presented in this book, you'll need files from my [cli-computing repo](https://github.com/learnbyexample/cli-computing). Once you have access to a Linux environment, follow the instructions shown below. If all the commands used below seem alien to you, wait until you reach the [ls](#ls) section (you'll get a link back to these instructions at that point). +To follow along the contents presented in this book, you'll need files from my [cli-computing repo](https://github.com/learnbyexample/cli-computing). Once you have access to a Linux environment, follow the instructions shown below. If the commands used below seem alien to you, wait until you reach the [ls](#ls) section (you'll get a link back to these instructions at that point). To get the files, you can clone the cli-computing repo using the `git` command or download a `zip` version. You may have to install the `git` command if you don't already have it, for example `sudo apt install git` on Debian-like systems. See [https://git-scm.com/downloads](https://git-scm.com/downloads) for other installation choices. @@ -177,11 +177,11 @@ And here are some disadvantages: * need to get comfortable with plenty of tools * typos have a tendency to be more destructive -You can make use of features like command history, shortcuts and autocompletion to help with plethora of commands and syntax issues. Consistent practice will help to get familiar with quirks of the command line environment. Commands with destructive potential will usually include options to allow manual confirmation and interactive usage, thus reducing or entirely avoiding the impact of typos. +You can make use of features like command history, shortcuts and autocompletion to help with the plethora of commands and syntax issues. Consistent practice will help to get familiar with the quirks of the command line environment. Commands with destructive potential will usually include options to allow manual confirmation and interactive usage, thus reducing or entirely avoiding the impact of typos. ## Chapters -Here's the list of remaining chapters: +Here's a list of remaining chapters: * [Command Line Overview](#command-line-overview) * [Managing Files and Directories](#managing-files-and-directories) @@ -211,7 +211,7 @@ This chapter will help you take the first steps in the command line world. Apart For newbies, the sudden paradigm shift to interacting with the computer using just text commands can be overwhelming, especially for those accustomed to the graphical user interface (GUI). After regular usage, things will start to look systematic and you might realize that GUI is ill suited for repetitive tasks. With continuous use, recalling various commands will become easier. Features like command line history, aliases, tab-completion and shortcuts will help too. -If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into a tiny screen and a plethora of multipurpose buttons. Command line environment is something like that, but not limited just to mathematics. From managing files to munging data, from image manipulations to working with video, you'll likely find a tool for almost any computing task you can imagine. Always remember that command line tools appeared long before graphical ones did. The rich history shows its weight in the form of robust tools and the availability of wide variety of applications. +If you've used a scientific calculator, you'd know that it is handy with too many functionalities cramped into a tiny screen and a plethora of multipurpose buttons. Command line environment is something like that, but not limited to just crunching numbers. From managing files to munging data, from image manipulations to working with video, you'll likely find a tool for almost any computing task you can imagine. Always remember that command line tools appeared long before the graphical ones did. The rich history shows its weight in the form of robust tools and the availability of wide variety of applications. ## Hello Command Line @@ -239,7 +239,7 @@ If you are completely new to the command line world, try out the above steps a f ## File System -In Linux, directory structure starts with the `/` symbol, which is referred to as the **root** directory. The `man hier` command gives description of the file system hierarchy. Here are some selected examples: +In Linux, the directory structure starts with the `/` symbol, referred to as the **root** directory. The `man hier` command gives description of the file system hierarchy. Here are some selected examples: * `/` This is the root directory. This is where the whole tree starts. * `/bin` This directory contains executable programs which are needed in single user mode and to bring the system up or repair it. @@ -288,7 +288,7 @@ $ echo "$SHELL" /bin/bash ``` -In the above example, the `cat` command is used to display the contents of a file and the `echo` command is used to display the contents of a variable. `SHELL` is an environment variable containing full path to the shell. +In the above example, the `cat` command is used to display the contents of a file and the `echo` command is used to display the contents of a variable. `SHELL` is an environment variable containing the full path to the shell. >![info](images/info.svg) The output of the above commands might be different for you. And as mentioned earlier, your command prompt might be different than `$ `. For now, you can ignore it. Or, you could type `PS1='$ '` and press the `Enter` key to set the prompt for the current session. @@ -328,7 +328,7 @@ It is not necessary to fully understand the commands used in this chapter, just * `ls -la` list directory contents including hidden files in long listing format * two short options `-l` and `-a` are combined together here as `-la` * `df -h` report file system disk space usage sizes in human readable format -* `df --human-readable` same as `df -h` but using long option instead of short option +* `df --human-readable` same as `df -h` but using long option **Command with arguments**: @@ -353,7 +353,7 @@ It is not necessary to fully understand the commands used in this chapter, just $ echo '$SHELL' $SHELL -# $ is special within double quotes, used to interpolate variable here +# $ is special within double quotes, used to interpolate a variable here $ echo "Full path to the shell: $SHELL" Full path to the shell: /bin/bash ``` @@ -406,7 +406,7 @@ how are you? 3 ``` ->![info](./images/info.svg) Your Linux distro is likely to have an easy to use graphical text editor such as `gedit` and `mousepad`. See [wiki.archlinux: text editors](https://wiki.archlinux.org/title/List_of_applications#Text_editors) for a huge list of editors to choose from. +>![info](./images/info.svg) Your Linux distro is likely to have an easy to use graphical text editor such as the `GNOME Text Editor` and `mousepad`. See [wiki.archlinux: text editors](https://wiki.archlinux.org/title/List_of_applications/Documents#Text_editors) for a huge list of editors to choose from. >![info](./images/info.svg) The [Shell Scripting](#shell-scripting) chapter will discuss scripting in more detail. @@ -416,14 +416,14 @@ Most distros for personal use come with documentation for commands already insta ### man -The `man` command is an interface to view manuals from within the terminal itself. This uses a `pager` (which is usually the `less` command) to display the contents. You could call these commands as terminal user interface (TUI) applications. As an example, type `man cat` and you should see something like the screenshot shown below: +The `man` command is an interface to view manuals from within the terminal itself. This uses a `pager` (which is usually the `less` command) to display the contents. You could categorize these commands as terminal user interface (TUI) applications. As an example, type `man cat` and you should see something like the screenshot shown below: ![manual page for the cat command](images/man_cat.png) Since the documentation has several lines that doesn't completely fit within the terminal window, you will get only the starting part of the manual. You have several options to navigate: * `↑` and `↓` arrow keys to move up and down by a line - * you can also use `k` and `j` keys (same keys as those used in the Vim text editor) + * you can also use `k` and `j` keys (same keys as those used by the Vim text editor) * `f` and `b` keys to move forward and backward by a screenful of content * `Space` key also moves forward by a screen * mouse scroll moves up and down by a few lines @@ -441,10 +441,10 @@ As you might have noticed in the screenshot above, you can use `h` for help abou * `man bash` will give you the manual page for the `bash` shell * since this is very long, I'd recommend using the [online GNU Bash manual](https://www.gnu.org/software/bash/manual/) * `man find | gvim -` open the manual page in your favorite text editor -* `man -k printf` search the short descriptions in all the manual pages for the string `printf` +* `man -k printf` search the short descriptions in all of the manual pages for the string `printf` * you can also use the `apropos` command instead of `man -k` * `wc --help` many commands support the `--help` option to give succinct details like options and syntax - * also, these details will be displayed on the terminal itself, no need to deal with `pager` interface + * also, these details will be displayed on the terminal itself, no need to deal with the `pager` interface >![info](images/info.svg) See also [unix.stackexchange: How do I use man pages to learn how to use commands?](https://unix.stackexchange.com/q/193815/109046) and [unix.stackexchange: colors in man pages](https://unix.stackexchange.com/q/119/109046). @@ -608,7 +608,7 @@ If the command line environment only had file managing features, I'd still use i Some of these workflows require additional management, for which I write shell functions or scripts. I do need GUI tools as well, for example, web browser, image viewer, PDF/EPUB viewers, [SimpleScreenRecorder](https://github.com/MaartenBaert/ssr) and so on. Some of these can be handled from within the terminal too, but I prefer GUI for such cases. I do launch some of them from the terminal, primarily for providing the file or url to be opened. -You might wonder what advantage does the command line provide for processing images and videos? Apart from being faster, the custom parameters (like border color, border size, quality percentage, etc) are automatically saved as part of the scripts I create. After that, I can just use a single call to the script instead of waiting for a GUI application to open, navigating to required files, applying custom parameters, saving them after all the required processing is done, closing the application, etc. Also, that single script can use as many tools as needed, whereas with GUI you'll have to repeat such steps with different applications. +You might wonder what advantage does the command line provide for processing images and videos? Apart from being faster, the custom parameters (like border color, border size, quality percentage, etc) are automatically saved as part of the scripts I create. After that, I can just use a single call to the script instead of waiting for a GUI application to open, navigating to the required files, applying custom parameters, saving them after all the required processing is done, closing the application, etc. Also, that single script can use as many tools as needed, whereas with GUI you'll have to repeat such steps with different applications. ## Exercises @@ -655,15 +655,15 @@ type - Display information about command type. **11)** When would you use the `man -k` command? -**12)** Are there any differences between `man` and `info` pages? +**12)** Are there differences between the `man` and `info` pages? # Managing Files and Directories -This chapter presents commands to do things that are typically handled by a file manager in GUI (also known as file explorer). For example, viewing contents of a directory, navigating to other directories, cut/copy/paste files, renaming and so on. Some of the commands used for these purposes are provided by the shell itself. +This chapter presents commands to do things that are typically handled by a file manager in GUI (also known as file explorer). For example, viewing contents of a directory, navigating to other directories, cut/copy/paste files, renaming files and so on. Some of the commands used for these purposes are provided by the shell itself. As a good practice, make it a habit to go through the documentation of the commands you encounter. Getting used to looking up documentation from the command line will come in handy whenever you are stuck. You can also learn and experiment with options you haven't used yet. ->![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. See [Setup](#setup) section for instructions to create the working environment. +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. See the [Setup](#setup) section for instructions to create the working environment. ## Builtin and External commands @@ -673,7 +673,7 @@ From [bash manual: What is a shell?](https://www.gnu.org/software/bash/manual/ba Many of the commands needed for everyday use are external commands, i.e. not part of the shell. Some builtins, `pwd` for example, might also be available as external command on your system (and these might have differences in features too). In such cases the builtin version will be executed by default, which you can override by using the path of the external version. -You can use the `type` command to distinguish between builtin and external commands. The `type` command is a shell builtin, and provides other features too (which will be discussed later). You can use the `-a` option to get all details about the given command. +You can use the `type` command to check if the tool you are using is a builtin or an external command. The `type` command is a shell builtin, and provides other features too (which will be discussed later). You can use the `-a` option to get *all* details about the given command. ```bash $ type -a cd @@ -726,7 +726,7 @@ $ cd - Relative paths are well, relative to the current working directory: * `.` refers to the current directory -* `..` refers to the directory one hierarchy above (i.e. parent directory) +* `..` refers to the directory one hierarchy above (i.e. the parent directory) * `../..` refers to the directory two hierarchies above and so on * `cd ./-` will help you to switch to a directory named `-` in the current location * you cannot use `cd -` since that'll take you to the previous working directory @@ -769,13 +769,13 @@ $ pwd You can use this command to clear the terminal screen. By default, the `clear` command will move the prompt to the top of the terminal as well as try to remove the contents of the scrollback buffer. You can use the `-x` option if you want to retain the scrollback buffer contents. ->![info](images/info.svg) The `Ctrl+l` shortcut will also move the prompt line to the top of the terminal. It will retain any text you've typed on the prompt line and scrollback buffer contents won't be cleared. +>![info](images/info.svg) The `Ctrl+l` shortcut will also move the prompt line to the top of the terminal. It will retain any text you've typed on the prompt line and scrollback buffer contents won't be cleared. ## ls When you use a file explorer GUI application, you'll automatically see the directory contents. And such GUI apps typically have features to show file size, differentiate between files and folders and so on. `ls` is the equivalent command line tool with a plethora of options and functionality related to viewing the contents of directories. ->![info](./images/info.svg) As mentioned earlier, the [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. You can source the `ls.sh` script to follow along the examples shown in this section. See [Setup](#setup) section if you haven't yet created the working environment. +>![info](./images/info.svg) As mentioned earlier, the [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts used in this chapter. You can source the `ls.sh` script to follow along the examples shown in this section. See the [Setup](#setup) section if you haven't yet created the working environment. > > ```bash > # first, cd into the 'scripts' directory @@ -816,7 +816,7 @@ projects: calculator tictactoe ``` -You can use the `-1` option (`1` as in numeric one, not the alphabet `l` which does something else) to list the contents in a single column: +You can use the `-1` option (`1` as in numeric one, not the letter `l` which does something else) to list the contents in a single column: ```bash $ ls -1 backups @@ -916,11 +916,11 @@ lrwxrwxrwx 1 learnbyexample 13 May 7 15:17 scripts -> ../../scripts Filenames starting with `.` are considered as hidden files and these are NOT shown by default. You can use the `-a` option to view them. The `-A` option is similar, but doesn't show the special `.` and `..` entries. ```bash -# . and .. point to the current and parent directories +# . and .. point to the current and parent directories respectively $ ls -aF backups/dot_files/ ./ ../ .bashrc .inputrc .vimrc -# -A will exclude . and .. +# -A will exclude the . and .. entries $ ls -A backups/dot_files/ .bashrc .inputrc .vimrc ``` @@ -952,7 +952,7 @@ game.py books.txt outing.txt ``` -Often you'd want to list only specific files or directories based on some criteria, file extension for example. The shell provides a matching technique called **globs** or **wildcards**. Some simple examples are shown below (see [wildcards](#wildcards) section for more details). +Often you'd want to list only specific files or directories based on some criteria, file extension for example. The shell provides a matching technique called **globs** or **wildcards**. Some simple examples are shown below (see the [wildcards](#wildcards) section for more details). `*` is a placeholder for zero or more characters: @@ -1155,7 +1155,7 @@ Typos like misplaced space, wrong glob, etc could wipe out files not intended fo * using `echo` as a dry run to see how the glob expands * using a trash command (see links below) instead of `rm` -Use `y` for confirmation and `n` to cancel deletion with `-i` or `-I` options. Here's an example of cancelling deletion: +Use `y` for confirmation and `n` to cancel deletion with the `-i` or `-I` options. Here's an example of cancelling deletion: ```bash $ rm -ri projects @@ -1319,7 +1319,7 @@ $ ls -AF backups .bashrc dict/ ip.txt reports/ ``` -You can use the `-t` option if you want to specify the destination before the source paths (helpful with `find` command for example, will be discussed later). Here are some more notable options: +You can use the `-t` option to specify the destination before the source paths (helpful with the `find` command for example, will be discussed later). Here are some more notable options: * `-u` copy files from source only if they are newer or don't exist in the destination * `-b` and `--backup` options will allow you to create backup copies of files already existing in the destination @@ -1328,7 +1328,7 @@ You can use the `-t` option if you want to specify the destination before the so **Further Reading** * `rsync` a fast, versatile, remote (and local) file-copying tool - * [rsync tutorial and examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps) + * [rsync tutorial and examples](https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories) * [syncthing](https://github.com/syncthing/syncthing) — continuous file synchronization program ## mv @@ -1394,7 +1394,7 @@ Here are some more notable options, some of which behave similar to those seen w The `mv` command is useful for simple file renaming. `rename` helps when you need to modify one or more filenames based on a pattern. There are different implementations of the `rename` command, with wildly different set of features. See [askubuntu: What's the difference between the different "rename" commands?](https://askubuntu.com/questions/956010/whats-the-difference-between-the-different-rename-commands) for details. -Perl implementation of the `rename` command will be discussed in this section. You'd need to know regular expressions to use this command. Basic explanations will be given here, more details can be found in the links mentioned at the end of this section. Here's an example to change the file extensions: +Perl implementation of the `rename` command will be discussed in this section. You'd need to know regular expressions to use this command. Basic explanations will be given here and more details can be found in the links mentioned at the end of this section. Here's an example to change the file extensions: ```bash $ mkdir practice_rename @@ -1421,24 +1421,24 @@ $ touch 1.png 3.png 25.png 100.png $ ls 100.png 1.png 25.png 3.png -# use -n option for sanity check +# use the -n option for sanity check # note that 100.png isn't part of the output, since it isn't affected # \d matches a digit character # \d+ matches 1 or more digits (+ is a quantifier to match 1 or more times) # e flag treats the replacement string as Perl code -# $& is a backreference to the matched portion +# $& is a backreference to the entire matched portion $ rename -n 's/\d+/sprintf "%03d", $&/e' *.png rename(1.png, 001.png) rename(25.png, 025.png) rename(3.png, 003.png) -# remove -n option after sanity check to actually rename the files +# remove the -n option after sanity check to actually rename the files $ rename 's/\d+/sprintf "%03d", $&/e' *.png $ ls 001.png 003.png 025.png 100.png ``` -If the new filename already exists, you'll get an error, which you can override with `-f` option if you wish. If you are passing filenames with path components in them, you can use the `-d` option to affect only the filename portion. Otherwise, the logic you are using might affect directory names as well. +If the new filename already exists, you'll get an error, which you can override with the `-f` option if you wish. If you are passing filenames with path components in them, you can use the `-d` option to affect only the filename portion. Otherwise, the logic you are using might affect directory names as well. ```bash $ mkdir projects @@ -1447,12 +1447,12 @@ $ touch projects/toc.sh projects/reports.py # aim is to uppercase the non-extension part of the filename # [^.]+ matches 1 or more non '.' characters # \U changes the characters that follow to uppercase -# $& is a backreference to the matched portion +# $& is a backreference to the entire matched portion $ rename -n -d 's/[^.]+/\U$&/' projects/* rename(projects/reports.py, projects/REPORTS.py) rename(projects/toc.sh, projects/TOC.sh) -# without -d option, directory name will also be affected +# without the -d option, directory name will also be affected $ rename -n 's/[^.]+/\U$&/' projects/* rename(projects/reports.py, PROJECTS/REPORTS.py) rename(projects/toc.sh, PROJECTS/TOC.sh) @@ -1467,7 +1467,7 @@ rename(projects/toc.sh, PROJECTS/TOC.sh) The `ln` command helps you create a link to another file or directory within the same or different location. There are two types of links — **symbolic** links and **hard** links. Symbolic links can point to both files and directories. Here are some characteristics: -* if the original file is deleted or moved to another location, symbolic link will no longer work +* if the original file is deleted or moved to another location, then the symbolic link will no longer work * if the symbolic link is moved to another location, it will still work if the link was done using absolute path (for relative path, it will depend on whether or not there's another file with the same name in that location) * a symbolic link file has its own inode, permissions, timestamps, etc * some commands will work the same when original file or the symbolic file is given as the command line argument, while some require additional options (`du -L` for example) @@ -1542,7 +1542,7 @@ $ ls -F projects/ report.log todos/ # -c option creates a new archive, any existing archive will be overwritten -# -f option allows to specify name of archive to be created +# -f option allows to specify a name for the archive being created # rest of the arguments are the files/directories to be archived $ tar -cf bkp.tar report.log projects @@ -1567,7 +1567,7 @@ $ ls -sh bkp.tar.gz Use the `-t` option if you want to check the contents of the compressed file. This will work with the uncompressed `.tar` version as well. ```bash -$ tar -tf bkp.tar.gz +$ tar -tf bkp.tar.gz report.log projects/ projects/scripts/ @@ -1653,7 +1653,7 @@ There are also commands starting with `z` to work with compressed files, for exa * `zless` to display file contents of a compressed file one screenful at a time * `zgrep` to search compressed files ->![info](images/info.svg) If you need to work with `.zip` files, use `zip` and `unzip` commands. +>![info](images/info.svg) If you need to work with `.zip` files, use the `zip` and `unzip` commands. **Further Reading** @@ -1669,7 +1669,7 @@ There are also commands starting with `z` to work with compressed files, for exa *a)* `pwd` *b)* `echo "$PWD"` -*c)* `echo "$HOME"` +*c)* `echo "$HOME"` **2)** The current working directory has a folder named `-dash`. How would you switch to that directory? @@ -1679,7 +1679,7 @@ There are also commands starting with `z` to work with compressed files, for exa *d)* `cd \-dash` *e)* `cd '-dash'` *f)* all of the above -*g)* only *a)* and *c)* +*g)* only *a)* and *c)* **3)** Given the directory structure as shown below, how would you change to the `todos` directory? @@ -1922,7 +1922,7 @@ $ echo apple;cherry apple cherry: command not found -# using '\;' helps you use ';' as an ordinary character +# '\;' escapes the ';' character, thus losing the metacharacter meaning $ echo apple\;cherry apple;cherry ``` @@ -2014,7 +2014,7 @@ This form of quoting helps you use escape sequences like `\t` for tab, `\n` for $ echo $'fig:\t42' fig: 42 -# \x27 represents single quote character in hexadecimal format +# \x27 represents the single quote character in hexadecimal format $ echo $'@fruits = \x27apple and banana\x27' @fruits = 'apple and banana' @@ -2027,7 +2027,7 @@ fig 42 ball 20 ``` -`printf` is a shell builtin which you can use to format arguments (similar to `C` programming language `printf()` function). This command will be used in many more examples to come. +`printf` is a shell builtin which you can use to format arguments (similar to the `printf()` function from the `C` programming language). This command will be used in many more examples to come. >![info](./images/info.svg) See [bash manual: ANSI-C Quoting](https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) for complete list of supported escape sequences. See `man ascii` for a table of ASCII characters and their numerical representations. @@ -2233,17 +2233,17 @@ From `man bash`: Extended globs are disabled by default. You can use the `shopt` builtin to set/unset **sh**ell **opt**ions like `extglob`, `globstar`, etc. You can also check what is the current status of such options. ```bash -$ shopt extglob +$ shopt extglob extglob off # set extglob -$ shopt -s extglob -$ shopt extglob +$ shopt -s extglob +$ shopt extglob extglob on # unset extglob -$ shopt -u extglob -$ shopt extglob +$ shopt -u extglob +$ shopt extglob extglob off ``` @@ -2313,7 +2313,7 @@ $ set -o history # use vi-style CLI editing interface $ set -o vi -# use emancs-style interface, this is usually the default +# use emacs-style interface, this is usually the default $ set -o emacs ``` @@ -2321,7 +2321,7 @@ You'll see more examples (for example, `set -x`) in later chapters. See [bash ma ## Pipelines -The pipe control operator `|` helps you connect the output of a command as the input of another command. This operator vastly reduces the need for temporary intermediate files. As discussed previously in the [Unix Philosophy](#unix-philosophy) section, command line tools specialize in one task. If you can break down a problem into smaller tasks, the pipe operator will come in handy often. Here are some examples: +The pipe control operator `|` helps you connect the output of a command as the input of another command. This operator vastly reduces the need for temporary intermediate files. As discussed previously in the [Unix Philosophy](#unix-philosophy) section, command line tools usually specialize in a single task. If you can break down a problem into smaller tasks, the pipe operator will come in handy often. Here are some examples: ```bash # change to the 'scripts' directory and source the 'du.sh' script @@ -2335,7 +2335,7 @@ projects report.log todos $ ls -q | wc -l 3 -# report size of files/folders in human readable format +# report the size of files/folders in human readable format # and then sort them based on human readable sizes in ascending order $ du -sh * | sort -h 8.0K todos @@ -2343,7 +2343,7 @@ $ du -sh * | sort -h 7.4M report.log ``` -In the above examples, `ls` and `du` perform their own tasks of displaying list of files and showing file sizes respectively. After that, the `wc` and `sort` commands take care of calculating number of lines and sorting respectively. In such cases, the pipe operator saves you the trouble of dealing with temporary data. +In the above examples, `ls` and `du` perform their own tasks of displaying list of files and showing file sizes respectively. After that, the `wc` and `sort` commands take care of counting and sorting the lines respectively. In such cases, the pipe operator saves you the trouble of dealing with temporary data. Note that the `%q` format specifier in `printf` helps you quote the arguments in a way that is recognizable by the shell. The `-q` option for `ls` substitutes nongraphic characters in the filenames with a `?` character. Both of these are workarounds to prevent the counting process from getting sidetracked due to characters like newline in the filenames. @@ -2379,7 +2379,7 @@ There are three standard data streams: * **standard output** (`stdout` — file descriptor 1) * **standard error** (`stderr` — file descriptor 2) -Both standard output and error are displayed on the terminal by default. The `stderr` stream is used when something goes wrong with the command usage. Each of these three streams have a predefined [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) as mentioned above. In this section, you'll see how to redirect these three streams. +Both the standard output and error streams are displayed on the terminal by default. The `stderr` stream is used when something goes wrong with the command usage. Each of these three streams have a predefined [file descriptor](https://en.wikipedia.org/wiki/File_descriptor) as mentioned above. In this section, you'll see how to redirect these three streams. > ![info](./images/info.svg) Redirections can be placed anywhere, but they are usually used at the start or end of a command. For example, the following two commands are equivalent: > @@ -2395,7 +2395,7 @@ Both standard output and error are displayed on the terminal by default. The `st You can use the `>` operator to redirect the standard output of a command to a file. A number prefix can be added to the `>` operator to work with that particular file descriptor. Default is `1` (recall that the file descriptor for `stdout` is `1`), so `1>` and `>` perform the same operation. Use `>>` to append the output to a file. -The filename provided to the `>` and `>>` operators will be created if a regular file of that name doesn't exist yet. If the file already exists, `>` will overwrite that file and `>>` will append contents to that file. +The filename provided to the `>` and `>>` operators will be created if a regular file of that name doesn't exist yet. If the file already exists, `>` will overwrite that file whereas `>>` will append the contents. ```bash # change to the 'example_files/text_files' directory for this section @@ -2419,7 +2419,7 @@ $ cat op.txt $ rm op.txt ``` ->![info](./images/info.svg) You can use `/dev/null` as a filename to discard the output, to provide an empty file for a command, etc. +>![info](./images/info.svg) You can use `/dev/null` as a filename to discard the output, to provide an empty file as input for a command, etc. >![info](images/info.svg) You can use `set noclobber` to prevent overwriting if a file already exists. When the `noclobber` option is set, you can still overwrite a file by using `>|` instead of the `>` operator. @@ -2520,8 +2520,8 @@ $ rm cmderror.log Newer versions of Bash provide these handy shortcuts: -* `&>` redirect both `stdout` and `stderr` (overwrites an existing file) -* `&>>` redirect both `stdout` and `stderr` (appends to existing file) +* `&>` redirect both `stdout` and `stderr` (overwrite if file already exists) +* `&>>` redirect both `stdout` and `stderr` (append if file already exists) * `|&` pipe both `stdout` and `stderr` as input to another command Here's an example which assumes `xyz.txt` doesn't exist, thus leading to errors: @@ -2581,7 +2581,7 @@ Sometimes, you might mistype a command without providing input. And instead of g Say, you typed `cat` and pressed the Enter key. Seeing the blinking cursor, you type some text and press the Enter key again. You'll see the text you just typed echoed back to you as `stdout` (which is the functionality of the `cat` command). This will continue again and again, until you tell the shell that you are done. How to do that? Press `Ctrl+d` on a fresh line or press `Ctrl+d` twice at the end of a line. In the latter case, you'll not get a newline character at the end of the data. ```bash -# press Enter key and Ctrl+d after typing all the required characters +# press Enter and Ctrl+d after typing all the required characters $ cat knock knock knock knock @@ -2590,7 +2590,7 @@ anybody here? # 'tr' command here translates lowercase to uppercase $ tr 'a-z' 'A-Z' -knock knock +knock knock KNOCK KNOCK anybody here? ANYBODY HERE? @@ -2648,7 +2648,7 @@ mango 10 $ rm fruits.txt ``` -In the above example, the termination string was enclosed in single quotes to prevent parameter expansion, command substitution, etc. You can also use `\string` for this purpose. If you use `<<-` instead of `<<`, leading tab characters can be added at the start of input lines without being part of the actual data. +In the above example, the termination string was enclosed in single quotes as a good practice. Doing so prevents parameter expansion, command substitution, etc. You can also use `\string` for this purpose. If you use `<<-` instead of `<<`, leading tab characters can be added at the start of input lines without being part of the actual data. >![info](./images/info.svg) Just like `$` and a space represents the primary prompt (`PS1` shell variable), `>` and a space at the start of lines represents the secondary prompt `PS2` (applicable for multiline commands). Don't type these characters when you use Here Documents in a shell script. @@ -2656,7 +2656,7 @@ In the above example, the termination string was enclosed in single quotes to pr ### Here Strings -This is similar to Here Documents, but the termination string isn't used. The redirection operator is `<<<`. Here are some examples: +This is similar to Here Documents, but the string is passed as an argument after the `<<<` redirection operator. Here are some examples: ```bash $ tr 'a-z' 'A-Z' <<< hello @@ -2674,7 +2674,7 @@ $ rm op.txt ### Further Reading * [Short introduction to shell redirection](https://mywiki.wooledge.org/BashGuide/InputAndOutput#Redirection) -* [Illustrated Redirection Tutorial](https://wiki.bash-hackers.org/howto/redirection_tutorial) +* [Illustrated Redirection Tutorial](https://web.archive.org/web/20221231120128/https://wiki.bash-hackers.org/howto/redirection_tutorial) * [stackoverflow: Redirect a stream to another file descriptor using >&](https://stackoverflow.com/q/818255/4082052) * [Difference between 2>&1 >foo and >foo 2>&1](https://mywiki.wooledge.org/BashFAQ/055) * [stackoverflow: Redirect and append both stdout and stderr to a file](https://stackoverflow.com/q/876239/4082052) @@ -2682,7 +2682,7 @@ $ rm op.txt ## Grouping commands -You can use `(list)` and `{ list; }` compound commands to redirect content for several commands. The former is executed in a subshell whereas the latter is executed in the current shell context. Spaces around `()` are optional but necessary for the `{}` version. From [bash manual: Lists of Commands](https://www.gnu.org/software/bash/manual/bash.html#Lists): +You can use the `(list)` and `{ list; }` compound commands to redirect content for several commands. The former is executed in a subshell whereas the latter is executed in the current shell context. Spaces around `()` are optional but necessary for the `{}` version. From [bash manual: Lists of Commands](https://www.gnu.org/software/bash/manual/bash.html#Lists): >A `list` is a sequence of one or more pipelines separated by one of the operators `;`, `&`, `&&`, or `||`, and optionally terminated by one of `;`, `&`, or a newline. @@ -2804,7 +2804,7 @@ Difference between the two types of syntax is quoted below from [bash manual: Co ## Process substitution -Instead of a file argument, you can use the output of commands with process substitution. The syntax is `<(list)`. The shell will take care of passing a filename with the standard output of those commands. Here's an example: +Instead of a file argument, you can use command output with process substitution. The syntax is `<(list)`. The shell will take care of passing a filename with the standard output of those commands. Here's an example: ```bash # change to the 'example_files/text_files' directory for this section @@ -2816,7 +2816,7 @@ Cy,97,98,95 Lin,78,83,80 # can also use: paste -d, <(echo 'ID'; seq 3) scores.csv -$ paste -d, <(printf 'ID\n1\n2\n3') scores.csv +$ paste -d, <(printf 'ID\n1\n2\n3') scores.csv ID,Name,Maths,Physics,Chemistry 1,Ith,100,100,100 2,Cy,97,98,95 @@ -2840,7 +2840,7 @@ $ comm -12 <(sort f1.txt) <(sort f2.txt) 3 ``` ->![info](./images/info.svg) See [this unix.stackexchange thread](https://unix.stackexchange.com/q/609375/109046) for examples with `>(list)` form. +>![info](./images/info.svg) See [this unix.stackexchange thread](https://unix.stackexchange.com/q/609375/109046) for examples with the `>(list)` form. ## Exercises @@ -2950,7 +2950,7 @@ todos/ $ ls report* report_2020.txt report_2021.txt report_2022.txt -# use 'cp' command here +# use the 'cp' command here # ??? $ ls report* report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt @@ -3213,21 +3213,21 @@ banana ``` >![warning](./images/warning.svg) If the last line of input doesn't end with a newline, the output will also not have that newline character. - -```bash -$ printf 'apple\nbanana\ncherry' | tac -cherrybanana -apple -``` +> +> ```bash +> $ printf 'apple\nbanana\ncherry' | tac +> cherrybanana +> apple +> ``` ## less -The `cat` command is not suitable for viewing contents of large files in the terminal. The `less` command automatically fits the content to the size of terminal, allows scrolling and has nifty features for effective viewing. Usually, `man` command uses `less` as the `pager` to display the documentation. The navigation options are similar to the Vim text editor. +The `cat` command is not suitable for viewing contents of large files in the terminal. The `less` command automatically fits the content to the size of the terminal, allows scrolling and has nifty features for effective viewing. Typically, the `man` command uses `less` as the `pager` to display the documentation. The navigation options are similar to the Vim text editor. Commonly used commands are given below. You can press the `h` key for builtin help. * `↑` and `↓` arrow keys to move up and down by a line - * you can also use `k` and `j` keys (same keys as those used in the Vim text editor) + * you can also use `k` and `j` keys (same keys as those used by the Vim text editor) * `f` and `b` keys to move forward and backward by a screenful of content * `Space` key also moves forward by a screen * mouse scroll moves up and down by a few lines @@ -3254,7 +3254,7 @@ Similar to the `cat` command, you can use the `-s` option to squeeze consecutive ## tail -By default, `tail` displays the last 10 lines of input file(s). If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `tail -n +N`, you can get all the lines starting from the `N`th line. +By default, `tail` displays the last 10 lines of input files. If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `tail -n +N`, you can get all the lines starting from the `N`th line. Here's an example file that'll be used for illustration purposes: @@ -3277,7 +3277,7 @@ $ cat sample.txt 15) Adios amigo ``` -Here are some examples with `-n` option: +Here are some examples with the `-n` option: ```bash # last two lines (input has 15 lines) @@ -3325,12 +3325,13 @@ bus **Further Reading** * [wikipedia: File monitoring with tail -f and -F options](https://en.wikipedia.org/wiki/Tail_(Unix)#File_monitoring) + * [toolong](https://github.com/Textualize/toolong) — terminal application to view, tail, merge, and search log files * [unix.stackexchange: How does the tail -f option work?](https://unix.stackexchange.com/q/18760/109046) * [How to deal with output buffering?](https://mywiki.wooledge.org/BashFAQ/009) ## head -By default, `head` displays the first 10 lines of input file(s). If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `head -n -N`, you can get all the input lines except the last `N` lines. +By default, `head` displays the first 10 lines of input files. If there are less than 10 lines in the input, only those lines will be displayed. You can use the `-n` option to change the number of lines displayed. By using `head -n -N`, you can get all the input lines except the last `N` lines. ```bash # first three lines @@ -3347,7 +3348,7 @@ $ head -n -11 sample.txt 4) How are you ``` -You can select a range of lines by combining both `head` and `tail` commands. +You can select a range of lines by combining both the `head` and `tail` commands. ```bash # 9th to 11th lines @@ -3384,7 +3385,7 @@ jeep ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which option(s) would you use to get the output shown below? @@ -3438,7 +3439,7 @@ apple banana ``` -**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? +**5)** What is the difference between `less -n` and `less -N` options? Does `cat -n` and `less -n` have similar functionality? **6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? @@ -3488,21 +3489,21 @@ papaya apple ``` -**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. +**10)** Use a combination of the `head` and `tail` commands to get the 11th to 14th characters from the given input. ```bash $ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? carp ``` -**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. +**11)** Extract the starting six bytes from the input files `table.txt` and `fruits.txt`. ```bash # ??? brown banana ``` -**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. +**12)** Extract the last six bytes from the input files `fruits.txt` and `table.txt`. ```bash # ??? @@ -3522,37 +3523,37 @@ Quoting from [wikipedia](https://en.wikipedia.org/wiki/Grep): >**`grep`** is a command-line utility for searching plain-text data sets for lines that match a regular expression. Its name comes from the `ed` command `g/re/p` (**g**lobally search a **r**egular **e**xpression and **p**rint), which has the same effect. -The `grep` command has lots and lots of features, so much so that I wrote [a book](https://github.com/learnbyexample/learn_gnugrep_ripgrep) about it. The most common usage is filtering lines from the input using a regular expression (regexp). +The `grep` command has lots and lots of features, so much so that I wrote [a book](https://github.com/learnbyexample/learn_gnugrep_ripgrep) with hundreds of examples and exercises. The most common usage is filtering lines from the input using a regular expression (regexp). ### Common options -Commonly used options are shown below. Examples will be discussed in later sections. +Commonly used options are listed below. Examples will be discussed in later sections. * `--color=auto` highlight the matching portions, filenames, line numbers, etc using colors -* `-i` ignore case while matching -* `-v` print only non-matching lines +* `-i` ignore case +* `-v` print only the non-matching lines * `-n` prefix line numbers for output lines * `-c` display only the count of output lines * `-l` print only the filenames matching the given expression * `-L` print filenames *not* matching the pattern * `-w` match pattern only as whole words * `-x` match pattern only as whole lines -* `-F` interpret pattern as a fixed string (i.e. not a regular expression) -* `-o` print only matching parts -* `-A N` print matching line and `N` number of lines after the matched line -* `-B N` print matching line and `N` number of lines before the matched line -* `-C N` print matching line and `N` number of lines before and after the matched line +* `-F` interpret pattern as a fixed string (i.e. not as a regular expression) +* `-o` print only the matching portions +* `-A N` print the matching line and `N` number of lines after the matched line +* `-B N` print the matching line and `N` number of lines before the matched line +* `-C N` print the matching line and `N` number of lines before and after the matched line * `-m N` print a maximum of `N` matching lines * `-q` no standard output, quit immediately if match found, useful in scripts * `-s` suppress error messages, useful in scripts -* `-r` recursively search all files in the specified input folders (by default searches current directory) +* `-r` recursively search all files in the specified input folders (by default searches the current directory) * `-R` like `-r`, but follows symbolic links as well * `-h` do not prefix filename for matching lines (default behavior for single input file) * `-H` prefix filename for matching lines (default behavior for multiple input files) ### Literal search -The following examples would all be suited for `-F` option as these do not use regular expressions. `grep` is smart enough to do the right thing in such cases. +The following examples would all be suited for the `-F` option as these do not use regular expressions. `grep` is smart enough to do the right thing in such cases. ```bash # lines containing 'an' @@ -3576,20 +3577,20 @@ tar-par $ printf 'hi\n\nhello\n\n\n\nbye\n' | grep -cx '' 4 -# matching line and two lines after +# print the matching line as well as two lines after $ printf 'red\nblue\ngreen\nbrown\nyellow' | grep -A2 'blue' blue green brown ``` -Here's an example with line numbers and matched portions in color: +Here's an example where the line numbers and matched portions are highlighted in color: ![example with --color option](images/grep_color.png) ### Regular Expressions -By default, `grep` treats the search pattern as Basic Regular Expression (BRE) +By default, `grep` treats the search pattern as Basic Regular Expression (BRE). Here are the various options related to regexp: * `-G` option can be used to specify explicitly that BRE is needed * `-E` option will enable Extended Regular Expression (ERE) @@ -3605,7 +3606,7 @@ The following reference is for **Extended Regular Expressions**. * `$` restricts the match to the end of the string * `\<` restricts the match to the start of word * `\>` restricts the match to the end of word -* `\b` restricts the match to the start/end of words +* `\b` restricts the match to both the start/end of words * `\B` matches wherever `\b` doesn't match **Dot metacharacter and Quantifiers** @@ -3637,7 +3638,7 @@ The following reference is for **Extended Regular Expressions**. * `pat1|pat2|pat3` match `pat1` or `pat2` or `pat3` * `()` group patterns, `a(b|c)d` is same as `abd|acd` * also serves as a capture group -* `\N` backreference, gives matched portion of `N`th capture group +* `\N` backreference, gives the matched portion of the `N`th capture group * `\1` backreference to the first capture group * `\2` backreference to the second capture group and so on up to `\9` @@ -3664,7 +3665,7 @@ $ echo 'I like "mango" and "guava"' | grep -oE '"[^"]+"' "mango" "guava" -# 8 character lines having same 3 lowercase letters at start and end +# 8 character lines having the same 3 lowercase letters at the start and end $ grep -xE '([a-z]{3})..\1' /usr/share/dict/words mesdames respires @@ -3674,7 +3675,7 @@ testates ### Line comparisons between files -The `-f` and `-x` options can be combined to get common lines between two files or the difference when `-v` is used as well. Add `-F` if you want to treat the search strings literally (recall that regexp is the default). +The `-f` and `-x` options can be combined to get the common lines between two files or the difference when `-v` is used as well. Add `-F` if you want to treat the search strings literally (recall that regexp is the default). ```bash # change to the 'scripts' directory and source the 'grep.sh' script @@ -3743,7 +3744,7 @@ backups/ colors_1 colors_2 .hidden projects/ # recursively search in the 'backups' directory $ grep -r 'clear' backups backups/dot_files/.bash_aliases:alias c=clear -# add -h option to prevent filename prefix in the output +# add the -h option to prevent filename prefix in the output $ grep -rh 'clear' backups alias c=clear @@ -3755,12 +3756,12 @@ backups/dot_files/.bash_aliases You can further prune the files to be searched using the *include/exclude* options. Note that these options will work even if recursive search is not active. -| Option | Description | -| -------------------- | -------------- | -| --include=GLOB | search only files that match GLOB | -| --exclude=GLOB | skip files that match GLOB | -| --exclude-from=FILE | skip files that match any file pattern from FILE | -| --exclude-dir=GLOB | skip directories that match GLOB | +| Option | Description | +| ---------------------- | -------------- | +| `--include=GLOB` | search only files that match GLOB | +| `--exclude=GLOB` | skip files that match GLOB | +| `--exclude-from=FILE` | skip files that match any file pattern from FILE | +| `--exclude-dir=GLOB` | skip directories that match GLOB | ```bash # default recursive search @@ -3772,7 +3773,7 @@ projects/shell/hello.sh:echo "Hello, Bash!" $ grep -r --include='*.py' 'Hello' projects/python/hello.py:print("Hello, Python!") -# alternatively, you can use shell globs instead of recursive+include/exclude +# in some cases you can just use shell globs instead recursive grep $ shopt -s globstar $ grep -H 'Hello' **/*.py projects/python/hello.py:print("Hello, Python!") @@ -3832,7 +3833,7 @@ Note that the command passed to `xargs` doesn't accept custom made aliases and f > $ grep -rlZ 'violet' | xargs -0 grep -L 'brown' > (standard input) > -> # using -r option avoids running the command in such cases +> # using the -r option avoids running the command in such cases > $ grep -rlZ 'violet' | xargs -r0 grep -L 'brown' > ``` @@ -3840,7 +3841,7 @@ Note that the command passed to `xargs` doesn't accept custom made aliases and f ### Further Reading -* My ebook [GNU GREP and RIPGREP](https://github.com/learnbyexample/learn_gnugrep_ripgrep) +* My ebook [CLI text processing with GNU grep and ripgrep](https://github.com/learnbyexample/learn_gnugrep_ripgrep) * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) * [Why GNU grep is fast](https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html) * [unix.stackexchange: grep -r vs find+grep](https://unix.stackexchange.com/q/131535/109046) @@ -3851,7 +3852,7 @@ The `find` command has comprehensive features to filter files and directories ba ### Filenames -By default, you'll get every entry (including hidden ones) in the current directory and sub-directories when you use `find` without any options or paths. To search within specific path(s), they should be immediately mentioned after `find`, i.e. before any options. +By default, you'll get every entry (including hidden ones) in the current directory and sub-directories when you use `find` without any options or paths. To search within specific paths, they should be immediately mentioned after `find`, i.e. before any options. ```bash # change to the 'scripts' directory and source the 'find.sh' script @@ -3878,13 +3879,13 @@ todos/TRIP.txt todos/wow.txt ``` ->![info](./images/info.svg) Note that symbolic links won't be followed by default. You can use `-L` option for such cases. +>![info](./images/info.svg) Note that symbolic links won't be followed by default. You can use the `-L` option for such cases. -To match filenames based on a particular criteria, you can use wildcards or regular expressions. For wildcards, you can use `-name` or the case-insensitive version `-iname`. These will match only the basename, so you'll get a warning if you use `/` as part of the pattern. You can use `-path` and `-ipath` if you need to include `/` as well in the pattern. Unlike `grep`, the glob pattern is matched against the entire basename (as there are no start/end anchors in globs). +To match filenames based on a particular criteria, you can use wildcards or regular expressions. For wildcards, you can use the `-name` option or the case-insensitive version `-iname`. These will match only the basename, so you'll get a warning if you use `/` as part of the pattern. You can use `-path` and `-ipath` if you need to include `/` as well in the pattern. Unlike `grep`, the glob pattern is matched against the entire basename (as there are no start/end anchors in globs). ```bash # filenames ending with '.log' -# 'find .' indicates current working directory (CWD) as the path to search +# 'find .' indicates the current working directory (CWD) as the path to search $ find . -name '*.log' ./report.log ./backups/aug.log @@ -3899,7 +3900,7 @@ $ find -iname '*ip*' ./scripts ./ip.txt -# names containing 'k' within 'backups' and 'todos' directories +# names containing 'k' within the 'backups' and 'todos' directories $ find backups todos -name '*k*' backups backups/bookmarks.html @@ -3916,7 +3917,7 @@ todos/books.txt todos/wow.txt ``` -You can use `-regex` and `-iregex` (case-insensitive) to match filenames based on regular expressions. In this case, the pattern will match the entire path, so use of `/` is possible without needing to use special options. The default regexp flavor is `emacs` which you can change by using the `-regextype` option. +You can use the `-regex` and `-iregex` (case-insensitive) options to match filenames based on regular expressions. In this case, the pattern will match the entire path, so `/` can be used without requiring special options. The default regexp flavor is `emacs` which you can change by using the `-regextype` option. ```bash # filename containing only uppercase alphabets and file extension is '.txt' @@ -3961,12 +3962,18 @@ $ find -type l ``` >![info](./images/info.svg) You can use `,` to separate multiple file types. For example, `-type f,l` will match both regular files and symbolic links. +> +> ```bash +> $ find -type f,l -name '*ip*' +> ./scripts +> ./ip.txt +> ``` ### Depth The path being searched is considered as depth `0`, files within the search path are at depth `1`, files within a sub-directory are at depth `2` and so on. Note that these global options should be specified before other kind of options like `-type`, `-name`, etc. -`-maxdepth` option restricts the search to the specified maximum depth: +The `-maxdepth` option restricts the search to the specified maximum depth: ```bash # non-hidden regular files only in the current directory @@ -3980,7 +3987,7 @@ $ find -maxdepth 1 -type f -name '[^.]*' ./ip.txt ``` -`-mindepth` option specifies the minimum depth: +The `-mindepth` option specifies the minimum depth: ```bash # recall that path being searched is considered as depth 0 @@ -4006,7 +4013,7 @@ Consider the following file properties: * `c` status changed * `m` modified -The above prefixes need to be combined with `time` (based on 24 hour periods) or `min` (based on minutes) options. For example, `-mtime` (24 hour) option checks for last modified timestamp and `-amin` (minute) checks for last accessed timestamp. These options accept a number (integer or fractional) argument, that can be further prefixed by `+` or `-` symbols. Here are some examples: +The above prefixes need to be combined with `time` (based on 24 hour periods) or `min` (based on minutes) options. For example, the `-mtime` (24 hour) option checks for the last modified timestamp and `-amin` (minute) checks for the last accessed timestamp. These options accept a number (integer or fractional) argument, that can be further prefixed by the `+` or `-` symbols. Here are some examples: ```bash # modified less than 24 hours ago @@ -4059,9 +4066,9 @@ $ find -type f -size 10c ### Acting on matched files -The `-exec` option helps you to pass the matching files to another command. You can choose to execute the command once for every file (by using `\;`) or just once for all the matching files (by using `+`). However, if the number of files are too many, `find` will use more command invocations as necessary. The `;` character is escaped since it is a shell metacharacter (you can also quote it as an alternative to escaping). +The `-exec` option helps you pass the matching files to another command. You can choose to execute the command once for every file (by using `\;`) or just once for all the matching files (by using `+`). However, if the number of files are too many, `find` will use more command invocations as necessary. The `;` character is escaped since it is a shell metacharacter (you can also quote it as an alternative to escaping). -You need to use `{}` to represent the file(s) passed as argument(s) to the command being executed. Here are some examples: +You need to use `{}` to represent the files passed as arguments to the command being executed. Here are some examples: ```bash # count the number of characters for each matching file @@ -4095,7 +4102,7 @@ $ rm -r rc_files ### Multiple criteria -You can specify multiple matching criteria such as `-name`, `-size`, `-mtime`, etc. You can use operators between them and group them within `\(` and `\)` to construct complex expressions. +Filenames can be matched against multiple criteria such as `-name`, `-size`, `-mtime`, etc. You can use operators between them and group them within `\(` and `\)` to construct complex expressions. * `-a` or `-and` or absence of an operator means both expressions have to be satisfied * second expression won't be evaluated if the first one is false @@ -4147,7 +4154,7 @@ Using `-not -path '*/.git/*' -prune` can be handy when dealing with Git based ve ### find and xargs -Similar to `grep -Z` and `xargs -0` combination seen earlier, you can use `find -print0` and `xargs -0` combination. The `-exec` option is sufficient for most use cases, but `xargs -P` (or the [parallel](https://www.gnu.org/software/parallel/) command) can be handy if you need parallel execution for performance reasons. +Similar to the `grep -Z` and `xargs -0` combination seen earlier, you can use the `find -print0` and `xargs -0` combination. The `-exec` option is sufficient for most use cases, but `xargs -P` (or the [parallel](https://www.gnu.org/software/parallel/) command) can be handy if you need parallel execution for performance reasons. Here's an example of passing filtered files to `sed` (**s**tream **ed**itor, will be discussed in the [Multipurpose Text Processing Tools](#multipurpose-text-processing-tools) chapter): @@ -4189,7 +4196,7 @@ Here are some examples: ## Exercises ->![info](./images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. +>![info](./images/info.svg) For `grep` exercises, use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. >![info](./images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. @@ -4297,12 +4304,12 @@ store_2 **11)** Extract all whole words having the same first and last word character. ```bash -$ echo 'oreo not a _oh_ pip roar took 22' | grep # ??? +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | grep # ??? oreo a _oh_ pip -roar +RoaR 22 ``` @@ -4325,7 +4332,7 @@ hands handle ``` -**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract from the second field to the second last field. In other words, extract fields other than the first and last. ```bash $ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep # ??? @@ -4399,7 +4406,7 @@ backups/jan.log ./hello_world.py ``` -**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. +**20)** Find all regular files whose name do *not* have the lowercase letters `g` to `l`. ```bash # ??? @@ -4434,7 +4441,7 @@ backups/jan.log ./projects/.venv ``` -**24)** Find all regular files at exact depth of `2`. +**24)** Find all regular files at the exact depth of `2`. ```bash # ??? @@ -4497,13 +4504,13 @@ hello_world.py .hidden hi.sh ip.txt # File Properties -In this chapter, you'll learn how to view file details like line and word counts, file and disk sizes, file types, extract parts of file path, etc. You'll also learn how to change file properties like timestamps and permissions. +In this chapter, you'll learn how to view file details like line and word counts, file and disk sizes, file types, extract parts of a file path, etc. You'll also learn how to change file properties like timestamps and permissions. >![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has the scripts and sample input files used in this chapter. ## wc -The `wc` command is typically used to count the number of lines, words and characters for the given input(s). Here are some basic examples: +The `wc` command is typically used to count the number of lines, words and characters for the given inputs. Here are some basic examples: ```bash # change to the 'example_files/text_files' directory @@ -4511,7 +4518,7 @@ $ cat greeting.txt Hi there Have a nice day -# by default, gives newline/word/byte count (in that order) +# by default, wc gives the newline/word/byte count (in that order) $ wc greeting.txt 2 6 25 greeting.txt @@ -4570,7 +4577,7 @@ $ wc -L '/usr/share/dict/words' ``` @@ -4707,20 +4714,20 @@ $ stat -c '%N' words.txt You can also pass multiple file arguments: ```bash -# %s gives file size in bytes +# %s gives the file size in bytes # %n gives filenames $ stat -c '%s %n' ip.txt hi.sh 10 ip.txt 21 hi.sh ``` ->![info](./images/info.svg) ![warning](./images/warning.svg) The `stat` command should be preferred instead of parsing `ls -l` output for file details. See [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) and [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) for explanation and other alternatives. +>![info](./images/info.svg) ![warning](./images/warning.svg) The `stat` command should be preferred instead of parsing the `ls -l` output for file details. See [mywiki.wooledge: avoid parsing output of ls](https://mywiki.wooledge.org/ParsingLs) and [unix.stackexchange: why not parse ls?](https://unix.stackexchange.com/q/128985/109046) for explanation and other alternatives. ## touch -As mentioned earlier, the `touch` command helps you change the timestamps of files. You can do so based on current timestamp, passing an argument, copying the value from another file and so on. +As mentioned earlier, the `touch` command helps you change the timestamps of files. You can do so based on the current timestamp, passing an argument, copying the value from another file and so on. -By default, `touch` updates both access and modification timestamps to the current time. You can use `-a` to change only access timestamp and `-m` to change only modification timestamp. +By default, `touch` updates both the access and modification timestamps to the current time. You can use the `-a` option to change only the access timestamp and `-m` to change only the modification timestamp. ```bash # change to the 'scripts' directory and source the 'touch.sh' script @@ -4731,11 +4738,11 @@ $ stat -c $'%x\n%y' fruits.txt 2017-07-19 17:06:01.523308599 +0530 2017-07-13 13:54:03.576055933 +0530 -# update access and modification values to the current time -$ touch fruits.txt +# update the access and modification values to the current time +$ touch fruits.txt $ stat -c $'%x\n%y' fruits.txt -2022-06-14 13:01:25.921205889 +0530 -2022-06-14 13:01:25.921205889 +0530 +2024-05-14 13:01:25.921205889 +0530 +2024-05-14 13:01:25.921205889 +0530 ``` You can use the `-r` option to copy timestamp information from one file to another. The `-d` and `-t` options will allow you to specify timestamps directly as part of the command. @@ -4744,7 +4751,7 @@ You can use the `-r` option to copy timestamp information from one file to anoth $ stat -c '%y' hi.sh 2022-06-14 13:00:46.170416890 +0530 -# copy modified timestamp from 'ip.txt' to 'hi.sh' +# copy the modified timestamp from 'ip.txt' to 'hi.sh' $ touch -m -r ip.txt hi.sh $ stat -c '%y' hi.sh 2022-05-24 14:39:41.285714934 +0530 @@ -4792,7 +4799,7 @@ $ printf 'hi\r\n' | file - /dev/stdin: ASCII text, with CRLF line terminators ``` -Example for image files: +Here's an example for image files: ```bash # output of 'sunrise.jpg' wrapped for illustration purposes @@ -4805,11 +4812,11 @@ moon.png: PNG image data, 76 x 76, 8-bit colormap, non-interlaced You can use the `-b` option to avoid filenames in the output: ```bash -$ file -b ip.txt +$ file -b ip.txt ASCII text ``` -Here is an example of finding particular type of files, say `image` files. +Here's how you can find particular type of files, images for example. ```bash # assuming filenames do not contain ':' or newline characters @@ -4819,7 +4826,7 @@ $ find -type f -exec file {} + | awk -F: '/\/{print $1}' ./moon.png ``` ->![info](./images/info.svg) See also `identify` command which "describes the format and characteristics of one or more image files". +>![info](./images/info.svg) See also the `identify` command which "describes the format and characteristics of one or more image files". ## basename @@ -4876,7 +4883,7 @@ $ dirname /home/learnbyexample/example_files/scores.csv ../report/backups/ ../report ``` -You can use shell features like command substitution to combine the effects of `basename` and `dirname` commands. +You can use shell features like command substitution to combine the effects of the `basename` and `dirname` commands. ```bash # extract the second last path component @@ -4886,14 +4893,14 @@ example_files ## chmod -You can use the `chmod` command to change file and directory permissions. Consider this example: +You can use the `chmod` command to change permissions. Consider this example: ```bash $ mkdir practice_chmod $ cd practice_chmod $ echo 'learnbyexample' > ip.txt -# this info can also be seen in the first column of 'ls -l' output +# this info can also be seen in the first column of the 'ls -l' output $ stat -c '%A' ip.txt -rw-rw-r-- ``` @@ -4933,7 +4940,7 @@ $ stat -c '%a' ip.txt 664 ``` ->![info](./images/info.svg) Note that the permissions are not straightforward to understand for directories. If a directory only has the `x` permission, you can `cd` into it but you cannot read the contents (using `ls` for example). If a directory only has the `r` permission, you cannot `cd` into it, but you'll be able to read the contents (along with "cannot access" error). For this reason, `rx` permissions are almost always enabled/disabled together. The `w` permission allows you to add or remove contents, provided `x` is active. +>![info](./images/info.svg) Note that the permissions are not straightforward to understand for directories. If a directory only has the `x` permission, you can `cd` into it but you cannot read the contents (using `ls` for example). If a directory only has the `r` permission, you cannot `cd` into it, but you'll be able to read the contents (along with "cannot access" error). For this reason, the `rx` permissions are almost always enabled/disabled together. The `w` permission allows you to add or remove contents, provided `x` is active. **Changing permissions for all three categories** @@ -4985,7 +4992,7 @@ $ umask `umask` value of `0002` means: * read and execute permissions without `ugo` prefix affects all the three categories -* write permissions without `ugo` prefix affects only `user` and `group` categories +* write permissions without `ugo` prefix affects only the `user` and `group` categories Here are some examples without `ugo` prefixes: @@ -5034,12 +5041,12 @@ $ chmod go-x,o-w hi.sh **Further Reading** -* [Linux Permissions Primer](https://danielmiessler.com/study/unixlinux_permissions/) +* [Linux Permissions Primer](https://web.archive.org/web/20220930214830/https://danielmiessler.com/study/unixlinux_permissions/) * [unix.stackexchange: why chmod +w filename not giving write permission to other](https://unix.stackexchange.com/q/429421/109046) ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. >![info](./images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. @@ -5075,9 +5082,9 @@ $ printf 'greeting.txt\0scores.csv' | wc # ??? 6 10 95 total ``` -**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? +**5)** What is the difference between the `wc -c` and `wc -m` options? And which option would you use to get the longest line length? -**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use the `find+du` combination for the first case and the `ls` command (with appropriate shell features) for the second case. ```bash # change to the 'scripts' directory and source the 'du.sh' script @@ -5107,7 +5114,7 @@ $ source du.sh **8)** What does the `du --apparent-size` option do? -**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only the specific fields of interest? **10)** Display the size of `scores.csv` and `timings.txt` files in the format shown below. @@ -5243,7 +5250,7 @@ Here are some definitions that will be handy to know for this chapter's contents Some commands and scripts can take more than few minutes to complete, and you might still need to continue using the shell. If you are not dependent on the current shell environment, you could just open another shell instance and continue working. -Another option is to push the job to the background, either at the time of command invocation itself or after the fact. Make sure to redirect standard output and error to avoid interfering with your continued interactive usage. Appending an `&` character to the command will execute it in the background. +Another option is to push the job to the background, either at the time of command invocation itself or after the fact. Make sure to redirect standard output and error to avoid interfering with your continued interactive usage. Appending `&` to the command will execute it in the background. ```bash $ tkdiff ip.txt ip.txt.bkp & @@ -5281,7 +5288,7 @@ $ sleep 30 ^Z [1]+ Stopped sleep 30 -# bg puts the job considered as the current by the shell to the background +# bg puts the job considered as the current by the shell to the background $ bg [1]+ sleep 30 & @@ -5368,14 +5375,14 @@ $ pgrep -a 'vim' ## kill -Sometimes, a process might not be responding to your interaction, might be taking too long, accidentally uses too much memory, and so on. You can use the `kill` command to manage such processes. +Sometimes, a process might not be responding to your interaction attempts, might be taking too long, accidentally uses too much memory, and so on. You can use the `kill` command to manage such processes. -As mentioned at the beginning of this chapter, these examples are suggested for interactive processes initiated by you (other usage, for example in scripts, will require different strategies). Be 100% sure before you attempt to send signals to manage processes. +As mentioned at the beginning of this chapter, these examples are suggested for interactive processes initiated by you (shell scripts, for example, will require different strategies). Be 100% sure before you attempt to send signals to manage processes. -You can pass signals by name or by their associated number. Use `kill -l` to get a full list of signals. See also [unix.stackexchange: List of Signals](https://unix.stackexchange.com/q/317492/109046) and [unix.stackexchange: What causes various signals to be sent?](https://unix.stackexchange.com/q/6332/109046) +You can pass signals by name or by their associated number. Use `kill -l` to get a full list of signals. See also [unix.stackexchange: List of Signals](https://unix.stackexchange.com/q/317492/109046) and [unix.stackexchange: What causes various signals to be sent?](https://unix.stackexchange.com/q/6332/109046). ```bash -# first 20 signals (out of 64) listed below +# first 20 signals (out of 64) listed below $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 @@ -5384,7 +5391,7 @@ $ kill -l ... ``` -You can use PID or job number to specify the process to which the signal has to be sent. By default, `SIGTERM` (`15`) is sent, which is a polite way to ask the program to terminate. Here's an example: +You can use the PID or job number to specify the process to which the signal has to be sent. By default, `SIGTERM` (`15`) is sent, which is a polite way to ask the program to terminate. Here's an example: ```bash # 'sleep' is used here to emulate a long running process @@ -5420,7 +5427,7 @@ $ kill -20 10051 $ bg [1]+ sleep 100 & -# -s option allows you to specify signal by its name +# the -s option allows you to specify signal by its name # '-s SIGTERM' is optional here, since that is the default $ kill -s SIGTERM 10051 $ @@ -5466,7 +5473,7 @@ Swap: 3.6Gi 0B 3.6Gi **1)** How would you invoke a command to be executed in the background? And what would you do to push a job to the background after it has already been launched? What commands can you use to track active jobs? -**2)** What do `+` and `-` symbols next to job numbers indicate? +**2)** What do the `+` and `-` symbols next to job numbers indicate? **3)** When would you use `fg %n` and `bg %n` instead of just `fg` and `bg` respectively? @@ -5486,9 +5493,9 @@ Swap: 3.6Gi 0B 3.6Gi # Multipurpose Text Processing Tools -Many CLI text processing tools have been in existence for about half a century. And newer tools are being written to solve ever expanding text processing problems. Just knowing that a particular tool exists or searching for a tool before attempting to write your own solution can be a time saver. Also, popular tools are likely to be optimized for speed, hardened against bugs from wide usage, discussed on forums, and so on. +Many CLI text processing tools have been in existence for about half a century. And newer tools are being written to solve the ever expanding text processing problems. Just knowing that a particular tool exists or searching for a tool before attempting to write your own solution can be a time saver. Also, popular tools are likely to be optimized for speed, hardened against bugs due to wide usage, discussed on forums, and so on. -`grep` was already covered in the [Searching Files and Filenames](#searching-files-and-filenames) chapter. In addition, `sed`, `awk` and `perl` are essential tools to solve a wide variety of text processing problems from the command line. In this chapter, you'll learn field processing, use regular expressions for search and replace requirements, perform operations based on multiple lines and files, etc. +`grep` was already covered in the [Searching Files and Filenames](#searching-files-and-filenames) chapter. In addition, `sed`, `awk` and `perl` are essential tools to solve a wide variety of text processing problems from the command line. In this chapter you'll learn field processing, use regular expressions for search and replace requirements, perform operations based on multiple lines and files, etc. >![info](./images/info.svg) The examples presented in this chapter only cover some of the functionalities. I've written separate books to cover these tools with more detailed explanations, examples and exercises. See [https://learnbyexample.github.io/books/](https://learnbyexample.github.io/books/) for links to these books. @@ -5496,11 +5503,11 @@ Many CLI text processing tools have been in existence for about half a century. ## sed -The command name `sed` is derived from **s**tream **ed**itor. Here, stream refers to data being passed via shell pipes. Thus, the command's primary functionality is to act as a text editor for **stdin** data with **stdout** as the output target. You can also edit file input and save the changes back to the same file if needed. +The command name `sed` is derived from **s**tream **ed**itor. Here, stream refers to the data being passed via shell pipes. Thus, the command's primary functionality is to act as a text editor for **stdin** data with **stdout** as the output target. You can also edit file input and save the changes back to the same file if needed. ### Substitution -`sed` has various commands to manipulate text input. The **substitute** command is most commonly used, whose syntax is `s/REGEXP/REPLACEMENT/FLAGS`. Here are some basic examples: +`sed` has various commands to manipulate text input. The **substitute** command is the most commonly used, whose syntax is `s/REGEXP/REPLACEMENT/FLAGS`. Here are some basic examples: ```bash # for each input line, change only the first ',' to '-' @@ -5536,7 +5543,7 @@ $ sed 's/day/weekend/g; s/$/./' greeting.txt Hi there. Have a nice weekend. -# same thing with -e option +# same thing with the -e option $ sed -e 's/day/weekend/g' -e 's/$/./' greeting.txt Hi there. Have a nice weekend. @@ -5563,16 +5570,16 @@ green delight ### Filtering features -`sed` also has features to filter the lines like `grep`. And you can apply other `sed` commands for these filtered lines as needed. +The `sed` command also has features to filter lines based on a search pattern like `grep`. And you can apply other `sed` commands for these filtered lines as needed. ```bash -# -n disables automatic printing -# 'p' command prints the contents of pattern space +# the -n option disables automatic printing +# the 'p' command prints the contents of the pattern space # same as: grep 'at' $ printf 'sea\neat\ndrop\n' | sed -n '/at/p' eat -# 'd' command deletes the matching lines +# the 'd' command deletes the matching lines # same as: grep -v 'at' $ printf 'sea\neat\ndrop\n' | sed '/at/d' sea @@ -5589,7 +5596,7 @@ $ printf '1,2,3,4\na,b,c,d\n' | sed '/2/! s/,/-/g' a-b-c-d ``` -You can use `q` and `Q` commands to quit `sed` once a matching line is found: +You can use the `q` and `Q` commands to quit `sed` once a matching line is found: ```bash # quit after a line containing 'st' is found @@ -5598,7 +5605,7 @@ apple sea east -# matching line won't be printed in this case +# the matching line won't be printed in this case $ printf 'apple\nsea\neast\ndust' | sed '/st/Q' apple sea @@ -5608,7 +5615,7 @@ Apart from regexp, filtering can also be done based on line numbers, address ran ```bash # perform substitution only for the second line -# use '$' instead of a number to indicate last input line +# use '$' instead of a number to indicate the last input line $ printf 'gates\nnot\nused\n' | sed '2 s/t/*/g' gates no* @@ -5651,7 +5658,7 @@ X 035 X 12 26 X $ echo '\[\] and \\w and \[a-zA-Z0-9\_\]' | sed -E 's/(\\?)\\/\1/g' [] and \w and [a-zA-Z0-9_] -# remove two or more duplicate words that are separated by a space +# remove two or more duplicate words that are separated by a space character # \b prevents false matches like 'the theatre', 'sand and stone' etc $ echo 'aa a a a 42 f_1 f_1 f_13.14' | sed -E 's/\b(\w+)( \1)+\b/\1/g' aa a 42 f_1 f_13.14 @@ -5681,13 +5688,13 @@ home path is: /home/learnbyexample ### Further Reading -* My ebook [GNU SED](https://github.com/learnbyexample/learn_gnused) +* My ebook [CLI text processing with GNU sed](https://github.com/learnbyexample/learn_gnused) * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) * [unix.stackexchange: common search and replace examples with sed and other tools](https://unix.stackexchange.com/q/112023/109046) ## awk -`awk` is a programming language and primarily used for field based processing. `awk` also provides filtering capabilities like those supported by `grep` and `sed` along with some more nifty features. And similar to many command line utilities, `awk` can accept input from both `stdin` and files. +`awk` is a programming language and widely used for text processing tasks from the command line. `awk` provides filtering capabilities like those supported by the `grep` and `sed` commands, along with some more nifty features. And similar to many command line utilities, `awk` can accept input from both `stdin` and files. ### Regexp filtering @@ -5705,13 +5712,17 @@ what # same as: grep -v 'e' and sed -n '/e/!p' $ printf 'gate\napple\nwhat\nkite\n' | awk '!/e/' what + +# lines containing 'e' followed by zero or more characters and then 'y' +$ awk '/e.*y/' greeting.txt +Have a nice day ``` ### Awk special variables Brief description for some of the special variables are given below: -* `$0` contains input record content +* `$0` contains the input record content * `$1` first field * `$2` second field and so on * `FS` input field separator @@ -5719,11 +5730,12 @@ Brief description for some of the special variables are given below: * `NF` number of fields * `RS` input record separator * `ORS` output record separator -* `NR` number of records (i.e. line number) +* `NR` number of records (i.e. line number) for entire input +* `FNR` number of records per file ### Default field processing -`awk` automatically splits input into fields based on one or more sequence of **space** or **tab** or **newline** characters. In addition, any of these three characters at the start or end of input gets trimmed and won't be part of field contents. The fields are accessible using `$N` where `N` is the field number you need. You can also pass an expression instead of numeric literal to specify the field required. +`awk` automatically splits input into fields based on one or more sequence of **space** or **tab** or **newline** characters. In addition, any of these three characters at the start or end of input gets trimmed and won't be part of field contents. The fields are accessible using `$N` where `N` is the field number you need. You can also pass an expression instead of numeric literals to specify the field required. Here are some examples: @@ -5742,14 +5754,19 @@ banana # print lines only if the last field is a negative number $ awk '$NF<0' table.txt blue cake mug shirt -7 +``` -# change 'b' to 'B' only for the first field -# gsub() is like the sed substitution command with 'g' flag -# use sub() when 'g' flag is not needed -$ awk '{gsub(/b/, "B", $1)} 1' table.txt -Brown bread mat hair 42 -Blue cake mug shirt -7 -yellow banana window shoes 3.14 +Here's an example of applying a substitution operation for a particular field. + +```bash +# delete lowercase vowels only from the first field +# gsub() is like the sed substitution command with the 'g' flag +# use sub() if you need to change only the first match +# 1 is a true condition, and thus prints the contents of $0 +$ awk '{gsub(/[aeiou]/, "", $1)} 1' table.txt +brwn bread mat hair 42 +bl cake mug shirt -7 +yllw banana window shoes 3.14 ``` ### Condition and Action @@ -5760,7 +5777,7 @@ The examples so far have used a few different ways to construct a typical `awk` awk 'cond1{action1} cond2{action2} ... condN{actionN}' ``` -If a condition isn't provided, the action is always executed. Within a block, you can provide multiple statements separated by a semicolon character. If action isn't provided, then by default, contents of `$0` variable is printed if the condition evaluates to *true*. When action isn't present, you can use semicolon to terminate the condition and start another `condX{actionX}` snippet. +If a condition isn't provided, the action is always executed. Within a block, you can provide multiple statements separated by a semicolon character. If action isn't provided, then by default, contents of `$0` variable is printed if the condition evaluates to *true*. Idiomatically, `1` is used to denote a `true` condition in one-liners as a shortcut to print the contents of `$0` (as seen in an earlier example). When action isn't present, you can use semicolon to terminate the condition and start another `condX{actionX}` snippet. You can use a `BEGIN{}` block when you need to execute something before the input is read and an `END{}` block to execute something after all of the input has been processed. @@ -5774,11 +5791,12 @@ $ seq 2 | awk 'BEGIN{print "---"} 1; END{print "%%%"}' ### Regexp field processing -As seen earlier, `awk` automatically splits input into fields (based on space/tab/newline characters) which are accessible using `$N` where `N` is the field number you need. You can use the `-F` option or `FS` variable to set a regexp based field separator. Use `OFS` variable to set the output field separator. +As seen earlier, `awk` automatically splits input into fields (based on space/tab/newline characters) which are accessible using `$N` where `N` is the field number you need. You can use the `-F` option or assign the `FS` variable to set a regexp based input field separator. Use the `OFS` variable to set the output field separator. ```bash $ echo 'goal:amazing:whistle:kwality' | awk -F: '{print $1}' goal +# one or more alphabets will be considered as the input field separator $ echo 'Sample123string42with777numbers' | awk -F'[a-zA-Z]+' '{print $2}' 123 @@ -5788,9 +5806,16 @@ $ echo "$s" | awk -F'[0-9]+' -v OFS=, '{print $1, $(NF-1)}' Sample,with ``` -You can use `FPAT` to define what characters should make up the fields. `FS` splits the input record whereas `FPAT` matches the fields. The below example finds fields that are enclosed within double quotes or made up of non-comma characters. +The `FS` variable allows you to define the input field *separator*. In contrast, `FPAT` (field pattern) allows you to define what should the fields be made up of. ```bash +# lowercase whole words starting with 'b' +$ awk -v FPAT='\\' -v OFS=, '{$1=$1} 1' table.txt +brown,bread +blue +banana + +# fields enclosed within double quotes or made up of non-comma characters $ s='eagle,"fox,42",bee,frog' $ echo "$s" | awk -v FPAT='"[^"]*"|[^,]*' '{print $2}' "fox,42" @@ -5798,7 +5823,7 @@ $ echo "$s" | awk -v FPAT='"[^"]*"|[^,]*' '{print $2}' ### Record separators -By default, newline is used as input and output record separators. You can change them using the `RS` and `ORS` variables. +By default, newline is used as the input and output record separators. You can change them using the `RS` and `ORS` variables. ```bash # print records containing 'i' as well as 't' @@ -5806,7 +5831,7 @@ $ printf 'Sample123string42with777numbers' | awk -v RS='[0-9]+' '/i/ && /t/' string with -# empty RS is paragraph mode, uses two or more newlines as separator +# empty RS is paragraph mode, uses two or more newlines as the separator $ printf 'apple\nbanana\nfig\n\n\n123\n456' | awk -v RS= 'NR==1' apple banana @@ -5821,7 +5846,7 @@ $ seq 9 | awk '{ORS = NR%3 ? "-" : "\n"} 1' ### State machines -The `condX{actionX}` shortcut makes it easy to code state machines concisely, which is useful to solve problems that depend on contents of multiple records. +The `condX{actionX}` shortcut makes it easy to code state machines concisely. This is useful to solve problems that depend on the contents of multiple records. Here's an example of printing the matching line as well as `c` number of lines that follow: @@ -5875,7 +5900,7 @@ c **end 2** # you can re-arrange and invert the conditions to create other combinations -# for example, exclude ending match +# for example, exclude the ending match $ awk '/start/{f=1} /end/{f=0} f' uniform.txt --start 1-- 1234 @@ -5896,12 +5921,25 @@ have a nice day ### Two files processing -The *key* features used in the solution below: +This section focuses on solving problems which depend upon the contents of two or more files. These are usually based on comparing records and fields. These two files will be used in the examples to follow: + +```bash +$ paste c1.txt c2.txt +Blue Black +Brown Blue +Orange Green +Purple Orange +Red Pink +Teal Red +White White +``` + +The *key* features used to find common lines between two files: * For two files as input, `NR==FNR` will be *true* only when the first file is being processed * `FNR` is record number like `NR` but resets for each input file * `next` will skip the rest of the code and fetch the next record -* `a[$0]` by itself is a valid statement. It will create an uninitialized element in array `a` with `$0` as the key (if the key doesn't exist yet) +* `a[$0]` by itself is a valid statement, creates an uninitialized element in array `a` with `$0` as the key (if the key doesn't exist yet) * `$0 in a` checks if the given string (`$0` here) exists as a key in the array `a` ```bash @@ -5923,7 +5961,7 @@ Pink ### Removing duplicates -`awk '!a[$0]++'` is one of the most famous `awk` one-liners. It eliminates line based duplicates while retaining input order. The following example shows this feature in action along with an illustration of how the logic works. +`awk '!a[$0]++'` is one of the most famous `awk` one-liners. It eliminates line based duplicates while retaining the input order. The following example shows this feature in action along with an illustration of how the logic works. ```bash $ cat purchases.txt @@ -5946,7 +5984,7 @@ $ awk '{print +a[$0] "\t" $0; a[$0]++}' purchases.txt 0 soap 2 tea -# only those entries with zero in first column will be retained +# only those entries with zero in the first column will be retained $ awk '!a[$0]++' purchases.txt coffee tea @@ -5957,9 +5995,10 @@ soap ### Further Reading -* My ebook [GNU AWK](https://github.com/learnbyexample/learn_gnuawk) +* My ebook [CLI text processing with GNU awk](https://github.com/learnbyexample/learn_gnuawk) * See also my blog post [GNU BRE/ERE cheatsheet](https://learnbyexample.github.io/gnu-bre-ere-cheatsheet/) * [Online gawk manual](https://www.gnu.org/software/gawk/manual/) +* My blog post [CLI computation with GNU datamash](https://learnbyexample.github.io/cli-computation-gnu-datamash/) ## perl @@ -5980,12 +6019,12 @@ $ printf 'gate\napple\nwhat\nkite\n' | perl -ne 'print if !/e/' what ``` -The `-e` option accepts code as a command line argument. Many shortcuts are available to reduce the amount of typing needed. In the above examples, a regular expression has been used to filter the input. When the input string isn't specified, the test is performed against special variable `$_`, which has the contents of the current input line. `$_` is also the default argument for many functions like `print` and `length`. To summarize: +The `-e` option accepts code as a command line argument. Many shortcuts are available to reduce the amount of typing needed. In the above examples, a regular expression has been used to filter the input. When the input string isn't specified, the test is performed against the special variable `$_`, which has the contents of the current input line. `$_` is also the default argument for many functions like `print` and `length`. To summarize: * `/REGEXP/FLAGS` is a shortcut for `$_ =~ m/REGEXP/FLAGS` * `!/REGEXP/FLAGS` is a shortcut for `$_ !~ m/REGEXP/FLAGS` -In the examples below, `-p` option is used instead of `-n` option. This helps to automatically print the value of `$_` after processing each input line. +In the examples below, the `-p` option is used instead of `-n`. This helps to automatically print the value of `$_` after processing each input line. ```bash # same as: sed 's/:/-/' and awk '{sub(/:/, "-")} 1' @@ -6005,8 +6044,8 @@ a-b-c-d Brief description for some of the special variables are given below: -* `$_` contains input record content -* `@F` array containing fields (with `-a` and `-F` options) +* `$_` contains the input record content +* `@F` array containing the field contents (with the `-a` and `-F` options) * `$F[0]` first field * `$F[1]` second field and so on * `$F[-1]` last field @@ -6079,7 +6118,7 @@ Here are some examples showing regexp features not present in BRE/ERE: ```bash # reverse lowercase alphabets at the end of input lines -# 'e' flag allows you to use Perl code in the replacement section +# the 'e' flag allows you to use Perl code in the replacement section $ echo 'fig 42apples' | perl -pe 's/[a-z]+$/reverse $&/e' fig 42selppa @@ -6122,11 +6161,11 @@ $ echo "$s" | perl -MList::Util=uniq -F, -lane 'print join ",", uniq @F' * [perldoc: Perl introduction](https://perldoc.perl.org/perlintro) * [perldoc: Regexp tutorial](https://perldoc.perl.org/perlretut) -* My ebook [Perl one-liners](https://github.com/learnbyexample/learn_perl_oneliners) +* My ebook [Perl One-Liners Guide](https://github.com/learnbyexample/learn_perl_oneliners) ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. @@ -6216,8 +6255,8 @@ hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c **8)** Replace all whole words with `X` that start and end with the same word character. ```bash -$ echo 'oreo not a _a2_ roar took 22' | sed # ??? -X not X X X took X +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | sed # ??? +X not X X X X took X Pop ``` **9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. @@ -6249,6 +6288,7 @@ sample item t33m 33l ```bash $ echo 'lion,,ant,road,neon' | sed # ??? lion,,42,road,neon + $ echo ',,,' | sed # ??? ,,42, ``` @@ -6295,7 +6335,7 @@ Cy:98 Lin:83 ``` -**15)** Extract and display third and first words in the format shown below. +**15)** Extract and display the third and first words in the format shown below. ```bash $ echo '%whole(Hello)--{doubt}==ado==' | # ??? @@ -6305,7 +6345,7 @@ $ echo 'just,\joint*,concession_42<=nice' | # ??? concession_42:just ``` -**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. +**16)** For the input file `scores.csv`, add another column named **GP** which is calculated out of 100 by giving 50% weightage to Maths and 25% each for Physics and Chemistry. ```bash $ awk # ??? @@ -6345,14 +6385,14 @@ banana cherry. ``` -**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and the 8th line contains `you`, then the 10th line should be printed. ```bash # ??? 6) Just do-it ``` -**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by the variable `n` passed via the `-v` option. ```bash $ cat blocks.txt @@ -6516,25 +6556,25 @@ As the name implies, this command is used to sort the contents of input files. A ### Common options -Commonly used options are shown below. Examples will be discussed in later sections. +Commonly used options are shown below. Examples will be discussed in the later sections. * `-n` sort numerically * `-g` general numeric sort * `-V` version sort (aware of numbers within text) * `-h` sort human readable numbers (ex: 4K, 3M, 12G, etc) * `-k` sort via key (column sorting) -* `-t` single byte character as field separator (default is non-blank to blank transition) +* `-t` single byte character as the field separator (default is non-blank to blank transition) * `-u` sort uniquely * `-R` random sort * `-r` reverse the sort output -* `-o` redirect sorted result to specified filename (ex: for inplace sorting) +* `-o` redirect sorted result to a specified filename (ex: for inplace sorting) ### Default sort By default, `sort` orders the input [lexicographically](https://en.wikipedia.org/wiki/Lexicographic_order) in ascending order. You can use the `-r` option to reverse the results. ```bash -# default sort +# default sort $ printf 'banana\ncherry\napple' | sort apple banana @@ -6547,17 +6587,19 @@ quiet peace ``` ->![info](./images/info.svg) Use `-f` option if you want to ignore case. See also [coreutils FAQ: Sort does not sort in normal order!](https://www.gnu.org/software/coreutils/faq/#Sort-does-not-sort-in-normal-order_0021). +>![info](./images/info.svg) Use the `-f` option if you want to ignore case. See also [coreutils FAQ: Sort does not sort in normal order!](https://www.gnu.org/software/coreutils/faq/#Sort-does-not-sort-in-normal-order_0021). ### Numerical sort -There are several ways to deal with input containing numbers: +There are several ways to deal with input containing different kind of numbers: ```bash -$ printf '20\n2\n3' | sort -n +$ printf '20\n2\n-3\n111\n3.14' | sort -n +-3 2 -3 +3.14 20 +111 # sorting human readable numbers $ sort -hr file_size.txt @@ -6590,7 +6632,7 @@ CAT ### Column sort -The `-k` option allows you to sort based on specific column(s) instead of the entire input line. By default, the empty string between non-blank and blank characters is considered as the separator. This option accepts arguments in various ways. You can specify starting and ending column numbers separated by a comma. If you specify only the starting column, the last column will be used as the ending column. Usually you just want to sort by a single column, in which case the same number is specified as both the starting and ending columns. Here's an example: +The `-k` option allows you to sort based on specific columns instead of the entire input line. By default, the empty string between non-blank and blank characters is considered as the separator. This option accepts arguments in various ways. You can specify starting and ending column numbers separated by a comma. If you specify only the starting column, the last column will be used as the ending column. Usually you just want to sort by a single column, in which case the same number is specified as both the starting and ending columns. Here's an example: ```bash $ cat shopping.txt @@ -6600,7 +6642,7 @@ Pizza 2 mango 25 Banana 10 -# sort based on 2nd column numbers +# sort based on the 2nd column numbers $ sort -k2,2n shopping.txt Pizza 2 toys 5 @@ -6619,16 +6661,15 @@ This command helps you to identify and remove duplicates. Usually used with sort ### Common options -Commonly used options are shown below. Examples will be discussed in later sections. +Commonly used options are shown below. Examples will be discussed in the later sections. * `-u` display only the unique entries * `-d` display only the duplicate entries * `-D` display all the copies of duplicates * `-c` prefix count * `-i` ignore case while determining duplicates -* `-f` skip first `N` fields - * field separation is based on one or more space/tab characters only -* `-s` skip first `N` characters +* `-f` skip the first `N` fields (separator is space/tab characters) +* `-s` skip the first `N` characters * `-w` restricts the comparison to the first `N` characters ### Default uniq @@ -6715,15 +6756,15 @@ $ sort purchases.txt | uniq -c | sort -nr `uniq` has three options to change the matching criteria to partial parts of the input line. These aren't as powerful as the `sort -k` option, but they do come in handy for some use cases. ```bash -# compare only first 2 characters +# compare only the first 2 characters $ printf '1) apple\n1) almond\n2) banana\n3) cherry\n3) cup' | uniq -w2 1) apple 2) banana 3) cherry -# -f1 skips first field +# -f1 skips the first field # -s2 then skips two characters (including the blank character) -# -w2 uses next two characters for comparison ('bl' and 'ch' in this example) +# -w2 uses the next two characters for comparison ('bl' and 'ch' in this example) $ printf '2 @blue\n10 :black\n5 :cherry\n3 @chalk' | uniq -f1 -s2 -w2 2 @blue 5 :cherry @@ -6785,7 +6826,7 @@ Pink ## join -By default, `join` combines two files based on the first field content (also referred as **key**). Only the lines with common keys will be part of the output. +By default, the `join` command combines two files based on the first field content (also referred as **key**). Only the lines with common keys will be part of the output. The key field will be displayed first in the output (this distinction will come into play if the first field isn't the key). Rest of the line will have the remaining fields from the first and second files, in that order. One or more blanks (space or tab) will be considered as the input field separator and a single space will be used as the output field separator. If present, blank characters at the start of the input lines will be ignored. @@ -6820,11 +6861,11 @@ a f1_y f2_x a f1_y f2_y ``` ->![info](./images/info.svg) There are many more features such as specifying field delimiter, selecting specific fields from each input file in a particular order, filling fields for non-matching lines and so on. See [join chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/join.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook for explanations and examples. +>![info](./images/info.svg) There are many more features such as specifying field delimiter, selecting specific fields from each input file in a particular order, filling fields for non-matching lines and so on. See the [join chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/join.html) from my [CLI text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook for explanations and examples. ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Default `sort` doesn't work for numbers. Correct the command used below: @@ -6874,7 +6915,7 @@ $ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort # ??? 3.14e+4 ``` -**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](#shell-features) chapter. +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see the [Shell Features](#shell-features) chapter. ```bash # ??? @@ -6901,7 +6942,7 @@ $ printf 'red\nred\nred\ngreen\nred\nblue\nblue' | uniq # ??? ``` -**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. +**7)** Retain only the unique entries based on the first two characters of the input lines. Sort the input if necessary. ```bash $ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' @@ -6954,7 +6995,7 @@ In this chapter, you'll learn how to find and report differences between the con ## cmp -The `cmp` command is useful to compare text and binary files. If the two files are same, no output is displayed and exit status is `0`. If there is a difference, it prints the first difference with details like line number and byte location and the exit status will be `1`. +The `cmp` command is useful to compare text and binary files. If the two input files have the same content, no output is displayed and exit status is `0`. If there is a difference, it prints the first difference with details like line number and byte location and the exit status will be `1`. ```bash $ mkdir practice_cmp @@ -6963,7 +7004,7 @@ $ echo 'hello' > x1.txt $ cp x{1,2}.txt $ echo 'hello.' > x3.txt -# files with same content +# files with the same content $ cmp x1.txt x2.txt $ echo $? 0 @@ -6983,14 +7024,14 @@ Useful to find differences between text files. All the differences are printed, ### Common options -Commonly used options are shown below. Examples will be discussed in later sections. +Commonly used options are shown below. Examples will be discussed in the later sections. -* `-i` ignore case while comparing +* `-i` ignore case * `-w` ignore whitespaces * `-b` ignore changes in the amount of whitespace * `-B` ignore only blank lines * `-E` ignore changes due to tab expansion -* `-z` ignore trailing whitespaces at the end of line +* `-z` ignore trailing whitespaces at the end of lines * `-y` two column output * `-r` recursively compare files between the two directories specified * `-s` convey message when two files are same @@ -6998,7 +7039,7 @@ Commonly used options are shown below. Examples will be discussed in later secti ### Default diff -By default, the `diff` output shows lines from the first file input prefixed with `<` and lines from the second file input prefixed with `>`. A line containing `---` is used as the group separator. Each difference is prefixed by a command that indicates the differences (these commands are understood by tools like `patch`). +By default, the `diff` output shows lines from the first input file prefixed with `<` and lines from the second file prefixed with `>`. A line containing `---` is used as the group separator. Each difference is prefixed by a command that indicates the differences (these commands are understood by tools like `patch`). ```bash # change to the 'example_files/text_files' directory @@ -7063,14 +7104,16 @@ world | 4 * `gvimdiff` edit two, three or four versions of a file with GVim and show differences * [GUI diff and merge tools](http://askubuntu.com/questions/2946/what-are-some-good-gui-diff-and-merge-applications-available-for-ubuntu) +* [difftastic](https://github.com/Wilfred/difftastic) — structural diff tool that understands syntax +* [icdiff](https://github.com/jeffkaufman/icdiff) — improved colored diff ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? -**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. +**2)** Which `cmp` option would you use to skip the initial bytes for comparison purposes? The below example requires you to skip the first two bytes. ```bash $ echo '1) apple' > x1.txt @@ -7250,7 +7293,7 @@ $ shuf -n3 -i 100-200 ## cut -`cut` is a handy tool for many field processing use cases. The features are limited compared to `awk` and `perl` commands, but the reduced scope also leads to faster processing. +`cut` is a handy tool for many field processing use cases. The features are limited compared to the `awk` and `perl` commands, but the reduced scope also leads to faster processing. By default, `cut` splits the input content into fields based on the tab character, which you can change using the `-d` option. The `-f` option allows you to select a desired field from each input line. To extract multiple fields, specify the selections separated by the comma character. By default, lines not containing the input delimiter will still be part of the output. You can use the `-s` option to suppress such lines. @@ -7259,11 +7302,11 @@ By default, `cut` splits the input content into fields based on the tab characte $ printf 'apple\tbanana\tcherry\n' | cut -f2 banana -# first and third field +# first and third fields $ printf 'apple\tbanana\tcherry\n' | cut -f1,3 apple cherry -# setting -d automatically changes output delimiter as well +# setting -d automatically changes the output delimiter as well $ echo 'one;two;three;four;five' | cut -d';' -f2,5 two;five ``` @@ -7299,12 +7342,12 @@ one : three : four The `--complement` option allows you to invert the field selections. ```bash -# except second field +# except the second field $ printf 'apple ball cat\n1 2 3 4 5' | cut --complement -d' ' -f2 apple cat 1 3 4 5 -# except first and third fields +# except the first and third fields $ printf 'apple ball cat\n1 2 3 4 5' | cut --complement -d' ' -f1,3 ball 2 4 5 @@ -7329,7 +7372,7 @@ fog ## column -The `column` command is a nifty tool to align input data column wise. By default, whitespace is used as the input delimiter. Space character is used to align the output columns, so whitespace characters like tab will get converted to spaces. +The `column` command is a nifty tool to align the input data column wise. By default, whitespace is used as the input delimiter. Space character is used to align the output columns, so whitespace characters like tab will get converted to spaces. ```bash $ printf 'one two three\nfour five six\nseven eight nine\n' @@ -7410,12 +7453,12 @@ $ echo "$s" | tr -cd 'a-zA-Z.!?[:space:]' Hi there! How are you? All fine here. ``` -The `-s` option will squeeze consecutive repeated characters to a single copy of that character. +The `-s` option changes consecutive repeated characters to a single copy of that character. ```bash # squeeze lowercase alphabets -$ echo 'hhoowwww aaaaaareeeeee yyouuuu!!' | tr -s 'a-z' -how are you!! +$ echo 'HELLO... hhoowwww aaaaaareeeeee yyouuuu!!' | tr -s 'a-z' +HELLO... how are you!! # translate and squeeze $ echo 'hhoowwww aaaaaareeeeee yyouuuu!!' | tr -s 'a-z' 'A-Z' @@ -7461,7 +7504,7 @@ $ paste -d'|' <(seq 3) <(seq 4 5) <(seq 6 8) 2|5|7 3||8 -# note that the space between -d and empty string is necessary here +# note that the space between -d and the empty string is necessary here $ paste -d '' <(seq 3) <(seq 6 8) 16 27 @@ -7520,7 +7563,7 @@ As stated in the above quote from the manual, the `pr` command is mainly used fo $ pr greeting.txt | head -n8 -2022-06-11 10:48 greeting.txt Page 1 +2024-05-17 10:48 greeting.txt Page 1 Hi there @@ -7544,23 +7587,29 @@ $ seq 9 | pr -3t 3 6 9 ``` -You can customize the separator using the `-s` option. The default is a tab character which you can change to any other string value. The `-s` option also turns off line truncation, so `-J` option isn't needed. +You can customize the separator using the `-s` option. The default is a tab character which you can change to any other string value. The `-s` option also turns off line truncation, so the `-J` option isn't needed. Use the `-a` option to merge consecutive lines, similar to the `paste` command example seen earlier. ```bash -# tab separator +# tab is the default separator when no argument is passed to the -s option $ seq 9 | pr -3ts 1 4 7 2 5 8 3 6 9 -# custom separator -$ seq 9 | pr -3ts' : ' -1 : 4 : 7 -2 : 5 : 8 -3 : 6 : 9 +# multicharacter custom separator example +$ seq 9 | pr -3ats' : ' +1 : 2 : 3 +4 : 5 : 6 +7 : 8 : 9 + +# unlike paste, pr doesn't add separators if the last row has less columns to fill +$ seq 10 | pr -4ats, +1,2,3,4 +5,6,7,8 +9,10 ``` -However, the default page width of `72` can still cause issues, which you can prevent by using the `-w` option. The `-w` option overrides the effect of `-s` option on line truncation, so use `-J` option as well unless you really need truncation. +However, the default page width of `72` can still cause issues, which you can prevent by using the `-w` option. The `-w` option overrides the effect of the `-s` option on line truncation, so use the `-J` option as well unless you really need truncation. ```bash $ seq 6 | pr -J -w10 -3ats'::::' @@ -7571,22 +7620,7 @@ $ seq 6 | pr -J -w11 -3ats'::::' 4::::5::::6 ``` -Use the `-a` option to merge consecutive lines, similar to the `paste` command. One advantage is that the `-s` option supports a string value, whereas with `paste` you'd need to use workarounds to get multicharacter separation. - -```bash -# same as: paste -d: - - - - -$ seq 8 | pr -4ats: -1:2:3:4 -5:6:7:8 - -# unlike paste, pr doesn't add separators if the last row has less columns to fill -$ seq 10 | pr -4ats, -1,2,3,4 -5,6,7,8 -9,10 -``` - -Two or more input files can be merged column wise using the `-m` option. As seen before, `-t` is needed to ignore pagination features and `-s` can be used to customize the separator. +Two or more input files can be merged column wise using the `-m` option. As seen before, the `-t` option is needed to ignore pagination features and `-s` can be used to customize the separator. ```bash # same as: paste -d' : ' <(seq 3) /dev/null /dev/null <(seq 4 6) @@ -7598,7 +7632,7 @@ $ pr -mts' : ' <(seq 3) <(seq 4 6) ## rev -The `rev` command reverses each input line character wise. Newline character *won't* be added to the end if it wasn't present in the input. Here are some examples: +The `rev` command reverses each input line character wise. The newline character *won't* be added to the end if it wasn't present in the input. Here are some examples: ```bash $ echo 'This is a sample text' | rev @@ -7616,7 +7650,7 @@ noon ## split -The `split` command is useful to divide the input into smaller parts based on number of lines, bytes, file size, etc. You can also execute another command on the divided parts before saving the results. An example use case is sending a large file as multiple parts as a workaround for online transfer size limits. +The `split` command is useful to divide the input into smaller parts based on the number of lines, bytes, file size, etc. You can also execute another command on the divided parts before saving the results. An example use case is sending a large file as multiple parts as a workaround for online transfer size limits. By default, the `split` command divides the input `1000` lines at a time. Newline character is the default line separator. You can pass a single file or `stdin` data as the input. Use `cat` if you need to concatenate multiple input sources. By default, the output files will be named `xaa`, `xab`, `xac` and so on (where `x` is the prefix). If the filenames are exhausted, two more letters will be appended and the pattern will continue as needed. If the number of input lines is not evenly divisible, the last file will contain less than `1000` lines. @@ -7643,7 +7677,7 @@ $ head -n1 xaa xab xae xaj 9001 ``` ->![info](./images/info.svg) For more examples, customization options and other details, see [split chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/split.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. +>![info](./images/info.svg) For more examples, customization options and other details, see the [split chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/split.html) from my [CLI text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. ## csplit @@ -7653,7 +7687,7 @@ You can split the input into two based on a particular line number. To do so, sp ```bash # split input into two based on line number 2 -# -q option suppresses output showing number of bytes written for each file +# the -q option suppresses output showing number of bytes written for each file $ seq 4 | csplit -q - 2 # first output file will have the first line @@ -7668,7 +7702,7 @@ $ head xx* 4 ``` -You can also split the input based on a line matching the given regular expression. The output produced will vary based on `//` or `%%` delimiters being used to surround the regexp. When `/regexp/` is used, output is similar to the line number based splitting. The first output file will have the input lines *before* the first occurrence of a line matching the given regexp and the second output file will have the rest of the contents. +You can also split the input based on a line matching the given regular expression. The output produced will vary based on the `//` or `%%` delimiters being used to surround the regexp. When `/regexp/` is used, output is similar to the line number based splitting. The first output file will have the input lines *before* the first occurrence of a line matching the given regexp and the second output file will have the rest of the contents. Consider this sample input file: @@ -7717,7 +7751,7 @@ soap tea ``` ->![info](./images/info.svg) For more examples, customization options and other details, see [csplit chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/csplit.html) from my [Command line text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. +>![info](./images/info.svg) For more examples, customization options and other details, see the [csplit chapter](https://learnbyexample.github.io/cli_text_processing_coreutils/csplit.html) from my [CLI text processing with GNU Coreutils](https://github.com/learnbyexample/cli_text_processing_coreutils) ebook. ## xargs @@ -7773,7 +7807,7 @@ dragon unicorn > xerox apple regex go sea > ``` -Use `-d` option to change the input delimiter from whitespace to some other single character. For example: +You can use the `-d` option to specify a custom single character input delimiter. For example: ```bash $ printf '1,2,3,4,5,6' | xargs -d, -n3 @@ -7783,7 +7817,7 @@ $ printf '1,2,3,4,5,6' | xargs -d, -n3 ## Exercises ->![info](./images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](./images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Generate the following sequence. @@ -7803,7 +7837,7 @@ $ printf '1,2,3,4,5,6' | xargs -d, -n3 01.5,02.5,03.5,04.5,05.5 ``` -**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. +**3)** Display three random words from `/usr/share/dict/words` (or an equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. ```bash # ??? @@ -7836,7 +7870,7 @@ $ echo '2,3,4,5,6,7,8' | cut # ??? 2 4 5 6 7 8 ``` -**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? +**7)** Extract the first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? ```bash $ printf 'apple\nbanana\ncherry\ndates\n' | cut # ??? @@ -7876,6 +7910,7 @@ yellow banana window shoes 3.14 ```bash $ echo 'Hello World' | tr # ??? Uryyb Jbeyq + $ echo 'Uryyb Jbeyq' | tr # ??? Hello World ``` @@ -7894,7 +7929,7 @@ $ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr # ??? how are you ``` -**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat all the input files as a single source? ```bash # this works individually for each input file @@ -7962,7 +7997,7 @@ ry es ``` -**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. +**18)** Go through the `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. ```bash # split input by 3 lines (max) at a time @@ -7986,7 +8021,7 @@ tea $ rm xa? ``` -**19)** Go through `split` documentation and use appropriate options to get the output shown below. +**19)** Go through the `split` documentation and use appropriate options to get the output shown below. ```bash $ echo 'apple,banana,cherry,dates' | split # ??? @@ -8028,7 +8063,7 @@ $ rm xx0? **21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. ```bash -$ cat scores.csv +$ cat scores.csv Name,Maths,Physics,Chemistry Ith,100,100,100 Cy,97,98,95 @@ -8058,9 +8093,9 @@ window shoes 3.14 # Shell Scripting -This chapter will cover basics of shell scripting with `bash`. You'll learn about declaring variables, control structures, working with arguments passed to a script, getting user input and so on. +This chapter will cover the basics of shell scripting with `bash`. You'll learn about declaring variables, control structures, working with arguments passed to a script, getting user input and so on. ->![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has all the shell scripts discussed in this chapter. However, it is recommended that you type the scripts manually using your favorite text editor and refer to the `example_files/shell_scripting` directory only if necessary. +>![info](./images/info.svg) The [example_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files) directory has all the shell scripts discussed in this chapter. However, it is recommended that you type the scripts manually using your favorite text editor and refer to the `example_files/shell_scripting` directory only when necessary. ## Need for scripting @@ -8090,7 +8125,7 @@ echo 'Have a nice day' The first line in the above script has two parts: -* `/bin/bash` is the path of `bash` interpreter +* `/bin/bash` is the path of the `bash` interpreter * you can use `type bash` to get the path on your system * `#!` is known as [shebang or hashbang](https://en.wikipedia.org/wiki/Shebang_(Unix)) which directs the program loader to use the interpreter path provided * see also [stackoverflow: comparison between #!/usr/bin/env and #!/bin/bash?](https://stackoverflow.com/q/21612980/4082052) @@ -8101,7 +8136,7 @@ Use `chmod` to add executable permission to the file and then run the script: ```bash $ chmod +x hello.sh -$ ./hello.sh +$ ./hello.sh Hello learnbyexample Today is Wednesday Have a nice day @@ -8171,13 +8206,14 @@ hello Here's a basic example of assigning a variable and accessing its value: ```bash +# note that there cannot be any space characters around the = operator $ name='learnbyexample' $ echo "$name" learnbyexample ``` -As seen above, you need to use the `$` prefix while accessing the value stored in a variable. You can use `${variable}` syntax to distinguish between the variable and other parts of the string. Using appropriate quotes is recommended, unless otherwise necessary. +As seen above, you need to use the `$` prefix while accessing the value stored in a variable. You can use the `${variable}` syntax to distinguish between the variable and other parts of the string. Using appropriate quotes is recommended, unless otherwise necessary. You can append to a variable by using the `+=` operator. Here's an example: @@ -8259,7 +8295,7 @@ mango ## Parameter Expansion -Bash provides several useful ways to extract and modify contents of parameters and variables (including arrays). Some of these features will be discussed in this section. +Bash provides several useful ways to extract and modify the contents of parameters and variables (including arrays). Some of these features will be discussed in this section. *1)* Substring extraction using `${parameter:offset}` syntax to get all characters from the given index: @@ -8302,7 +8338,7 @@ Luck $ echo "${city: -4:2}" kn -# except last 2 characters +# except the last 2 characters $ echo "${city::-2}" Luckn ``` @@ -8319,7 +8355,7 @@ $ echo "${#fruits[@]}" 3 ``` -*4)* `${parameter#glob}` will remove the shortest match from the start of the string. You can also use extended globs if enabled via `shopt` builtin. `${parameter##glob}` will remove the longest match from the start of the string. Here are some examples: +*4)* `${parameter#glob}` will remove the shortest match from the start of the string. You can also use extended globs if enabled via the `shopt` builtin. `${parameter##glob}` will remove the longest match from the start of the string. Here are some examples: ```bash $ s='this is his life history' @@ -8331,7 +8367,7 @@ $ echo "${s#*is}" $ echo "${s##*is}" tory -# assuming extglob is enabled +# assuming extglob is already enabled $ echo "${s#+([^ ])}" his is his life history $ echo "${s##+([^ ])}" @@ -8343,7 +8379,7 @@ $ echo "${fruits[@]#*[aeiou]}" pple g ngo ``` -*5)* You can use `${parameter%glob}` to remove the shortest match from the end of the string. `${parameter%%glob}` will remove the longest match from the end of the string. Here are some examples: +*5)* You can use `${parameter%glob}` to remove the shortest match from the end of the string. `${parameter%%glob}` will remove the longest match from the end of the string. ```bash $ s='this is his life history' @@ -8378,10 +8414,10 @@ this is a s-ple str-g $ echo "${ip/is*s/ X }" th X tring -# deletes first occurrence of 's' +# delete the first occurrence of 's' $ echo "${ip/s}" thi is a sample string -# deletes all occurrences of 's' +# delete all the occurrences of 's' $ echo "${ip//s}" thi i a ample tring ``` @@ -8454,14 +8490,14 @@ ApplE ```bash $ fruit='aPPle' -# swap case only for the first character +# swap case only the first character $ echo "${fruit~}" APPle -# swap case for all the characters +# swap case all the characters $ echo "${fruit~~}" AppLE -# swap case for characters matching the given character set +# swap case characters matching the given character set $ echo "${fruit~~[g-zG-Z]}" appLe ``` @@ -8481,7 +8517,7 @@ echo "No. of lines in '$2' is $(wc -l < "$2")" $ seq 12 > 'test file.txt' -$ bash command_line_arguments.sh hello.sh test\ file.txt +$ bash command_line_arguments.sh hello.sh test\ file.txt No. of lines in 'hello.sh' is 5 No. of lines in 'test file.txt' is 12 ``` @@ -8519,7 +8555,7 @@ $ [[ ! -e xyz.txt ]] ; echo $? 0 ``` -You can use `-d` and `-f` to check if the path is a valid directory and file respectively. The `-s` option checks if the file exists and its size is greater than zero. The `-x` option checks if the file exists and is executable. See `help test` and [bash manual: Conditional Expressions](https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions) for a complete list of such options. +You can use the `-d` and `-f` options to check if the path is a valid directory and file respectively. The `-s` option checks if the file exists and its size is greater than zero. The `-x` option checks if the file exists and is executable. See `help test` and [bash manual: Conditional Expressions](https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions) for a complete list of such options. ### String comparisons @@ -8632,7 +8668,7 @@ $ (( n1 > 30 && n2 < 12 )) && echo 'true' || echo 'false' false ``` ->![info](images/info.svg) Note that the `$` prefix was *not* used for variables in the above example. See [bash manual: Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) for more details. +>![info](images/info.svg) Note that the `$` prefix was *not* used for variables in the above examples. See [bash manual: Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) for more details. ## Accepting user input interactively @@ -8708,10 +8744,10 @@ $ echo $? Sometimes you just need to know if the intended command operation was successful or not and then take an action depending on the outcome. In such cases, you can provide the command directly after the `if` keyword. Note that `stdout` and `stderr` of the command will still be active unless redirected or suppressed using appropriate options. -For example, the `grep` command supports `-q` option to suppress `stdout`. Here's a script using that feature: +For example, the `grep` command supports the `-q` option to suppress `stdout`. Here's a script using that feature: ```bash -$ cat search.sh +$ cat search.sh read -p 'Enter a search pattern: ' search if grep -q "$search" hello.sh ; then @@ -8757,7 +8793,7 @@ Here's a modified example of the last example that accepts user provided command ```bash $ cat for_loop.sh -for file in "$@"; do +for file in "$@"; do echo mv "$file" "$file.bkp" done @@ -8804,7 +8840,7 @@ $ bash while_loop.sh 3 ## Reading a file -The `while` loop combined with the `read` builtin helps you to process the content of a file. Here's an example of reading input contents line by line: +The `while` loop in combination with the `read` builtin can be used to process the content of a file. Here's an example of reading input contents line by line: ```bash $ cat read_file_lines.sh @@ -8819,7 +8855,7 @@ $ bash read_file_lines.sh files.txt 2 greeting.sh ``` -The intention in the above script is to treat each input line literally. So, the `IFS` (input field separator) special variable is set to empty string to prevent stripping of leading and trailing whitespaces. The `-r` option to the `read` builtin allows `\` in input to be treated literally. Note that the input filename is accepted as the first command line argument and redirected as `stdin` to the `while` loop. You also need to make sure that the last line of input ends with a newline character, otherwise the last line won't be processed. +The intention in the above script is to treat each input line literally. So, the `IFS` (input field separator) special variable is set to an empty string to prevent stripping of leading and trailing whitespaces. The `-r` option to the `read` builtin allows `\` in the input to be treated literally. Note that the input filename is accepted as the first command line argument and redirected as `stdin` to the `while` loop. You also need to make sure that the last line of the input ends with a newline character, otherwise the last line won't be processed. You can change `IFS` to split the input line into different fields and specify appropriate number of variables to the `read` builtin. Here's an example: @@ -8902,7 +8938,7 @@ convert -border 10 -bordercolor red lake.png lake_border.png convert -border 20 -bordercolor blue sky.png sky_border.png ``` ->![info](images/info.svg) Use `mogrify` instead of `convert` if you want to modify the input image inplace instead of creating a new image. These image manipulation commands are part of the [ImageMagick](https://imagemagick.org/) suite. As an exercise, modify the above function to generate error if the arguments passed do not match the expected usage. You can also accept output image name (or perhaps a different suffix) as an additional argument. +>![info](images/info.svg) Use `mogrify` instead of `convert` if you want to modify the input image inplace instead of creating a new image. These image manipulation commands are part of the [ImageMagick](https://imagemagick.org/) suite. As an exercise, modify the above function to generate an error if the arguments passed do not match the expected usage. You can also accept an output image name (or perhaps a different suffix) as an additional argument. The shell script and user defined functions (which in turn might call itself or another function) can both have positional arguments. In such cases, the shell takes cares of restoring positional arguments to the earlier state once a function completes its tasks. @@ -8915,7 +8951,7 @@ You can use the following `bash` options for debugging purposes: * `-x` print commands and their arguments as they are executed * `-v` verbose option, print shell input lines as they are read -Here's an example with `bash -x` option: +Here's an example with the `bash -x` option: ```bash $ bash -x search.sh @@ -8976,7 +9012,7 @@ For more information: >![info](images/info.svg) If the script doesn't have a shebang, you can use the `-s` option (`shellcheck -s bash` for example) to specify the shell application. ->![info](images/info.svg) ![warning](./images/warning.svg) Note that `shellcheck` will not catch all types of issues. And suggestions should not be blindly accepted without understanding if that makes sense in the given context. +>![info](images/info.svg) ![warning](./images/warning.svg) Note that `shellcheck` will not catch all types of issues. And suggestions should not be blindly accepted without understanding if it makes sense in the given context. ## Resource lists @@ -8994,26 +9030,26 @@ Here are some more learning resources: * [shellcheck](https://www.shellcheck.net/) — linting tool to avoid common mistakes and improve your script * [Bash reference cheatsheet](https://devmanual.gentoo.org/tools-reference/bash/index.html) — nicely formatted and explained well * [Bash scripting cheatsheet](https://devhints.io/bash) — quick reference to getting started with Bash scripting -* Comprehensive lists on `mywiki.wooledge.org` website: +* Comprehensive lists on the `mywiki.wooledge.org` website: * [Bash FAQ](https://mywiki.wooledge.org/BashFAQ) * [Bash Practices](https://mywiki.wooledge.org/BashGuide/Practices) * [Bash Pitfalls](https://mywiki.wooledge.org/BashPitfalls) * [Google shell style guide](https://google.github.io/styleguide/shellguide.html) * Reliability and robustness * [safe ways to do things in bash](https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md) - * [better scripting](https://robertmuth.blogspot.in/2012/08/better-bash-scripting-in-15-minutes.html) + * [better scripting](https://robertmuth.blogspot.com/2012/08/better-bash-scripting-in-15-minutes.html) * [robust scripting](https://www.davidpashley.com/articles/writing-robust-shell-scripts/) **Specific topics** -* Reading file(s) - * [Reading file](https://mywiki.wooledge.org/BashFAQ/001) +* Reading files + * [Robust way to read files for various use cases](https://mywiki.wooledge.org/BashFAQ/001) * [Loop through the lines of two files in parallel](https://unix.stackexchange.com/q/82541/109046) * [arrays](https://mywiki.wooledge.org/BashGuide/Arrays) * [nameref](https://unix.stackexchange.com/q/288886/109046) * also see this [FAQ](https://mywiki.wooledge.org/BashFAQ/006) * getopts - * [getopts tutorial](https://wiki.bash-hackers.org/howto/getopts_tutorial) + * [getopts tutorial](https://web.archive.org/web/20221226035414/https://wiki.bash-hackers.org/howto/getopts_tutorial) * [handling command-line arguments](https://mywiki.wooledge.org/BashFAQ/035) * [stackoverflow: getopts example](https://stackoverflow.com/q/16483119/4082052) * [Sending and Trapping Signals](https://mywiki.wooledge.org/SignalTrap) @@ -9098,18 +9134,18 @@ $ echo "${#fruits}" # ??? ``` -**9)** For the given array, use parameter expansion to remove characters until first/last space. +**9)** For the given array, use parameter expansion to remove characters until the first/last space. ```bash $ colors=('green' 'dark brown' 'deep sky blue white') -# remove till first space +# remove till the first space $ printf '%s\n' # ??? green brown sky blue white -# remove till last space +# remove till the last space $ printf '%s\n' # ??? green brown @@ -9131,16 +9167,23 @@ apple **11)** Is it possible to achieve the expected outputs shown below using parameter expansion? If so, how? ```bash -$ ip='apple:banana:cherry:dragon' +$ ip1='apple:banana:cherry:dragon' +$ ip2='Cradle:Mistborn:Piranesi' $ echo # ??? apple 42 dragon +$ echo # ??? +Cradle 42 Piranesi $ echo # ??? fig:banana:cherry:dragon +$ echo # ??? +fig:Mistborn:Piranesi $ echo # ??? apple:banana:cherry:end +$ echo # ??? +Cradle:Mistborn:end ``` **12)** For the given input, change case as per the expected outputs shown below. @@ -9166,7 +9209,7 @@ $ [[-f ip.txt]] && echo 'file exists' [[-f: command not found ``` -**14)** What is the difference between `==` and `=~` string comparison operators? +**14)** What is the difference between the `==` and `=~` string comparison operators? **15)** Why does the conditional expression used below show `failed` both times? Modify the expressions such that the first one correctly says `matched` instead of `failed`. @@ -9258,7 +9301,7 @@ number of lines in 'items_1.txt' is: 3 number of lines in 'items_2.txt' is: 5 ``` -**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? +**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as an argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? ```bash $ printf 'apple\nbanana\ncherry\n' > items_1.txt @@ -9306,7 +9349,7 @@ From [wikipedia: Environment variable](https://en.wikipedia.org/wiki/Environment >An environment variable is a dynamic-named value that can affect the way running processes will behave on a computer. They are part of the environment in which a process runs. For example, a running process can query the value of the TEMP environment variable to discover a suitable location to store temporary files, or the HOME or USERPROFILE variable to find the directory structure owned by the user running the process. -See [bash manual: Shell Variables](https://www.gnu.org/software/bash/manual/bash.html#Shell-Variables) for complete list of `bash` variables. Some of them are presented below and some (`HISTCONTROL` for example) will be discussed later in this chapter. +See [bash manual: Shell Variables](https://www.gnu.org/software/bash/manual/bash.html#Shell-Variables) for the complete list of `bash` variables. Some of them are presented below and some (`HISTCONTROL` for example) will be discussed later in this chapter. * `HOME` The current user's home directory; the default for the `cd` builtin command. The value of this variable is also used by tilde expansion * `PS1` The primary prompt string. The default value is `\s-\v\$ ` @@ -9314,7 +9357,7 @@ See [bash manual: Shell Variables](https://www.gnu.org/software/bash/manual/bash * `PATH` A colon-separated list of directories in which the shell looks for commands. A zero-length (null) directory name in the value of `PATH` indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon * `PWD` The current working directory as set by the `cd` builtin * `OLDPWD` The previous working directory as set by the `cd` builtin -* `SHELL` This environment variable expands to the full pathname to the shell +* `SHELL` This environment variable expands to the full pathname of the shell You can use the `printenv` command to display the name and value of all the environment variables. Providing arguments will display the values only for those variables. @@ -9341,7 +9384,7 @@ $ alias p='pwd' $ p /home/learnbyexample/cli-computing -# adding '--color=auto' to 'ls' invocation +# adding '--color=auto' to 'ls' invocations $ type -a ls ls is /bin/ls $ alias ls='ls --color=auto' @@ -9412,7 +9455,7 @@ shopt -s extglob shopt -s globstar ``` -I prefer a simple prompt `PS1='$ '` instead of fancy colors. See [bash manual: Controlling the Prompt](https://www.gnu.org/software/bash/manual/bash.html#Controlling-the-Prompt) for customization options. You can use [bashrcgenerator](https://bashrcgenerator.com/) to easily generate fancy prompts. See also [starship](https://starship.rs/) which is a minimal, blazing-fast, and infinitely customizable prompt for any shell. +I prefer a simple prompt `PS1='$ '` instead of fancy colors. See [bash manual: Controlling the Prompt](https://www.gnu.org/software/bash/manual/bash.html#Controlling-the-Prompt) for customization options. See also [starship](https://starship.rs/) which is a minimal, blazing-fast, and infinitely customizable prompt for any shell. Some history customizations are shown below. See [bash manual: History Facilities](https://www.gnu.org/software/bash/manual/bash.html#Bash-History-Facilities) for more details. See also [unix.stackexchange: common history across sessions](https://unix.stackexchange.com/q/18212/109046). @@ -9423,7 +9466,7 @@ HISTCONTROL=ignorespace:erasedups # maximum number of history lines in the current shell session # older entries will be overwritten if the size is exceeded -# use negative number for unlimited size +# use a negative number for unlimited size HISTSIZE=2000 # maximum number of lines in the history file @@ -9449,12 +9492,12 @@ alias la='l -A' alias grep='grep --color=auto' -# save last command in history to a reference file +# save the last command from history to a reference file alias sl='fc -ln -1 | sed "s/^\s*//" >> ~/.saved_cmds.txt' alias slg='< ~/.saved_cmds.txt grep' # case insensitive file search -# fs foo is same as find -iname '*foo*' +# fs search is same as find -iname '*search*' fs() { find -iname '*'"$1"'*' ; } ``` @@ -9471,6 +9514,8 @@ $ cat ~/.inputrc # use up/down arrow to match history based on starting text of the command "\e[A": history-search-backward "\e[B": history-search-forward +# use history-substring-search-backward and history-substring-search-forward +# if you want to match anywhere in the command line # ignore case for filename matching and completion set completion-ignore-case on @@ -9488,6 +9533,7 @@ set show-all-if-ambiguous on * [Shell config subfiles](https://blog.sanctum.geek.nz/shell-config-subfiles/) * [unix.stackexchange: when to use alias, functions and scripts](https://unix.stackexchange.com/q/30925/109046) * [unix.stackexchange: what does rc in bashrc stand for](https://unix.stackexchange.com/q/3467/109046) +* [sxhkd hotkey daemon](https://github.com/baskerville/sxhkd) ## Readline shortcuts @@ -9495,7 +9541,7 @@ Quoting from [bash manual: Readline Interaction](https://www.gnu.org/software/ba >Often during an interactive session you type in a long line of text, only to notice that the first word on the line is misspelled. The Readline library gives you a set of commands for manipulating the text as you type it in, allowing you to just fix your typo, and not forcing you to retype the majority of the line. Using these editing commands, you move the cursor to the place that needs correction, and delete or insert the text of the corrections. -By default, command line editing bindings are styled after [Emacs](https://www.gnu.org/software/emacs/) (a text editor). You can switch to Vi mode (another text editor) if you wish. This section will discuss some of the often used Emacs style key bindings. +By default, the command line editing bindings are styled after [Emacs](https://www.gnu.org/software/emacs/) (a text editor). You can switch to Vi mode (another text editor) if you wish. This section will discuss some of the often used Emacs-style key bindings. ### Tab completion @@ -9507,11 +9553,11 @@ Use `set show-all-if-ambiguous on` as seen earlier in the [.inputrc](#inputrc) s ### Searching history -You can use `Ctrl+r` to search command history. After pressing this key sequence, type characters you wish to match from history, then press the `Esc` key to return to the command prompt or press `Enter` to execute the command. +You can use `Ctrl+r` to search through the command history. After pressing this key sequence, type characters you wish to match from history, then press the `Esc` key to return to the command prompt or press `Enter` to execute the command. You can press `Ctrl+r` repeatedly to move backwards through matching entries and `Ctrl+s` to move forwards. If `Ctrl+s` is not working as expected, see [unix.stackexchange: disable ctrl-s](https://unix.stackexchange.com/q/332791/109046). -As discussed in the [.inputrc](#inputrc) section, you can use custom key mappings to search based on starting characters of the command. +As discussed in the [.inputrc](#inputrc) section, you can use custom key mappings instead of the default offerings. ### Moving the cursor @@ -9519,8 +9565,8 @@ The documentation uses **Meta** (`M-` prefix) and notes that this key is labeled * `Alt+b` move the cursor to the start of the current or previous word * `Alt+f` move the cursor to the end of the next word -* `Ctrl+a` or `Home` move cursor to the beginning of the command line -* `Ctrl+e` or `End` move cursor to the end of the command line +* `Ctrl+a` or `Home` move the cursor to the beginning of the command line +* `Ctrl+e` or `End` move the cursor to the end of the command line >![info](./images/info.svg) One difference between `Alt` and `Esc` combinations is that you can keep pressing `b` or `f` while holding the `Alt` key down. The `Esc` combinations are two different key presses, whereas `Alt` has to be kept pressed down for the shortcut to take effect. @@ -9554,6 +9600,7 @@ The documentation uses **Meta** (`M-` prefix) and notes that this key is labeled * [bash manual: Bindable Readline Commands](https://www.gnu.org/software/bash/manual/bash.html#Bindable-Readline-Commands) * [wiki.archlinux: Simpler introduction to Readline](https://wiki.archlinux.org/title/readline) * [Efficient command line navigation](https://cupfullofcode.com/blog/2013/07/03/efficient-command-line-navigation/index.html) +* [Bash the interface and Bash the language](https://ratfactor.com/slackware/pkgblog/bash) ## Copy and paste @@ -9563,7 +9610,7 @@ Shortcuts for copy-paste operations in the terminal are shown below. You might b * `Shift+Ctrl+v` paste clipboard contents * `Shift+Insert` paste the last highlighted portion (not necessarily the clipboard contents) -You can also press middle mouse button instead of the `Shift+Insert` shortcut. This is not limited to the terminal, works in many other applications too. You can use the `xinput` command to enable/disable mouse button clicks. First, use `xinput` without any arguments and spot the number corresponding to your mouse. As an example, assuming the device number is `11`, you can use the following commands: +You can also press the middle mouse button instead of the `Shift+Insert` shortcut. This is not limited to the terminal, works in many other applications too. You can use the `xinput` command to enable/disable mouse button clicks. First, use `xinput` without any arguments and spot the number corresponding to your mouse. As an example, assuming the device number is `11`, you can use the following commands: * `xinput set-button-map 11 1 0 3` to disable middle button click * `xinput set-button-map 11 1 2 3` to enable middle button click @@ -9609,7 +9656,7 @@ $ hw hw: command not found ``` -**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. +**5)** Write an alias and a function to display the contents of the `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. ```bash $ echo "$PATH" @@ -9636,7 +9683,7 @@ $ f_p **8)** What does the binding `set completion-ignore-case on` do? -**9)** Which shortcut helps you interactively search command history? +**9)** Which shortcut helps you interactively search the command history? **10)** What do the shortcuts `Alt+b` and `Alt+f` do? @@ -9646,5 +9693,5 @@ $ f_p **13)** What do the shortcuts `Alt+t` and `Ctrl+t` do? -**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? +**14)** Is there a difference between the `Shift+Insert` and `Shift+Ctrl+v` shortcuts? diff --git a/exercises/exercise-solutions.md b/exercises/exercise-solutions.md index 3dcf707..4bc3b68 100644 --- a/exercises/exercise-solutions.md +++ b/exercises/exercise-solutions.md @@ -99,7 +99,7 @@ column (1) - columnate lists git-column (1) - Display data in columns ``` -**12)** Are there any differences between `man` and `info` pages? +**12)** Are there differences between the `man` and `info` pages? The Linux manual pages are usually shortened version of the full documentation. You can use the `info` command to view the complete documentation for GNU tools. `info` is also a TUI application, but with different key configuration compared to the `man` command. See [GNU Manuals Online](https://www.gnu.org/manual/manual.html) if you'd prefer to read them from a web browser. You can also download them in formats like PDF for offline usage. @@ -113,7 +113,7 @@ The Linux manual pages are usually shortened version of the full documentation. *a)* `pwd` *b)* `echo "$PWD"` -*c)* `echo "$HOME"` +*c)* `echo "$HOME"` Answer: *c)* `echo "$HOME"` @@ -125,7 +125,7 @@ Answer: *c)* `echo "$HOME"` *d)* `cd \-dash` *e)* `cd '-dash'` *f)* all of the above -*g)* only *a)* and *c)* +*g)* only *a)* and *c)* Answer: *g)* only *a)* and *c)* @@ -570,7 +570,7 @@ $ touch report_202{0..2}.txt $ ls report* report_2020.txt report_2021.txt report_2022.txt -# use 'cp' command here +# use the 'cp' command here $ cp report_2021.txt{,.bkp} $ ls report* report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt @@ -658,7 +658,7 @@ apple_3_banana_8 *a)* `1>` — redirect the standard output of a command to a file *b)* `2>` — redirect the standard error of a command to a file *c)* `&>` — redirect both `stdout` and `stderr` (overwrites an existing file) -*d)* `&>>` — redirect both `stdout` and `stderr` (appends to existing file) +*d)* `&>>` — redirect both `stdout` and `stderr` (appends to an existing file) *e)* `|&` — pipe both `stdout` and `stderr` as input to another command **21)** What will be the contents of `op.txt` if you use the following `grep` command? @@ -784,7 +784,7 @@ The outputs are not equivalent because brace expansion creates all combinations ## Viewing Part or Whole File Contents ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which option(s) would you use to get the output shown below? @@ -821,7 +821,7 @@ mango papaya banana -$ tac fruits.txt ip.txt +$ tac fruits.txt ip.txt mango papaya banana @@ -830,7 +830,7 @@ light orange deep blue ``` -No, the output are not same because `tac` reverses content separately for each input file. +No. The outputs are different because `tac` reverses content separately for each input file. **4)** Go through the manual for the `tac` command and use appropriate options and arguments to get the output shown below. @@ -860,13 +860,13 @@ banana > >use STRING as the separator instead of newline -**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? +**5)** What is the difference between `less -n` and `less -N` options? Does `cat -n` and `less -n` have similar functionality? `less -N` enables line numbering and `less -n` disables numbering. `cat -n` enables line numbering, so it doesn't function similar to `less -n`. **6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? -You can use `:e filename` to open another file (similar to the Vim text editor). You can use `:p` and `:n` to switch between previous and next files. +You can use `:e filename` to open another file (similar to the Vim text editor). You can use `:p` and `:n` to switch between the previous and next files. **7)** Use appropriate commands and shell features to get the output shown below. @@ -914,7 +914,7 @@ papaya apple ``` -**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. +**10)** Use a combination of the `head` and `tail` commands to get the 11th to 14th characters from the given input. ```bash # can also use: tail -c +11 | head -c4 @@ -922,14 +922,14 @@ $ printf 'apple\nfig\ncarpet\njeep\nbus\n' | head -c14 | tail -c +11 carp ``` -**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. +**11)** Extract the starting six bytes from the input files `table.txt` and `fruits.txt`. ```bash $ head -q -c6 table.txt fruits.txt brown banana ``` -**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. +**12)** Extract the last six bytes from the input files `fruits.txt` and `table.txt`. ```bash $ tail -q -c6 fruits.txt table.txt @@ -941,7 +941,7 @@ mango ## Searching Files and Filenames ->![info](../images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. +>![info](../images/info.svg) For `grep` exercises, use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. >![info](../images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. @@ -1060,12 +1060,12 @@ $ echo "$words" | grep -owE 's\w*(t\w*e|e\w*t)\w*' ```bash # can also use: grep -owE '(\w)(\w*\1)?' -$ echo 'oreo not a _oh_ pip roar took 22' | grep -owE '\w|(\w)\w*\1' +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | grep -owE '\w|(\w)\w*\1' oreo a _oh_ pip -roar +RoaR 22 ``` @@ -1088,7 +1088,7 @@ hands handle ``` -**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract from the second field to the second last field. In other words, extract fields other than the first and last. ```bash $ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep -oP ',\K.+(?=,)' @@ -1162,7 +1162,7 @@ $ find -type f -name '*.[psv]*' ./hello_world.py ``` -**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. +**20)** Find all regular files whose name do *not* have the lowercase letters `g` to `l`. ```bash # can also use: find -type f ! -name '*[g-l]*' @@ -1200,7 +1200,7 @@ $ find -type d -name '.?*' ./projects/.venv ``` -**24)** Find all regular files at exact depth of `2`. +**24)** Find all regular files at the exact depth of `2`. ```bash $ find -mindepth 2 -maxdepth 2 -type f @@ -1296,7 +1296,7 @@ From [unix.stackexchange: pros and cons of find and locate](https://unix.stackex ## File Properties ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. >![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. @@ -1338,7 +1338,7 @@ $ printf 'greeting.txt\0scores.csv' | wc --files0-from=- >read input from the files specified by NUL-terminated names in file >F; If F is - then read names from standard input -**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? +**5)** What is the difference between the `wc -c` and `wc -m` options? And which option would you use to get the longest line length? >`-c, --bytes` > @@ -1352,7 +1352,7 @@ $ printf 'greeting.txt\0scores.csv' | wc --files0-from=- > >print the maximum display width -**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use the `find+du` combination for the first case and the `ls` command (with appropriate shell features) for the second case. ```bash # change to the 'scripts' directory and source the 'du.sh' script @@ -1390,7 +1390,7 @@ $ du -sc --si * >('sparse') files, internal fragmentation, indirect blocks, and the >like -**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only the specific fields of interest? `df` gives space usage for the entire file system whereas `du` is useful to get space estimate for specific files and directories. @@ -1464,7 +1464,7 @@ UTF-8 Unicode text **15)** Is the following command valid? If so, what would be the output? -Yes, it is valid. Multiple slashes will be considered as a single slash. +Yes, it is valid. Multiple slashes will be considered as a single slash. Any trailing slashes will be removed before determining the portion to be extracted. ```bash $ basename -s.txt ~///test.txt/// @@ -1570,7 +1570,7 @@ $ stat -c '%a %A' test_dir * `Ctrl+z` (suspend the current running job) followed by `bg` (push the recently suspended job to the background) * `jobs` or `ps` will help to track active jobs -**2)** What do `+` and `-` symbols next to job numbers indicate? +**2)** What do the `+` and `-` symbols next to job numbers indicate? From `info bash` (section *Job Control Basics*): @@ -1632,7 +1632,7 @@ free (1) - Display amount of free and used memory in the system ## Multipurpose Text Processing Tools ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. @@ -1744,9 +1744,9 @@ hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c **8)** Replace all whole words with `X` that start and end with the same word character. ```bash -# can also use: sed -E 's/\b(\w)(\w*\1)?\b/X/g' -$ echo 'oreo not a _a2_ roar took 22' | sed -E 's/\b(\w|(\w)\w*\2)\b/X/g' -X not X X X took X +# can also use: sed -E 's/\b(\w|(\w)\w*\2)\b/X/g' +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | sed -E 's/\b(\w)(\w*\1)?\b/X/g' +X not X X X X took X Pop ``` **9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. @@ -1778,6 +1778,7 @@ sample item t33m 33l ```bash $ echo 'lion,,ant,road,neon' | sed 's/[^,]*/42/3' lion,,42,road,neon + $ echo ',,,' | sed 's/[^,]*/42/3' ,,42, ``` @@ -1832,7 +1833,7 @@ $ perl -F, -lane 'print "$F[0]:$F[2]"' scores.csv $ perl -F, -lane 'print join ":", @F[0,2]' scores.csv ``` -**15)** Extract and display third and first words in the format shown below. +**15)** Extract and display the third and first words in the format shown below. ```bash $ echo '%whole(Hello)--{doubt}==ado==' | awk -v FPAT='\\w+' '{print $3 ":" $1}' @@ -1846,7 +1847,7 @@ $ echo '%whole(Hello)--{doubt}==ado==' | perl -lne '@F = /\w+/g; print "$F[2]:$F $ echo 'just,\joint*,concession_42<=nice' | perl -lne '@F = /\w+/g; print "$F[2]:$F[0]"' ``` -**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. +**16)** For the input file `scores.csv`, add another column named **GP** which is calculated out of 100 by giving 50% weightage to Maths and 25% each for Physics and Chemistry. ```bash $ awk -F, -v OFS=, '{$(NF+1) = NR==1 ? "GP" : ($2/2 + ($3+$4)/4)} 1' scores.csv @@ -1886,7 +1887,7 @@ banana cherry. ``` -**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and the 8th line contains `you`, then the 10th line should be printed. ```bash $ awk 'p2 ~ /you/ && /do/; {p2=p1; p1=$0}' sample.txt @@ -1896,7 +1897,7 @@ $ awk 'p2 ~ /you/ && /do/; {p2=p1; p1=$0}' sample.txt $ perl -ne 'print if $p2 =~ /you/ && /do/; $p2=$p1; $p1=$_' sample.txt ``` -**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by the variable `n` passed via the `-v` option. ```bash $ cat blocks.txt @@ -2055,7 +2056,7 @@ yellow banana WINDOW shoes 3.14 ## Sorting Stuff ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Default `sort` doesn't work for numbers. Correct the command used below: @@ -2109,7 +2110,7 @@ $ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort -g > >compare according to general numerical value -**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](./shell-features.md) chapter. +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see the [Shell Features](./shell-features.md) chapter. ```bash $ (sed -u '1q' ; sort -t, -k2,2n) < scores.csv @@ -2122,7 +2123,7 @@ Ith,100,100,100 **5)** Sort the contents of `duplicates.txt` by the fourth column numbers in descending order. Retain only the first copy of lines with the same number. ```bash -$ sort -t, -k4,4nr -u duplicates.txt +$ sort -t, -k4,4nr -u duplicates.txt dark red,sky,rose,555 blue,ruby,water,333 dark red,ruby,rose,111 @@ -2141,7 +2142,7 @@ red blue ``` -**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. +**7)** Retain only the unique entries based on the first two characters of the input lines. Sort the input if necessary. ```bash $ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' @@ -2193,7 +2194,7 @@ fig 5 10 ## Comparing Files ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? @@ -2201,7 +2202,7 @@ fig 5 10 > >suppress all normal output -**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. +**2)** Which `cmp` option would you use to skip the initial bytes for comparison purposes? The below example requires you to skip the first two bytes. ```bash $ echo '1) apple' > x1.txt @@ -2277,7 +2278,7 @@ $ rm d[12].txt ## Assorted Text Processing Tools ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Generate the following sequence. @@ -2297,9 +2298,10 @@ $ seq -w -s, 01.5 6 01.5,02.5,03.5,04.5,05.5 ``` -**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. +**3)** Display three random words from `/usr/share/dict/words` (or an equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. ```bash +# can also use: grep 's' /usr/share/dict/words | grep 'e' | grep 't' | shuf -n3 $ grep -P '^(?=.*s)(?=.*e).*t' /usr/share/dict/words | shuf -n3 supplemental foresight @@ -2347,7 +2349,7 @@ $ echo '2,3,4,5,6,7,8' | cut -d, --output-delimiter=' ' --complement -f2 2 4 5 6 7 8 ``` -**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? +**7)** Extract the first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? ```bash $ printf 'apple\nbanana\ncherry\ndates\n' | cut -c-3 @@ -2389,6 +2391,7 @@ yellow banana window shoes 3.14 ```bash $ echo 'Hello World' | tr 'a-zA-Z' 'n-za-mN-ZA-M' Uryyb Jbeyq + $ echo 'Uryyb Jbeyq' | tr 'a-zA-Z' 'n-za-mN-ZA-M' Hello World ``` @@ -2407,7 +2410,7 @@ $ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr -sd '!' 'a-z' how are you ``` -**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat all the input files as a single source? ```bash # this works individually for each input file @@ -2461,7 +2464,7 @@ $ seq -w 16 | pr -4ts, **16)** Use the `pr` command to join the input files `fruits.txt` and `ip.txt` as shown below. ```bash -$ pr -mts' : ' fruits.txt ip.txt +$ pr -mts' : ' fruits.txt ip.txt banana : deep blue papaya : light orange mango : blue delight @@ -2476,9 +2479,12 @@ le na ry es + +# alternate solutions +$ printf 'apple\nbanana\ncherry\ndates\n' | grep -o '..$' ``` -**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. +**18)** Go through the `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. ```bash # split input by 3 lines (max) at a time @@ -2506,7 +2512,7 @@ $ rm xa? > >put NUMBER lines/records per output file -**19)** Go through `split` documentation and use appropriate options to get the output shown below. +**19)** Go through the `split` documentation and use appropriate options to get the output shown below. ```bash $ echo 'apple,banana,cherry,dates' | split -t, -l1 @@ -2553,7 +2559,7 @@ $ rm xx0? **21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. ```bash -$ cat scores.csv +$ cat scores.csv Name,Maths,Physics,Chemistry Ith,100,100,100 Cy,97,98,95 @@ -2569,6 +2575,8 @@ Chemistry,100,95,80 $ datamash -t, transpose items_1.txt @@ -3011,7 +3026,7 @@ $ hw hw: command not found ``` -**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. +**5)** Write an alias and a function to display the contents of the `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. ```bash $ echo "$PATH" @@ -3063,7 +3078,7 @@ Any negative number. >completion in a case-insensitive fashion. The default value >is `off`. -**9)** Which shortcut helps you interactively search command history? +**9)** Which shortcut helps you interactively search the command history? >To search backward in the history for a particular string, type `C-r`. Typing `C-s` searches forward through the history. @@ -3104,7 +3119,7 @@ Any negative number. >past that word as well. If the insertion point is at the end of >the line, this transposes the last two words on the line. -**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? +**14)** Is there a difference between the `Shift+Insert` and `Shift+Ctrl+v` shortcuts? * `Shift+Ctrl+v` pastes clipboard contents * `Shift+Insert` pastes the last highlighted portion (not necessarily the clipboard contents) diff --git a/exercises/exercises.md b/exercises/exercises.md index 4e0f2d7..c891a12 100644 --- a/exercises/exercises.md +++ b/exercises/exercises.md @@ -47,7 +47,7 @@ type - Display information about command type. **11)** When would you use the `man -k` command? -**12)** Are there any differences between `man` and `info` pages? +**12)** Are there differences between the `man` and `info` pages?
    @@ -59,7 +59,7 @@ type - Display information about command type. *a)* `pwd` *b)* `echo "$PWD"` -*c)* `echo "$HOME"` +*c)* `echo "$HOME"` **2)** The current working directory has a folder named `-dash`. How would you switch to that directory? @@ -69,7 +69,7 @@ type - Display information about command type. *d)* `cd \-dash` *e)* `cd '-dash'` *f)* all of the above -*g)* only *a)* and *c)* +*g)* only *a)* and *c)* **3)** Given the directory structure as shown below, how would you change to the `todos` directory? @@ -397,7 +397,7 @@ todos/ $ ls report* report_2020.txt report_2021.txt report_2022.txt -# use 'cp' command here +# use the 'cp' command here # ??? $ ls report* report_2020.txt report_2021.txt report_2021.txt.bkp report_2022.txt @@ -559,7 +559,7 @@ $ printf '%s\n' {1..3},item_{1..3} ## Viewing Part or Whole File Contents ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which option(s) would you use to get the output shown below? @@ -613,7 +613,7 @@ apple banana ``` -**5)** What is the difference between `less -n` and `less -N` options? Do `cat -n` and `less -n` have similar functionality? +**5)** What is the difference between `less -n` and `less -N` options? Does `cat -n` and `less -n` have similar functionality? **6)** Which command would you use to open another file from within an existing `less` session? And which commands would you use to navigate between previous and next files? @@ -663,21 +663,21 @@ papaya apple ``` -**10)** Use a combination of `head` and `tail` commands to get the 11th to 14th characters from the given input. +**10)** Use a combination of the `head` and `tail` commands to get the 11th to 14th characters from the given input. ```bash $ printf 'apple\nfig\ncarpet\njeep\nbus\n' | # ??? carp ``` -**11)** Extract starting six bytes from the input files `table.txt` and `fruits.txt`. +**11)** Extract the starting six bytes from the input files `table.txt` and `fruits.txt`. ```bash # ??? brown banana ``` -**12)** Extract last six bytes from the input files `fruits.txt` and `table.txt`. +**12)** Extract the last six bytes from the input files `fruits.txt` and `table.txt`. ```bash # ??? @@ -689,7 +689,7 @@ mango ## Searching Files and Filenames ->![info](../images/info.svg) For `grep` exercises, use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. +>![info](../images/info.svg) For `grep` exercises, use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files, unless otherwise specified. >![info](../images/info.svg) For `find` exercises, use the `find.sh` script, unless otherwise specified. @@ -797,12 +797,12 @@ store_2 **11)** Extract all whole words having the same first and last word character. ```bash -$ echo 'oreo not a _oh_ pip roar took 22' | grep # ??? +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | grep # ??? oreo a _oh_ pip -roar +RoaR 22 ``` @@ -825,7 +825,7 @@ hands handle ``` -**14)** Input lines have three or more fields separated by a `,` delimiter. Extract second field to second last field. In other words, extract fields other than first and last. +**14)** Input lines have three or more fields separated by a `,` delimiter. Extract from the second field to the second last field. In other words, extract fields other than the first and last. ```bash $ printf 'apple,fig,cherry\ncat,dog,bat\n' | grep # ??? @@ -899,7 +899,7 @@ backups/jan.log ./hello_world.py ``` -**20)** Find all regular files whose name do *not* have the lower case alphabets `g` to `l`. +**20)** Find all regular files whose name do *not* have the lowercase letters `g` to `l`. ```bash # ??? @@ -934,7 +934,7 @@ backups/jan.log ./projects/.venv ``` -**24)** Find all regular files at exact depth of `2`. +**24)** Find all regular files at the exact depth of `2`. ```bash # ??? @@ -999,7 +999,7 @@ hello_world.py .hidden hi.sh ip.txt ## File Properties ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises, unless otherwise specified. >![info](../images/info.svg) Create a temporary directory for exercises that may require you to create some files and directories. You can delete such practice directories afterwards. @@ -1035,9 +1035,9 @@ $ printf 'greeting.txt\0scores.csv' | wc # ??? 6 10 95 total ``` -**5)** What is the difference between `wc -c` and `wc -m` options? And which option would you use to get the longest line length? +**5)** What is the difference between the `wc -c` and `wc -m` options? And which option would you use to get the longest line length? -**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use `find+du` combination for the first case and `ls` command (with appropriate shell features) for the second case. +**6)** Find filenames ending with `.log` and report their sizes in human readable format. Use the `find+du` combination for the first case and the `ls` command (with appropriate shell features) for the second case. ```bash # change to the 'scripts' directory and source the 'du.sh' script @@ -1067,7 +1067,7 @@ $ source du.sh **8)** What does the `du --apparent-size` option do? -**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only specific fields of interest? +**9)** When will you use the `df` command instead of `du`? Which `df` command option will help you to report only the specific fields of interest? **10)** Display the size of `scores.csv` and `timings.txt` files in the format shown below. @@ -1191,7 +1191,7 @@ $ stat -c '%a %A' test_dir **1)** How would you invoke a command to be executed in the background? And what would you do to push a job to the background after it has already been launched? What commands can you use to track active jobs? -**2)** What do `+` and `-` symbols next to job numbers indicate? +**2)** What do the `+` and `-` symbols next to job numbers indicate? **3)** When would you use `fg %n` and `bg %n` instead of just `fg` and `bg` respectively? @@ -1213,7 +1213,7 @@ $ stat -c '%a %A' test_dir ## Multipurpose Text Processing Tools ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Replace all occurrences of `0xA0` with `0x50` and `0xFF` with `0x7F` for the given input. @@ -1303,8 +1303,8 @@ hi[42]bye nice[42]1[42]3 bad42 cool_[42][42]a 42c **8)** Replace all whole words with `X` that start and end with the same word character. ```bash -$ echo 'oreo not a _a2_ roar took 22' | sed # ??? -X not X X X took X +$ echo 'oreo not a _oh_ pip RoaR took 22 Pop' | sed # ??? +X not X X X X took X Pop ``` **9)** For the input file `anchors.txt`, convert markdown anchors to hyperlinks as shown below. @@ -1336,6 +1336,7 @@ sample item t33m 33l ```bash $ echo 'lion,,ant,road,neon' | sed # ??? lion,,42,road,neon + $ echo ',,,' | sed # ??? ,,42, ``` @@ -1382,7 +1383,7 @@ Cy:98 Lin:83 ``` -**15)** Extract and display third and first words in the format shown below. +**15)** Extract and display the third and first words in the format shown below. ```bash $ echo '%whole(Hello)--{doubt}==ado==' | # ??? @@ -1392,7 +1393,7 @@ $ echo 'just,\joint*,concession_42<=nice' | # ??? concession_42:just ``` -**16)** For the input file `scores.csv`, add another column named `GP` which is calculated out of `100` by giving `50%` weightage to `Maths` and `25%` each for `Physics` and `Chemistry`. +**16)** For the input file `scores.csv`, add another column named **GP** which is calculated out of 100 by giving 50% weightage to Maths and 25% each for Physics and Chemistry. ```bash $ awk # ??? @@ -1432,14 +1433,14 @@ banana cherry. ``` -**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and 8th line contains `you`, then 10th line should be printed. +**19)** For the input file `sample.txt`, print a matching line containing `do` only if `you` is found two lines before. For example, if `do` is found on line number 10 and the 8th line contains `you`, then the 10th line should be printed. ```bash # ??? 6) Just do-it ``` -**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by variable `n` passed via the `-v` option. +**20)** For the input file `blocks.txt`, extract contents from a line containing exactly `%=%=` until but not including the next such line. The block to be extracted is indicated by the variable `n` passed via the `-v` option. ```bash $ cat blocks.txt @@ -1595,7 +1596,7 @@ yellow banana WINDOW shoes 3.14 ## Sorting Stuff ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Default `sort` doesn't work for numbers. Correct the command used below: @@ -1645,7 +1646,7 @@ $ printf '+120\n-1.53\n3.14e+4\n42.1e-2' | sort # ??? 3.14e+4 ``` -**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see [Shell Features](./shell-features.md) chapter. +**4)** Sort the `scores.csv` file numerically in ascending order using the contents of the second field. Header line should be preserved as the first line as shown below. *Hint*: see the [Shell Features](./shell-features.md) chapter. ```bash # ??? @@ -1672,7 +1673,7 @@ $ printf 'red\nred\nred\ngreen\nred\nblue\nblue' | uniq # ??? ``` -**7)** Retain only unique entries based on the first two characters of the input lines. Sort the input if necessary. +**7)** Retain only the unique entries based on the first two characters of the input lines. Sort the input if necessary. ```bash $ printf '3) cherry\n1) apple\n2) banana\n1) almond\n' @@ -1721,11 +1722,11 @@ fig 5 10 ## Comparing Files ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Which `cmp` option would you use if you just need the exit status reflecting whether the given inputs are same or not? -**2)** Which `cmp` option would you use to skip initial bytes for comparison purposes? The below example requires you to skip the first two bytes. +**2)** Which `cmp` option would you use to skip the initial bytes for comparison purposes? The below example requires you to skip the first two bytes. ```bash $ echo '1) apple' > x1.txt @@ -1784,7 +1785,7 @@ $ rm d[12].txt ## Assorted Text Processing Tools ->![info](../images/info.svg) Use [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. +>![info](../images/info.svg) Use the [example_files/text_files](https://github.com/learnbyexample/cli-computing/tree/master/example_files/text_files) directory for input files used in the following exercises. **1)** Generate the following sequence. @@ -1804,7 +1805,7 @@ $ rm d[12].txt 01.5,02.5,03.5,04.5,05.5 ``` -**3)** Display three random words from `/usr/share/dict/words` (or equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. +**3)** Display three random words from `/usr/share/dict/words` (or an equivalent dictionary word file) containing `s` and `e` and `t` in any order. The output shown below is just an example. ```bash # ??? @@ -1837,7 +1838,7 @@ $ echo '2,3,4,5,6,7,8' | cut # ??? 2 4 5 6 7 8 ``` -**7)** Extract first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? +**7)** Extract the first three characters from the input lines as shown below. Can you also use the `head` command for this purpose? If not, why not? ```bash $ printf 'apple\nbanana\ncherry\ndates\n' | cut # ??? @@ -1877,6 +1878,7 @@ yellow banana window shoes 3.14 ```bash $ echo 'Hello World' | tr # ??? Uryyb Jbeyq + $ echo 'Uryyb Jbeyq' | tr # ??? Hello World ``` @@ -1895,7 +1897,7 @@ $ echo '!!hhoowwww !!aaaaaareeeeee!! yyouuuu!!' | tr # ??? how are you ``` -**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat input as a single source? +**13)** `paste -s` works separately for multiple input files. How would you workaround this if you needed to treat all the input files as a single source? ```bash # this works individually for each input file @@ -1963,7 +1965,7 @@ ry es ``` -**18)** Go through `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. +**18)** Go through the `split` documentation and use appropriate options to get the output shown below for the input file `purchases.txt`. ```bash # split input by 3 lines (max) at a time @@ -1987,7 +1989,7 @@ tea $ rm xa? ``` -**19)** Go through `split` documentation and use appropriate options to get the output shown below. +**19)** Go through the `split` documentation and use appropriate options to get the output shown below. ```bash $ echo 'apple,banana,cherry,dates' | split # ??? @@ -2029,7 +2031,7 @@ $ rm xx0? **21)** Write a generic solution that transposes comma delimited data. Example input/output is shown below. You can use any tool(s) presented in this book. ```bash -$ cat scores.csv +$ cat scores.csv Name,Maths,Physics,Chemistry Ith,100,100,100 Cy,97,98,95 @@ -2139,18 +2141,18 @@ $ echo "${#fruits}" # ??? ``` -**9)** For the given array, use parameter expansion to remove characters until first/last space. +**9)** For the given array, use parameter expansion to remove characters until the first/last space. ```bash $ colors=('green' 'dark brown' 'deep sky blue white') -# remove till first space +# remove till the first space $ printf '%s\n' # ??? green brown sky blue white -# remove till last space +# remove till the last space $ printf '%s\n' # ??? green brown @@ -2172,16 +2174,23 @@ apple **11)** Is it possible to achieve the expected outputs shown below using parameter expansion? If so, how? ```bash -$ ip='apple:banana:cherry:dragon' +$ ip1='apple:banana:cherry:dragon' +$ ip2='Cradle:Mistborn:Piranesi' $ echo # ??? apple 42 dragon +$ echo # ??? +Cradle 42 Piranesi $ echo # ??? fig:banana:cherry:dragon +$ echo # ??? +fig:Mistborn:Piranesi $ echo # ??? apple:banana:cherry:end +$ echo # ??? +Cradle:Mistborn:end ``` **12)** For the given input, change case as per the expected outputs shown below. @@ -2207,7 +2216,7 @@ $ [[-f ip.txt]] && echo 'file exists' [[-f: command not found ``` -**14)** What is the difference between `==` and `=~` string comparison operators? +**14)** What is the difference between the `==` and `=~` string comparison operators? **15)** Why does the conditional expression used below show `failed` both times? Modify the expressions such that the first one correctly says `matched` instead of `failed`. @@ -2299,7 +2308,7 @@ number of lines in 'items_1.txt' is: 3 number of lines in 'items_2.txt' is: 5 ``` -**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? +**21)** Write a shell script named `read_file.sh` that reads a file line by line to be passed as an argument to the `paste -sd,` command. Can you also write a solution using the `xargs` command instead of a script? ```bash $ printf 'apple\nbanana\ncherry\n' > items_1.txt @@ -2380,7 +2389,7 @@ $ hw hw: command not found ``` -**5)** Write an alias and a function to display the contents of `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. +**5)** Write an alias and a function to display the contents of the `PATH` environment variable on separate lines by changing `:` to the newline character. Sample output is shown below. ```bash $ echo "$PATH" @@ -2407,7 +2416,7 @@ $ f_p **8)** What does the binding `set completion-ignore-case on` do? -**9)** Which shortcut helps you interactively search command history? +**9)** Which shortcut helps you interactively search the command history? **10)** What do the shortcuts `Alt+b` and `Alt+f` do? @@ -2417,5 +2426,5 @@ $ f_p **13)** What do the shortcuts `Alt+t` and `Ctrl+t` do? -**14)** Is there any difference between `Shift+Insert` and `Shift+Ctrl+v` shortcuts? +**14)** Is there a difference between the `Shift+Insert` and `Shift+Ctrl+v` shortcuts? diff --git a/images/cli_computing_ls.png b/images/cli_computing_ls.png index f301ff4c5d6cd920446523e2556b639ece9e93d7..5a45819a26ef337064ba876dfef5bcd9da72b1a9 100644 GIT binary patch delta 59842 zcmb4qWmH^E(B_?Ckl-Y^1$TFXdvF2-w?G2H-Ga=7;7)KSK=9zMgS)%C26qXtyx;Dg zvw!!`oSA#8tDbtQySk^lYxNQwv49Y*1+uBoHU}Z|uyXLSa`4A?foN&CzkK50;I@&qigCh?Q52Mp_oImW8SQxeWxbGIbNr_4D@bDFF%-{JrAR;2J ztxR9v+~t&%et~)C*Ve@4nw<5FMRdFfcKdRaOa5Q>K&`I)nv!#6+%4bWu@IEO(c~;^J!C zJ2bVl*ETkSQ&VbM=B%|eacPwll$6)jmIi#^wRCi`l9Nw(y*5>l6R!h_!{Mz547Eq3P#=%f!%Y}F3-GQzY`sffi~zfLahNBa3LCpxGF zdoD$qa>aWWSg^{NWxo;RZgPQgiO2>jWCsD|`pkSrx?ZIL{>@L9`~UW5e*Yed)n|TM zuV30YdZ!n@y?@@GAF5*HX;=~$@2+I;5oIsM7$4t79j5z9kX}sbYkzgJYjti@qN9&0 zb4+RlTk5yh7Si`cf{!y9nf+}Y^V7>&zN2f)JVGvyBaz`P6_2%=hSn)iV@uzEU9Mez z%$`Ao#^1Ebg!pb|WW)e~0+5%M(DYb1Ocx2;>LY^H#2}1^Gzi&5c9z`0R}g;u2#COc z$0<1>Z_7oCH0}4z%-u#d z7q!Gjk+}aPXxgLg%-0p!tQ5KVf&hm+0bwv84g&xbYybd(0Sa*dfS>^7GN31c^%F&8 zF%UT`kQNSy90oz1~$cu@QWzQ>HcI?;t4Wa0AT!d)!nj&g8-L* zbt=~BW!y>t{&%1%%o3}DN&r<+fSnj)xVXX+k4D=J+L~H@&km5DdSW3k^EyoXSc|C zBEXsrT*^6D6muQWn6L9ytL4=C6sshZDN{DnMK z!ZktMG^I`0ATR|ylL-z1QHjGw%hAFCC=LaDetiT&sHvPlqno}U_54s|hefZe0okmO z($icnmWqj2h6f7ln!bcy&mB-=l>yGE%=lW3V09>#C@4`p;GFg@eRz;{BE38XqbjCkquH zj=d<_ie~Y@g-pu9o@9ea#JxnRcGM|>{F?iRKPi&EJGx%4nM%J?1yAb3R z5>8KFq?22mYZ*vw$DN@kD+z;wKjP#ZDBZ^{DP70jB)j_3j?QXZP+b;Okf{CCBS#){fCs+$?@Fh#ifedXxYMlujD7We7f za{YixslZyJB+DT?OmlW&}abv2g%+lN0XLPE$b( zU*c0@M5jh1#MpI(ZhAHD>Z0so5CmN#YaEGzI7?fs$Vu3aWEHLZ}s;5R?C93Z?X1e$7PEIt z+sZjV&G0r2U>l0yuIYY+W8y#nP>5zwy4N!T#Ofxmd`MeW_2bFY z9E+so?-m@$@mY5Jn%$TKe2G_K(I)&0;jI=M)q5GoYc4SlAZXDtie|zl`JgbGQkkOiJtb-%NAcMIrfQGa9kf}mo_)m#GvaS)nQ@b3KS7&RC7K=vxN01gXnADCWF>her zJ7fC4QNqV1&MZZIaMWmP>|H_kxugT_m=?~pgdC72LFk^u%T;It0(g&|x7nM$AliKDUeGKyDMIEe@8$V_c z7nJ)OYFF|zEEzIx&JtE_CC#sk{x;HDkT~bea6RbVc@x@L#H@nBKtpl*SqE7_ zT9aj}>sA(Ks_Ij-TjP55U$R{D|In0Oz{6Hs>%%^M49>p2Ey#0df-okrA!;=^1lqqWfZ#`qC15b`PZ__bm?3NO0T{n^y%lxdC%nTf$>L4ZQ7>Fl~n!0 zx@DfxM!G3;uiwd{4!u&y@hiOd>9M)NVc`!Eh*-wn>k2mC* zURj@r5D6_l9R2EBasNodcBq1N`0b4|w8?VT+Uzn%UvydBJ42pmag@A=Ul>~0{a@$F z`(5vL2zB|Ju|coON_tF`O^}Mrkux;04Y6v5Q)%tb^V@KK_0CDCEp>@mF6N=32Z+9h7P;y33FL+|UjwedHIl z0+;A7AGpasoU=b9Zav*B9-*B6C+XFEDplW}r@CBueUkcEbEaM0MlK4*t<<7Eujo@% zT8!s0?%bO`deApy^Nkm6HLR;XYQdqXK=2VpOY6h4J`{cZ_~%D6G^7KsCw8gtmAQs; z$%jib$n9wSaAVyf@<@k}#Y~4qUuWC%RTktuWSfmd9 z!CS@6Qlis8DA8SRaSQ)YabT1s3@+}|fe!YU`8}Tycqux*aM;e^dQgIx79vqq`DxDR z)gagS8itU8VZvxY$_RN-_E$iKd+*2x4}>d)K-I((Ml5+4SLl&EPQj`PMdoMiF9jXTIxc~%HXH)Nh;hyPq}G_kwKrF_ zV+*tHWV6jUAW55`Ed7`*7-bfU!;lammd?~-9G<=7X9XX( zH*;7cOt&)eKkt?5arCMsT>c4^2T=L{a2s_T*2l>zfl`zm{zc{Q#|h5;dd_ur*);k+ zq$k3McYwrKu88Qg8JD(G8d7lZ5#m7<8cbqH&A-59_nivmSw)~nHrHFg1ZCq>YBf<6 zPjH_y@$BVrQ>67uB;X1$j6Hz_7jyg}<@LHcex-)}nY1z?HHVQGlwoTc0(@ET{Qzm1 zGGP9-4CSI(NBT_B@Wl9;G%jj~_|^8?PUoNyyEkAL`Ua^3VH(iSIZTNO0dFI&V^kO``Ad>eUQ9A zV%HEN^|}uB$B$Z?y6(F71_F~;nl16+_O|^0JjU$mC=V!}tC2USb8$}3*$oCiejIS< z*Ne*3#-NTvS{J?;B0Pks#5-0PYYIou2e~--MV{fk;yBA;3>|vI&}frEU|Etx1RY8y zVgDCPuPBx+_nmL%ADUlPy-JiP@;)x99Izo{;*$L4Wq{((CknW1*j<5{h+! zB!qlQHI*zU;xB>jY6|eB`)jSz1nl`-v=4}?i@;P3`}*c2qj6j4>Mkt4>oo_eah7UV zQEB`aMd@N|@BO2gR{P@ZS)z;L5N7_bJn?@Y;t1s*N8sS0-n!7{Xl-r6^54?>)M1anXOTfRL zTz8sMp+s@+XsD?R8>M=ilwS~ZV=9S-=CgB6ui$V{=+=ECmSyN)3kJ~HGFsBOIo>;8 z$RHPCnvM#=QVZ=5?^3d--oKC(h_QbTty zXWkZ?WIS3U^%be^JRud+cYRUC3j2x4ZULNqZ29H_P^I&Gbix(;dcB+!j2VtL4wjQun?P zU9Fo~q*l{4Zg+)#Y}|4ZV%ymAHN@o(KNPaIABE#OlkX+s#_>lgd+}Jl-+>;#tSARZiQDE~MtO58Z=jj(UHI zF#8B6JoKXpq%*R;bt=sKjY8%zt0oLrR3k#nHX{Rwn8PG>O-vFc!%WYHKAXEYTj#-@ z>Plv3N4bBs!Ag<}&sW&OV-t`va5^pQt|%_3;a^{yG_Le1=c5 z@wELBxt=;nzEJ*8F*79qp|&}8QpDM-&soE$fXTzeMPBsx3Taw?6<-jh=TO^Kdi~pT z-aq(+WN(_N6qY+GJ_uM?e_5jp)6gEwEUT>ZFayWMTkhAq|GX}kVJ35yF_>7y;6}M1 z3n}Q^Lz9M)cg^K8D}20Hwqg{hBXhPd0S|p>-=F#0?h9?oqZuB1T|$3HFtAah`@@;P z1o*%Rjh*aMD=DAyp^L#!6g~F(`n&R{gmoda-d*0vds_UhgoDIHRjy6><}9$)Afpq@ zVffK`OW!U*gANgPJZdMB;d6=?tVMl)|L^WAKZ8@Ys>>FQFE)@)smo#%Oi}%m7)k_K zJB?reAU4#qX6s3^-3TMONAH6hEsd>lusYVGQ~#@PuZe&3ndnF-o@5_^btNFd=UP;~ zv=6PXgISA8JL&paz%-r?@3cU__dea(t1@t7jN^6A<9BLE`LhnX|ahs zGWWjnCf=S_DPIjm8Ou83i%s&tHvCzN?B6U<7e@#68&}}RWdkwQYujL~Pw6S}(FO}4 z6d>$zW;K4iU*y1^uKeWFw75H?#>hF!G#w85p6cA(@a`mUqoA-vFz;y8v5RH6m|bAP zU5S%h%XWmAUNMYT%d)3|Q*h7t0(Y(hl0>{zyeluP6@aW$s>(qT^MpG-0q{wp`-P(u zGIBvVo;{YfVL*W#>PTh?^;~M55EN9fXm3zi0mpBgFyveSdYH zeLmq%AM?B)^vfFFBHyWh`JKFJS-a^L$;y_Jp#;-QLsYrZ6FlXg!(lm#9uc*bELI(vNwPxFUH2 z4V)^boJ84O(w|{YFXj;QDx8jg5065;<%h5X7TR&-{x z?rXXK6Z5nf$`KgtI%D3e)qzN$ZeVZxMv;_M_`Ww0P4V47j*3>X;=PMz%q{R$Mo~53 zIJK30G341T4R~-UZfRo9*kFqiskQLsuC*AloKt(_tGIDH0WN*gTe-a#Lr~L5f(8q< z%WdbLX*WAL9%u{8&V3g+6d-nUur_B16d?~JaUACa)tW{wxLXAbwIfdV;-${O#oHG~z#X3THXt zt1JwUEI`@0BW}vyQSg|y1(Ifh4(R9~e2qNh!hCqEe-$il_$fOQSd(%(n01_*pP!|Q zmeQ?mMAzQ#DUUH5WhHV#a4#!EGFWw*Gjl!zVCMshgQPN~H_(I7fgMwh2wY zmMgaL!G_r)iX-nhDB_(%6z$PZ?9-RD$W$q<_kBOJ_fh{c0Yw^p`A+>se_F{|@(h~c zb!Ff^sWd8Y8upa9gPRMr6-30JR)~ey;WN{R_&&8FXD&KgaHUc$$@D%tlCzDro3DtW9%>c&-9`jcL4pTum0+oIC=(Q&-Mwx0B9Z$uF{?xAAR5l37;|M;k9u#R zoUL^j-kePbJBPcQXpBc0)WT}`_wqhZ)q5%C?YeB|T0SIs?(AoW|&dtl6|#Gg*V|_@*&Byg^NFLasdZBlqh55}Np(Qn$yC5afYB zQxmrH`czXGeYhSip_|A@9hr=C6#VoC2cCoGc_(*u3n5dUF`g1?O$$u|+`J$E!mTe0 zBA`A+zlFDKHz6)lbmf2R$?@32}{&FIms_qRCQ5AETEk7?J5We%^oYHhZeXH0B?#D3y&->5A}IdqCdIL{k_sjWKy*_ z772kuUrz1$nsOt_Q=PX7HsE&=){Ks|)|N!piGkcGs{Z65rNo;r0ruvhWSI z5@`7JmA<}#gths%1T)&n&h!P96dG%=X=R;??`nv!-~i@)FLU#!*o?TEmZ zD>Zcsbl4usr~WBv+id!xcM8M1DIrV&jaQIFoNFDCxV+PclL0+^X4BlHx?-sl7q(z8 zk3bHhfO=cJLjndC#F!AV|21Mj;mKTK?FvmYzSB{7e7J`-i^Ca0er=?pe~+3^u;8wl zvuT1YlvQ%ZRZFwTpj)Yx9|bp!6`DET2sTfLT}AgOYKx#CC2w;TP2BBYvj&Z(8l}mM z?9^*{{0C;9)35^-$WQ#SYT=`akIdL)PKhD=S}~WoJP}qs-n?dI7`pAyW0#~3&Uoj* z6`lQ^fp4|fJzhD}<1!get=94>ES0ZwHo0+pSpoZjLW7xyIg)q7Zi(bPAS{Q<>(b{Z z8QV-%3;CXK(~#BOumco11WFTWajvy^6(`fBMa;J4T&^`kJ%Vz@)$b=x9c#vzXgly{hi_$;cS zsZ;9iEH0Tw8DuS~d%%QctX9+KTi8jrm`}a@oSEWAjbB<-&eB2%^@ zVK6f+shGSI#-s(&vYN!F`fmA8I14E^$*lm_JU_n$AGl@Xje(-$Zcigb0cyfxd0bYT zc-BdO(N%9-p=hwT^LrS)>0#cy^lyh$pZYimaRx1q zI21LfvF~0<00YY9v~s!L2nJtSOIG$w$h~bl9Hb*Z^kGFDelEu{PjSN0+ejk%m^hn$ z%INS5Zb$0_E7cp1bMI@p1i#_ggQYyWDyH_lfuaX=!(1a<-Jm3Yb`zH$c81w6^W>Wk zotMi9q@QHi{Nw}i*=e!4D{j?+mAE%5V>=&QgvsmluQSbX8I3FI=F@OMY~QxUSA zZcc@^*D(I=rTCqlgI*1MdwzfFk`@g_@jt15bTk=X-}0_9f*m4>vqY8EKAC9hlK?l# zbn4_`3-BIMnLk({HJS*dcRA!0g>~YC$jGHI4>z|a?hV#WVDEamRA%y=Ao947k|0A%HHd{`e* zwKt=3u5K_Fhgvw6-e3c+r2C+D5kN^Uh2tRYv&v^PoUDAi01sR0{qV-7Fyv=UV0Zqx z7`gpy{*eagw%1br_rMR&uCW}>eoHH*&7NKmPE;`!tvg6oW}f%!A5>ZYi4kxR8=5>A zJ2QVjp*c9J?r7;Gu@jaiXU6V05XDXO%x2ke_iV6D-b+#4+Blohn~jgb$#?h2>J|(C-zi zmReL1IJ^mAq9~KBP;hkr4U$Fg^0yxWe~P5+K1M(hVe?x*b0C8+>)tBm@&pTQ#rvG1 zx4$Vf?EmB8!sb>_accy>8K2}TeQkUQe_e0vszcGt&7y~C~xFPQv?$NP`&uc)SceT z%rC!OB8n`|Ms+(;Zfc$9`X-;;M&Xjf$pDgtObonpah3RFCku1HTp=}TKehvL_iYOWjjkoWE9%TBhCh4!p#mXsJWZ zEbOmMiN$;V8z_mp7}<4E0HH9_`pS@Jt-Rc|1EGWpP; zeUpPST$obWlj;i5MZtiJ<3Gm3+Od)p6N4&BT*B9H&?GIWqfI1DKQ-umm9+TMfy@!; z=Ec0B-H>^>J;dRFWG?I8-E!=;Uz#}mUGO56n|t>k)`GmHfQ{nf(xCXG7Og)qu611r0{;$yJ+gz! zA3p+q1;PosNp|j@8RiAofMEG01n80z>^_f%M!rQhQ3c>X#lm#F1Dbwe!2Thn>&NwYd!@9q^3}UU;PzV;GNCg`V8|A3{U*vF zh7BGYMe-Fb@9=4EH^f?JlSzpM_ux4jF)AG`;}|E|(pxBEiWS;aWx!-(Yq}ECiSnH)uFO z)idXK_|9VcVS)_DtG8|rty3K*ZP`o?YX7Xae45A3wdqonR2lFv2R}u_w&_78ZDEpR z1{MZeg-w4RgvCqNDwNVBW58ipOPJyzc*_{#r>6n+66F{FKE>PG+E^bYz-{ zkvcuJT>CujX&26wyq9qMtu%uvxYhk*zcxN?ZW6rGOm z>pq95lofvWSBm}jKnd&=F6~k6EJh;-58fZkd0Ku;A9Q7&HmOH+up!~gk1iAF7;N^3 z3B{wb=VEiPdf$FK>y#S&(q9W@h-}%OBwacrDbIK`Dh{LkCj(HC7{rI%Tx=VXQ}7T7 zwn)4Cn?ED>^8*Z3*+@WN)6F7VTyu~%K(LoTWTB;>9Sg#;bS&%&5t9rY7qR0qC2IIX z#h9q27fflQyv5zW-~|Ent&7CQ_RR_%W1Wc#3vuL*{H4TSmn z`0YGAg|AtJ!M8I>#P!DMjZ?$pT>yB6C0 zUOUqRXtQ%;wsRjX0V?k}%`KnM&)HA5D4rl24E1a!Yul zkB3{-XmT&Gv^LfZis@`jdtAH(%E0BTtiA%5bPhCfe5Mll&<`7-V!VLaF`>KX7*=C0RfBrcn`qTZH>Id725zO*7IFbIbJnWg& zJ22c$27-fI<_s!nGq2irdwdXJpPeH{8b_ zq{1{IE(jD;il`O3AB|M&FXi%;>Tn$yW|H_8zd@%}8yb(gM_=#KB~1 zkw9n)q~0ys1!pKu6H5WW3_D1D6JI-^l;3`+3K5q&Hwk;mjeU)+TpK5lEcsE6V+e)o ziN-V*5p@k(LGd=OA1H)Bh*W!eD(Ub-_*o8AZXV*PN8}kS@5Br+Bk%qr-tz@I!Yc8o zZ5xiCip0OJZ-2(0h9SSl{nFjzewvsj1O1#1t7|k+w*WD%u3Z&*<0xfM(mQ`_^Oyec zUEv>+)2IcpTKe9zQ3f44Qn9r2d$HAZ(34y>0lnm}?_Z};fcBS;yT*!Mh1Vd4U1Lq8 z07g=pc0Sy5S`U!oqt}?u*a0zAFLsU)Roz$qaF^QvCj=bks3#QX56b|gOPYj_&_?82 zyCUz1y84IIE^Pl1+8XySwS1{cOzk=rKY0;N zMXZV6QwS^ybS}L+T>`J{U2K02-`*<$5S1fQYvl-pMU|6N-~z`u6IBwr$YvUP{IbLa zboi6XYN||-3H){2{fXuBdIi+eE^d&c=L_7d?P5`kxd@f!NFQG z@oELZPJS>0JUGC-v^t_mUFKT@{Rh;1O#R?CF)d%^CDV<1vvPD!9dzFj9hN-Ie9LVg@MOOT%(5AInc52n=IMFP$V9vB^St;00>C0iIc8*U{eLE-5i| zSdMj`;?D60tSc@bMpVEwpqT22;P7quDB2)@ZLnBDwwxc`nj7*T2mIdVlMBkwnVvzh zi3`zs?LoLX^sp}eeQLLj$ShiVWr?<&2p3f|?!(6rq5SzJ1Zf^&r9qpQ6Vc?D4W{aj z?DtjKbCTD~q(BUvFxZ3~5+fwe9DX6vwfc8Rh%Mo!17F)UmJP3*v~$CUb%}aEm3sBW zU1yvX(5#E)WJz82W7r8=`Bb~CJoP$l+nB_;ZsR=^8u)>6O?n0S7S?0;qmC4_0_!y{ zapBGIdfPApi7mOA*|uwkT|~0K+m5M!usEDnpJV=v}2U-LzTC1-fRp$Vvd+r zN;u5?1vK>-j~F20N%>W&?z1Ci31K%+ZxBuc?A%}pDSHFk(+e&qL^QK=^iwYFmN2Zs zON`fVpnYwzOCk*UY^Wq&t@51$F8scL?qq`5m$w}=RbTa?2@PE_OKBP#!o(4 zDg&Tjt%7$(i(x8ugg@-gXT-EEvd-4HhIrpRww}YCm-C)A?(k@(EWc(hFWF>zfYC^_E8rm=I!fHpy~We zDd{d*Ah&iBG);EKy`{h18I}WnJ!1YPHT-q#mV+09zEgaZi!p3Ku~cKCXffI<@tx+` zI_Tfk$ZFnYnd-PV7IZ{N@6h7IH zXYv^o<=mgO12AyPdHPVeYdH4=EA02N0jSj$0#|i%GtP4U{adfyiv_-kpfjIEgK*5( zm8>>4pB8wm-*D_x&Y>;eN83>ZM)U0dR@6&?3@H8zYCR^IQ^XuroKSpq`FgL=-$qsN z@F-v>Ngw6%d2d~$8sg-`+m;){^YeF?Jn7vXslo?Y?$zYGgR{L^>elo=jiufgmkFrW zA89i;3~t@bl=IS*9rnJ}-RqT|nWc}mGSwoC`}szfJ>pK;lebpd(o8Dc`v*VpOZjtg zT_2{?N(PN-P%(4p5=xE1&39x?zZ3g?Wn~14QoA*zb~KW5W`WJzldyj1WxT;5bhR2Cgues29#L8SJRPJcG8MI9xpDy=L`cArw6InHNx+@G&*i{@)| z1J$xs%@&L41=AOF)?u_g#!AhYJoE7u>5I>H2DSOF(qm0rmyQ&*V~KPyI%x8?tb7D_ zk*6o`2k)BP{B)N(TbnW%?dg)Wbk$TLep_xGBVqfN09Z?1-*}ozqvHocQb&^|$T` z5f|$2n8Xx*wBLGj+AuTSo76vlx~G@z{)W()dvlUq`>6>M;*t%Y7{Zp<3?^mCei57x5(zBNYWmHj@H zB7vTs7SS~vkxUe0rThNr(evQE4fkQma3W2E&FNN4+B&x#ygYuQ(T6jQhJm-~Qi!70n3w(kT#$a*nWzE9@Z z-^}%-!SW+~)s(aqnKQSTNn{i4!+u)j63<^$Xb@BD;E z$kuNf>|UI7=I08WK0?!vaDA27-|IZQVWnu>Z+sj4r$=A5HQf!N=BS-4Fc+2xQyTAD zvKWqttaai+nu_r{S@*x_b5&>G4!PQQgt*wT>dG})lRt_i-A))+Lz0iHds3WaSPV_keS64&9v(&fN)26K=JhOD_Q&x5Nrw>E{Ud5(YA-ayEn?KZK-)CW=Gn2U zm@j-S^ux_JO6|g-@`9Y%S?YY&PPY?_vRE&B#0@z`3VYj{W^KORKz(3;eUxlk5`~$+ zEUqq~;e8-~ph8e8^^7fKa!bXrq`5#w)B2!Mq1c7LQrd?bDq~$O!A)3{oz)mUJDc^D zp%-Ri_OW}Rx&ot)aaja~bX|)oc2KV!y0?m3MOj{a z^o!SG%ouIJOX*D@MKQM*=VZfQ)$rii{Xp-jVbkCHtx*2z`h{{4>xGVzo3CCs9}B@C z2=G}2P{g8TpHgMEcBeZzY%$a|Jdt+`9MzBb0bomcAh+<7mQ!on`&Ac`Bp|NU%e<= z;~W3$ch@e==Y)saxBMmK%f?WcMbysj?C!1@j=jvR;n2l33;+XE5DryCyWRlMX#}?T zC@PE1pZ6HNBtvA#FFJzXyfz07H7o5ybvKn?r4iW%q!AVR(C}lDsOi7BRLKMzT8r~| zi2sZ=@e3=h;pJw^m+ZfPbn;h1J%!d7kY8MsW;6*%y^2S!w`uh2Q*KMl+x?R?mxc~T zfqzBI>iK8WfRR(WoIB>aZ2#x|(JQ>t)c=@@3s0JoA3YU9TMeH>m>@;|Du#a{%07w9kF0N_9WfR}dw1q^tJ z2jr!s_2un(s;}^F z_58d>;y(jkX?FTJHqZy(YWE_u;1~4fxQ_*9-D5_g&`u`o7adxH*7_ALzMX_G1)@WA zJHMubY!Px^Dn>cNzRLAJLdt(wfI%;d4`f%I6DTeJUcLDAjl zlIV$!$S;90=}CY= zan77`RnU!u-k2QgSVVT=6uP=4!B>tFGo%aCE7P?;v1#ctDa!VQA2 z5%-ICcDy)dEf&ta&1mQ^_yYUAkl8b#JO6}r=F)D3`MoPrq=e;T^C1n=$3ZGh0sIt;hRMgY?C6s(~>+oe_q7{kOj||BI%pj>@9@ zy7L6x-Q5k+(jcAECEXp;F%KXhT?&Xa2nf_k?yxr@bw`5xZf z!d?BJ=)fmgeLs-_9cUevhmgsX05r6tLpfl+Va@x{oZGwrPT43io!|owjuZp5q1{-r zGWRh+e8y_@(&r#w%}a&->6Pen&rb^>`QomhR@p$-mA+HDGe>tD8yiaK)z2%3L;29Q z;1Ob|pGN$-N(VX@?$&-r%GcIb`b2ZS*%gufDcb)B*V1kQIZRE$rH z-Tk91z7bY}(5;*p7Ylk3kq*O4q!%D(r%)Diz@JZ_@|bS5xSUR7;ag$ z9Jbet-@}}m&US#)LQ0I)=hrp>@XJH5YL|MwiI2B0v*>~j2n=KzUioSTSAWPLUf+&G zR)3s5NUE-!>>VUiu>m5*gjOFnssG9Rl@tNC)lJ?AOYn2pzk)29_KTKpT3~3^KXo=X zJ-yxO?>~DpGW=6`n5vdp8^~`9x=u0NslIIl+Thi{pdw6XWfr>=%%8)EC}w$?gBoO1 z9bhHMzu||ee!%;wD2CfZ*F{@RGWNVEMv>U(HAY)3PBc=0N1)nMB4fgwFq?u@p)Xce zTOC(i$X6YGv&~iY$V9t=SsiSkmN@yBnK`7LZb`kHadecDU)K&pC>er-@Lbn=jQxko z_)nJwn~r`Z+A4j|Zq&CB8$H8a{Km#FAicn@Q`+sSY4uDwkFcKE(JGixz(XY~^SbxM zt(y|_;Rq{~($?A!0?bnL5G%+Ql>24K+}VaR$dO0O^!EBNO5GpTf-%QIiP84K04Yr} zmYVGL?#%P(I&zF2N?6Fxo{$(i(%5Kwf53s7XC{gh;+WrRwRO0`q)q~6X1=at=5#E- z(irN0@_2qbAro7`P)5@|*w_KZYRsD#Y#+z>nrL&rJfbm~P<^`r34Lm7{f-c^{Y9pQZc-L6@VdfAT!sdz zK~I{A0ojq{yEnktvE^jY#(sCvYcXiUFp-9MD`k%Rh=K-UdI^?PAu#qvv*$jl&G;i;yq-yh!mQmi!5=yXw1;WC=KINjrBSh41R z;c{PsOpv^USYG{DzB;0z_BkLo_`P21y+LlcvvN~C5z~9mnELz5fR#JP%$7Cl@+ZT4g{h8_bP5IycvMvkHCz_%IV>{fh&W@T%K)6CLuS8Pq^hQe1+N3+8 z@oYcP*EP+0wC@_4$A!W=er_G3YQaU0IQR*c^8HHHUt5ZKp_HPw=Ahm;(7tt0WBmHU zRQ8)(fE4G)he?*|0j0dPf;2z1;*Fn*=^eb(@7gQp0Gjooiojlt0td`cqcIr~$NrcpFE?s5`SwWP|Hi23 z^z1WagCi8zRH$EgIYtsDDtcN0HUQKvO`9!N35YU_cbNJzwpFCKY{d(H z|HL@l&3aX@-S=w=cMj)n@&xr*(UMMCmIaGEz10HC|pnerI2r$ZXo1jA>(F<!j41iAF+q&j6oY-gs1OWNW$;H0YXV?_?M`1rG}dDPgsaU3{R1aQYNR4@i`&3 zxv2xVWeHEEDCTE3*7xu64foaRD=Xbnh#Q4M7?%ngKU412ddFJNYdJPrq_6^N#6c=vq_MUBu4Hr@By57Fu(ueAJly#D9z2&q5T&7QQL!taF&a-^dJx2P6?+Iq*gmTgY0Py$4 z$#?m)GR;-YQ+b>R^9DRjui{=7&BtwY=4S@%Uv!mG-(V25C|@q{WqR(bCN40B;HSFY_0mV_hZ%al%$uGZnN3U^?$5 zrK{YasV$-`D!o=w2MxtfUk|O?gzR!YkS-+2l%WdxeBTGm^#^3K+<4z~*+dcKGct#g zLU*DXmkEi|<^iFR<4X((BdZ^bA8l3USzO;5?kUQSy@wEb-kotU1V6o26HahPh`5g~r~g=DOckh&8qtujP^SDST#9Q{@fj?;2_ zMWI^o5)G*JEV(t?JPz<{oxx{nm7pS1;=rJSexiJu?6shvG>*xAWC%mbDW+;i8wQA&6)s}F|S;r0~J)q zyR4)?#lGPwZF?l7LbGRLDf6>0Q>V43srQy_TFm?3&q$A}Gmns8y;mxU z03075c6UDbelFYeznob`hfcW?F#l#l_jNXYDpxhE824VTX%i4fqu7!^PZXmEQOaCV zwqQZq6pEram^dcb6W(b3^P^9f3ju@$sX^hF19GPw;H?9uVJ7lt>W7IQh4!C7pzDwt zrNuq|Ok@J52-CSE1T8tc8U5+H1-=dQ!!n89=@Fe9+1U9&cel(z!Yy6DOc0u}`huR_ zIBLv~1qI{KT|t6UDmU>LR4^9MCXQDqTO4ttfLolc=@85(90|nJOSY3=pflmNDLD{ey;4v z^*JzRASFHLrAvtr;oyL#lA5w1hp(p1J&X5bnOh;z^h)4Zu-QSDSdM` zV59#M>J`lX)d1STwwP^+NNYd^w9st=IakmTUj?!vFzQMvk0=}&n0N`EpjF*&zT3~zRUlYD_d1FcRv$UFb`Z&bK4 z=iA7F=Rm|tgE=lfN93>HfZ$We$Ti;+6T1gy$ZIS=s%gb=CU$#$`8FT}Otyy5@d75Ewc$mUU!1PDzSXKGFF; zhSU3;OuiTVw>Wj{i&G&xyRatSduF&IqqF7tKDv}6-X6^drbe0qz z@E^nV|E75p{3;)ucdVx2Kh`naM6{I^-_es!0SM4CJ46n?Euz-jF?G9W7$SuKyP=Lz zk=HYIor_N3osttN{1`SniK?KQGlXG>74R#DS8Je(`S8^Ysx0|ng6Cld%&O#FP25bJ zrVUUjlU4A2?277_j3L;`Tw?U_gcz~6ZeOqeDe;fw&jFdtpl6?#Tt8A%Q|IM{iAzi0 z-`{~(S8U+@R>Ad|TXE}{-IQ%LqI#*L4KBS;RkHNGnh^k=HEQ;h0!v}g`mh){?$wo%~zXD79 zv+HDJKn3{c9{DgYQ7|deAd#HH^xCG1ej_+5=2ymCIyDhGlt3JwkY~(27p*iB&2qwP zTxLp1?Hm`K_)?Yk=`Ze0e4C`cZ< zTXcFf-YI(Ou%(&a9)A}ef%uVlW~WXU4)*jcdpLH?zj>~TEnknJ({#9o8zIMpRL8o% z`%{Z6CHpa`+KxA-H~TfiGjbR(dIMyT^PqewW>tZVbGLRaa8N_MXu|@osIBxvMlMRR zH}d#+SoF2)y^^7+V-7~gBuIEF$m0%Kn7#^C*Tm#)IpIXPKIvehXQUU?n!*s=VFpM| zW&$*hui86SDB?mtJ?ZAhsr{&8o=Ruy*x9jsH*rzVjBAiRmp_;B|Q@e+&%-tcwrMjv-Z$ z0uHn=eE_CY#R=oDMSzfK0YI^j?WM#Kc8mz;fo+*e%5HS{LVbhDCJjkkGv*+~dLd@x z6I--`M5sG@R{`c$FI3-aMzq2T~=n#vV^4f?F>T`D$8c zPB+>`lB(o!G~ICjXd2=%6lF{3$xR_`C<)+C;HUaUk%e#XURF^zW06QWckG04Fe|rz$WM6OCow`xe2@c(eZ{xd9YNj zkr&h9tq`{cQFDAVcCMV5$a7V7>ir`Y`U4b9*?(|)L%8}oGqVblHElwE9sCiAXv>h; zSx&A<(0OtKgbLJYav?|E=Q*VI5@35Q%iO+C z(}FU*GBUoGYC@ky)Y2s2J{fqf<75Cet0U%M!=LOZ`{o3BCnZ2#?K@{E!{)*-tEm*% zS`w*{X`t+){QIkd&8uss*bDh#Yth3fI3^n--eeau*uCinr$~&-Tl(O;k_08@Hp|ne z=g%_O)@Q{!QXnZc0YLRi+%r_{jOf7dTJtgpQDBKl_M>HCGw+|)TnvEUMatp?v><-Zw!9mz_+*i+w{5ud! zh~!h3ir#(Mk+)6ujqR&tbKoGwCYiQ=T9gV{jhLar^;cbZ@iYFqL(SNe z=XM+DMb;lM)zQ(shUWL}Y?yhVp!Tu2>6M_OJ#S{I#uBeQdaeHFTi!~gRjF;g!GO3v z!&}Zbp1J$VjNX3o$?BN07D)_yV{yPp5f7T!rEzS)X-1_)CXu@9Ah~0z`Ujv16Y&CU z1B^KU^_mwsvN%ONf2$OSdJNqQ(>4Jp_SUrXIK|PdNN7Qe#oo6TZ`fo!L0yNpf~!xoAx`$9$B<+9ihFg^ z`Ib_BhEb;_l9f_lueEn)!OaCY0(Iw+W6Oo(`6uJ&{1o@4^lg(p9wE(MePb)#nwAlD`1ZWS%Tvwc%zZVI&Y9i^OmnurR32B0WKzUQpdvfBCcR_aUKAqknzM8D>*}*Tm{br&0Q2=?N{5#qJ;#STlXzDQv)fX3 zF?aAqw?L{0&PTI!vMWky-6?4T?xD1B!k#cpWeUo~H2y&xN{pO^#K8V6BYX#s*_-_N-q2Go1Kh!!45}4!LWobd(zoWo}EsO+Yo;P@RyrXRF-!_6V*EI5;f0EAkf(qHYBJSwt$ zZ{Bv_MT_0#e{@Lr*!*=!992+M%$%>9M7_0sYG}oY{(Yss;Fv^?Xl}J(e7~#s`jB0d zsmZxSe(NNwoaB#bx7~}Kj;Fi3!6GCHzjY(7FB$(WVFBje)?D=QK3zLW!qh@y2|F(4 zEnP#06hZZpw+nre$6&trs|%^*B^mscbW2LwCiGXLDRAH&7!=bJc8$MzZxJ36FaBgJ z2zFoQ7F?SWe+~d)3~pFfC}01GQyjC;?sN8KT|*LL5fi3bMm)QM91a4Z%$B<(5o~*}7qC1!4l7EAEsSf%-m(U+loDI^bY#jK&YxpQ!{I zgr6aIrPv2SqsE;#qZ#`~ge*mhP?7Y7NM!0;#ze;oXSc9!gKSJX?1xf)`o=DMyJOnB z7QGT+-vGdb@GGHk;YK&Y;J8R8Z{ykK;@h*aVybp?Caelu-QNm<#dJl?h0UCQX4}`6 zkS9k=htwfDz#H9&E56IF3u{uY~^5IL^wtrUtFy2&uNNbA@^zbL&e=#gjkg$Dhl?%8&w4M*L z3c2--rX97VO^S$#J2psi)2aEiV-=?=d-!=2=ibL`2?q3nzmij|u zp3Hb|H>t?lcl?MYe899t!|L4_&RY83V`7NUe!Kc%)z9TuFbM*$js#!E{ChLoj2@ZY z>NninQK1ndoPLs=aIZ|dXr@riO8S<)NB&X!;*)?#vVw0LvhQG9bnpE-KCfE5L1+K^ z9sB2ZF<}=e%-(VaqY-_0Y8z@O1}c(;UnU)-Lenuzc&GnDmH?4*u<`?$zm&i@+~W~& z(k}X`{^8i#vhnlx$#>}g3--ugPlK381u9O# zPst&LdmpD{qF~6#n&ME+c3YI6WaLH=cGAcXN_l*4B=yA5;MmR*S!-r#>mQB%4W3g> zwqdq`*eV2f-5q-$=)7FO|5oZ8zXguHRw1Vg?~Z{U=lE2Ov=7oq^W1)ey*_NJuRs0J zph{reRPai$6L_Cyh`ySGS1~qN^WL9Fd(88(hOb31(y&MIFf`Xr0iDObQqQcoR8BI* zgB=t4qu0RWG6|dIY6}6ls_gwU2^@FLRe~xyNoX$>y^H@cKlo~TAt;=H>xUL35CZUr zFTV<}YDgjHa2Ronj{YaTn%X>s^?65=8zu}G?v%f$Y+gYr6oWgy1TyUPXRMI%3IHd+ z>uIO;{10e@_?^12JGqb4j1*fF0rL~U6r$jtQ$dc0PX=w=A2-m9ZA;BzK}Ajnn-d+6 zk8hOi&k0O}u+jpL$8{w`1ftbdlC_Bvczh1AIoZ#_kat+Am~ zEGz9BB85_)k+=ScirDW=hiwvOw9$)1b8BZW&@<6Xkshc_Rk zkZunc!l9C`JNx%f+1EEL?3-`crA!BHKMdc=0&F&w=xqPjV4wN4Gof1+`gF>bAD7Lg zn6UdZh7Meyr4Ri!0mClW)Raa-=G{lK43vN`bgXfp z1zmg3YTUa zb79V>lAWlVo;xp6>Z80G;`ZTFID+)Fw;>WWz0Fe>*Ye(qi z;@LHER<`vy0RPs2^F(!D4dXphCOC?tgFF^-Lrr%R498+VnRRJL$3__los}^QX z447hcYgv#2v4VJG$Q9LkC>nTo*s&-)E3Egk=M-SOTMPMCI2n+BSoOt91REdpBxRtxZHiyNjUQ-T<{n83_Dy$2?ZY?lrvo zig6M;RQ(EbX{8Gz!l#!~^3AMnBu-VHt%awhWx=fGL)(QM3_lZyAL`{ci){_OTDzc7 z?I2Q^w^Y^rhJvC9o31oL7Yv0}Ny+_b>o@#$jPqrN`85rqgd9uAq!67xqs zvF<*35t6vlF~0w3Ewz5Gz7F!x;fn`(`lG zIS9O#MHSa>z6y{)k+9Zd@{-UdT-PR`FF3?v#=}7faqS{mWHDMJN<^r@waT}D&b$pg&W5ju3Mt> zf;BDfHehKP6y4L0^}^PeI&3LclVx1W6#j@^(TdqkOe{!Hoav|9aXmY~gF-SzfHACC zl0t5}d$^vkZKR_XRR06NFS(T2-QE3T{a*nI;JKjJ$PRqh*!7%I`8D2>FdvqpMYUn= zY}(gG>W@909t(?z12JJdK8xPpneX18#r2FH?WSX*H)3i6QhRf-iZGRFx)_p{eu8ET{bRm15`SbLc)TiYi{ z7P%Ec4BC$&y0-$hnT5{VYah2L$5ScvcPMO$41xOuHykw3_v5syq~f2y?LLq`ou~y0 z8(|9u@Z`25{LcQx)~@mlL*POH+}n=r`0G=@a2`gl5Yf4WVfDfmxA(m=FTSL=v$=Bt za|MIn{R2fBL<@|}^$UC;ZB-Y-%%e?V*pU^x?rEw~i7NPElv(i1vuW=a&soAkDV*eF z2guFgX+defEl0C!TyA<>yB&Y_sw(QKx)+g}fm?e39rE2|k$bDs_F)wyJ?Zu07Q+bZ zeW5q}jpd8&gXXd0Br{{Yxf3peV7`Kv_z&Su2pOkUkL}-@4F}UN;`Ek&jHil+GD`NQ z7@ZBz`zc?p6D4ejJtsqS&_bx)8%U^Kx4E{SeTpnK&XG+eDSYhTVf408ULW$nX*4S4 z4EkgCGfH4HFey?%D!j`LvOF)0V;BvH3mGOR)m2hSoWlIQgZ( z&hm5p((m`&9WLM3_nxSVtXpoTj5nBZU;4s$+RI`ukb-+j#iDhqD99RRK*o~= zMV>$AwD(&DR41vAPo>s+xcP?TN{NpTbWKMsMLzi$crO9#-41MmVz9|OzH6Dpv9M~x z{7!9awl*oo{e&R6?R@Vn5=mt9|6~HiQ9a6LvCj=CwvK;0D2TH% zjdO`uFm~oW)a%YTqnS)P>r492jQl6h=`R8uaWg!3-0mNf{@$thJ zNe~RPy!;4DH*AFVo+17qrV$4Jkq<4uS^`pNgzc$VMr6oN_j;a- ztgQRnAoB-ShDS+npGZx{Rz!!$Z&uto6gwXz4xa33ws|YhW`DwoFl9jE{ggNmI+Gpt z@X9T8#_qr^YkB8RS`n1id@KZInE33oUl%wr9?JeWfF849%F5x4=|%;W^Np!xlLO`? zPdn?eiQu=ivYztkO^y5*pVTka0_KA%$MDIK-wbs!FG+PnaxNBYQI$)`5=ShRSfu%n zOGwnwk7exiN>diwrlkL*TpSNh`X^5thmHK}ttIyhbf5xs4Z!rT5{{y&L%7E`A12iI z#&fOsc4t-Xx5L7r147clKu>rEa^OoAe=!Be`p(vv4HF+hJOLRSFVNa56OUr`y;_N= zK$EQv^Dn%IoXFa10eaQ7z*BfHL=Jy*R{l1@4RhYs;W??QQV{9~T_GIR9-hRmF?&tX zHq7q(BY19NAY^Yr-rCFzLNDqq?sd$1n6y5;Vh_TSAG6MqmSbqQwIVZJ^ zr^>RuZ?|Z@$R%o@;jIgyE79_X_DkTDhH{^HbxxAmc&qHspA zdHHTrQb;%|9z!si+{Q}jd3{Z(^l?@x-UNW`YN_!{ikZvUo?|b_vo&YXK%NuiKpj%% z$b15Gi=9WWIpG%D0`8u7oIwrzN)aHlV1-I0bb#J;@|D9^R`fuQlkAxWs+2`ej#F-~ zzmGM;U0eF(%Sj_&YE#J(Z0@pnO{~XQ(LQH(?p8ll&O`6z`=U76=degC$6^GT!ig98 ztqqDf5|n(#az`DJp-EO5c_WFZuYQ}#0fu`Z>s;RabH>zrUhSao>}qZxJW4KdisxWt zr2sGjxZyu1nrX`gF1#|UO>2a4A(Vt^n{q2&&KC2m5DLk!Jte_{ze}xt1?%0-&R@fB zt*HRQ-!b(L{KZZYrZXCTf!@J(In?h7NI>jXtX_;K&sw?O{A(U1ye(W0%e9qupW&jN zE0l24Y#4nI%9t|&zS^4N(@MJ?PLOam+>Rxj%0C-C9zA8}3u9`!w|?4DAmPK`SFKJG zmJCDQ*0rIsF2CGp-Hstk{Ayun%k0EP^2^u+ZS~8O7`;#Tv#0o?1Mdjygoa{?q(nhs zni^g`Wm7>14cDnalRi16T`&>&f*XSV^eD=G+~neNa<<*l!}z;VCy!|S7drR?3<#De%k5JIqPwoGaV7ZM!1!VA8 zs!A`}85Hlo-B^|0HgVSn)4mNtOreEte zzPCg*PDg=nJSTua9^BAe%$Z)BFg((4)RdDVEu5plt|WCxm&H@bNvbs;3ggX5i6%Um zJ~rq5N$&W0vgXMKca*uTy23t5QB^TI`&@TSf!b?|1iHIa9f%hHSn;uWL!?^?3xK;O z^Dcfk#O=LKLGo$2U4R2U==ZyC)Y-Hy_?Iq5<+P8ijx#-KUY!FQGTw(go*x>zAtw25;tc&nC5^rGUXkW)r3XH zXA^Y4r5{|m&h$M}K6fLoebf{UsYmck*y-8PE1G7SEj6y&J$Fq)@Vmc2qjt>kPv@s4 z*{|;|=8EihwSeq$H*~WEmr!p(NRs6iJBhi%)$?dJXX|1kcrSGoVO*69k&nZ7WkG<{ zTOX}VMhSJYB!P}iHaQ(tXWi^lhw)z`xhrva8TFy)VdAB9(}5$ZRSEIPzJEtSfTi5w z-atUpO>|&w{h>!TNFFY_&C!KesOg=3jupeDpRblNRRoRl1KyrDI8C5KTEbrq1r96=|% zVR`h|a6&jLh~M^$%W>6KGb(nL2C0^bfoX6oaCS5Bk_tu#O3w;~(fsW@mi+ro&jD39 z&bn#!%n?Ixi>X)SL3`!;RZH5kcW5a!vpw|51nU>L>ufv;S`)*9fIX@Cv!nPj$ujona3ts;uUAPeVGT~D7B6c=^nr83K zV}}%Ai-RDzhT|XM4MrbQ*5o=a#jb){;tzJ}^D`fYQ)%plr`EuVh$pNpQ=t_bUU|H* zaFG5P>-$%Yj|5r7w|V&wr(t#W?b~wUHS+G4pV>aPc7wZ>KBvKiNv0}8QkJZ}%$d)-es6FDk0&@j>%bd$7}aXYnD-HGtBE{R}uSGVkSV|H#mZS zsMVvA-w1vpmE(o0+_;L8eR6XKzG}<|7*8I-6)@J7_;bsdN(dYp8R-c; zp@)Rtu!Q9oQf=lmu8|W^NR*2n2#(+L@96Bz8iNlc%hSpHVrbW7m|ZPf1w26U4{c}8 z%T&?8k-d18C>gh05qCmcy+4dXV$YNs^J~>}pj2=QIZR?3?uO;BrkniV^|bijl_#VN zJpHv;KD0dX^;brVW_iUqfP9*^H2qLcquBXOu{VnYKph(Me~AI~G~gpBdZa?GLaH0I z|AICFv+c`DtsPZiT_{h;D~%R+0uqlVaS3UwKWs%Gc~-h63H4^~Dk+4OWhHjhI7Ff- zH(sD-p6MiXhMuzTg`RC#60^;24$2upbo3Cu@Z+&7$6=HhVDgllgA3r~yXOzx&lU&5 z9A=0R3x|xs2MzjiBC?F)K}D}?W3+X+K{X1dG<-y{KX(K`AL>OAUq{fWtK>f^lz+4~nhHBP{htF% zAZ%{GDc`G-yw-(H*40&E4rZY?-_)B9Zm@r+tiB!*LrS0_w@q?^d2%nZ2Wd1=HFef* zw1DEljahC%gNdKcLGA9WJ-e(XB2;VvpP~PSGGG-QUenM=^Fl~nf9E_lp(&M_+FM%9 zTQUJMV)X9Jy{fssZBA<*D9o?>*y^}zh6QineJ+ed-C=&MJ;vQS)%n<~ak?Ky+l(cv zgH=7!%|jD@dg}T@yS&73aE=f}+@s|SS5O*F&#ap-Wx(wxE6|t^oi`1Izjh0WPgfNt zOGs>PRt}$L>!_!!@IVwYo|}JTQ8piv;la|7{hkXt-gKL54t(iBsUoLOgA05C_LSj; zr2Y7ndw*&I zCMQYfo%MXRYF=f*4=`^$M!;s>VP1;wE$ORk{5xJ?jPdL+$1RY5oV-N8lv0IHE|%-118V7_3;y7QW-u9r(t*lTKuye2V;dOh}IhMypfgyTQ9a)ax z_UgOvdjC@ACs&P&vwm3!Ay+NbjKsFz2s!5|q=Tv(bD& z9+jxho1Y@s@%Fvsms=txBeBbQy?6wJ-n~?F*2A&E$WVC1^PnikiO@GZm_?#0EWZn} zm4r|zOg#MvKJr?R!I#E#T-8yW^z*up34oF4gfqbzt2UpRv(V6B_`3PqkLeztF%X># zsE)euM^$%n3n4HKvUc#JyI_V}ZJ@Uz8aq%q%4eo4j$t72_6-Uq_X<|_qOidrY2Nq) z&Fsd@hm+t-TFsbbKA4;ovR7+A&O(pQ`!{2%=gzNKiie5L!!UGxW^+2B>;1-RFDqlx zRXek_3IWUs2svVKtSMS^B8|OjVEcLLWtADH?9>w_nMDy0_?%!s8L^;u;)HY+16BLE^jYZ0E3aE)~lDcD_EhO&*A>7x?xgm~5m7r40}Mp|YB3N{X0XuVXx+ zm|6whei8V^yy}CXCZ>Ahu6rO~wN*mI%nKCG`|QMZm(-1+qfe2($Lr%%XAm#7(OA5_t~+f6~IIl{KZF&Y>mOk}dM}-nOxCTPQF+2Mbn& zwpaJ^MOiuz(Olgt*+dmmz6>9Ho-=b$T9*K{vqe+_nHGx<0k>(Z$5X$~{DM zIx6x{*(7s79oW{|mC8@>60zdw%RC1xKjQZH25H)`K4Ya&6Kb_*oON(&wao67FN&YL)_|Y&=%pEb>T6E)51S58wnx*5S`dodz!gQ2UBWl5slHGSbwKB5 z1oEhrhHr=-PTRtP5*7kVtZ1QCD5=IjN87nA5*hlua9_fQeS21x25N^?n=oW&xhLvr zF|zASH0s?_rx})Fc=rUHTZDVs&?r1Z=w{M=< zsR=`{38jlDMxDCy#h-uNZEQL#NW2IPG=&^+8C+?iFYqWtG3J0T1l7MeSbm`4P3qSd zU@jyT8EI{32Plc0wpCj?-7|^gu>2)6L zAhHqh_L#|;B3FAN<9uqkL!FC@5+Sj%vHvD_%u0fgm;C^tR`+zEO$r-DG?cJ-d;=p*8=stN-sNUX`yunui zzo2$Ns9Hn6z>nCS(B=F?&RBns+Zf3O=kkC3?= z0{i{L6ukqe#LMzoRX5WUW~BKu8{$$DTCzltd_q#B0QiMDG~uQ7KF^h?(h+`wpt4v& zwN_gm!l;n!mLRGp#p1jM=MPNQBW~B6etHvi9DOaD4~k_bWu7@hoDnac+{e#(NRM=sUrRxRCkJ@hkcjI) zy`DE`z2`9cS!ROgAI#$QHdmU{HY}iBlR7Aa!jUhZP@=GUD~!C2A8e<+gN*Rlag3`n zp9ce}9r_L}x^ZOT@0K{zUHRSl>qu9k=H1y)!Cu9LLD@R0TLt<_(AL4hK`_Ymrsm;r z8A_$TRQDBT`2n*X($iCyM!*~KxkKA#n3y;ci1{8sg1 zleh;eXS-Gl;AmxmD zla^BN3m$p7wK;E=p@S zt`K^u93VpAL|(!9N!6Vq0@j~38s+;H{h88y?ftX(xB3Yl;Crtm_g$`MR`>%uz$cZ- zg5X=pTqk^$5MYU&8fsTc^z}KxKskrCW0#CJZ%EYN^%P+*wL`8FzLp;T_b>VcKEcs# zz9`i5DB({k@~NNW_b(TBG%&wF9|Pj zg}=;J@ZUm5d(ibZON@L;7oGgKT8r*bXaBVseqq@s>7tB^t?_RV5X{<>3GB z#Y-Uk+vDN9FtrQ5iY>ss04obgA91_JVE@(WNVMZRVN&-_#methYvqb))K<*x0pBw2 z-SzH?&-bcbe?j$wgWBNCtb%Z|_AX*12hOlo*Q6HX~>PW z9ZSBFx7HASn*kndSYDH~#XZ@&qcD|t`ZOejjEu~W?c%*O_u9>56Q~pm7PYoEM&;6I z4r0|?CF1tRlR@v)=czcJ!WPzMDV^#+wA+;;MiaOB5a2?b~hf#_z7HpaDVe$^e{N^S3Pxr2`c)izC zM*T&3#%1`a(s+6oj(n`Zjx`NM2e|@@pWsR<_7!9r{E>(N zW3ME6ZGQAp2H?@f_6fsD*H#04K4WMwXX5V8HU#NXg$^7#zAo41-%=Z%i=NT*s*$5V z0P0GgIC*qo)C+xd12iys(QwJk#szmbc)dh^)q21F)kfMy$x=d)Wk~rkMm+|7Pp@~JAQUDa zlGZ=?Lh|>3Acol7BP+Io7fXsevzDr+!3Vfmlclc)yo_JszQRa5X+r&uHU0`WYkfe1 z9BYKJ+6I_=2eX}P}&iO(5HXY7TjL2)h!;`s-QIBnL)R4Wkt*d&f z+6pO&ZNT?p%~w08L5sk2=6&l@NBigv9e)7dI!b7intVpt_6#8G^8Fm#+ou>M_8bO{ zv)u8t-6c`ol5jNuHQQZe+)uh^K@|vjfin<+$@w-%ToRzpG)5g^DEum76$Jq58g8-9 z?@|wyqV$Ur9u_DC*}6?bBHo7^xxUs>@VGvf&2srw`FW0cRTF)a~W?&Yi zfK^YMD;pMAtXDk+2^2Il+_)1uwXn?j91jzrUkpBLW< z8xp9L&q;2`d*$B5FCkx2d+^D^XGtp=L^5W1N-TFBZ?&8#MM0c=0$O)Cuo&O7}4pCVIXtF*O-joQi zZ7Z(~n|}u;&jt>i+wvYqx1{?R^zm~Pucz+F&2!7z6g`d9AcR#h!;T&Nmvt`{?bn&q zmD;)e^HnUn;>yfIyksH(1o!`ubd_;Yd|!VyfTbIjZlqf}mhO@ekq+q+5Ts^l5CkLy z3F)#xQUqn`kZw>3X^`#^9)AC4-|c7j#kuF6IdkXCH$3`Hu{sLkUK~M;o^}E8OEH^o zzc_zW0U9nvRRzCmycBU-E&ykH)ARBOFS_(`7AePbhL@6{5I_p}n@Nc_ewZ87CG`F} zdeHVjlb&gmfHfZN+%x$rBs6*`=6A2@5rp?!jho%(G{=|nyBM<-#Ce@42|`68Ty0Uj zt=!Xs^WpjIPhJpz@7U+TVFm@jbLPlT#L zs`1~;VzMt1l_3KA;m5h;x~K{Bj6O8MTO%Y|d4t4+Fz+Zf=iylLe$F{=;Hq2{R1rWu z*goH};%M#l+hX$vB$)+)j?JVm7xQ9}*4f;DZ$~O*cw=FoSvv1Um2RuKH{iw&s_Ch8 zHYJ1Z+h;-FMx7_d9rJSDTj$F>R}uzj3G!rg0NR{!4p6w6Q*q~Qcn&@sV9&IhqX3vU z;XilZLouH7gBwLgKdo>kN!N4SR7abWe`}Z%l{iR=7<9V0m=K_`J6acNe%WaMAZL)k zQKCL?ySulsG;J4bA`R~miwL+8q+}<}Q6+HfCN`5^7{6x*2seE7xb_R;@8KxbCBw9wWcRZ!5nb$Z&A2kMwEHT?qnwqXPsV6 zC|j`nXG0;S@ZFER_k?{nWF|{xruf>kipBgu@EEosE%be;O%PwP`7;2$05sA& zy_Lch)(EkbXmhzY6kj z-{fJqtB+w`j#y|wa>qAp>1-fThX)HKl3v#CeJyXr=J}v#=PNT407gmz4A*;M9tnm3 z7)7~J*UC$XW=Lm~?Nlo`3h4c>ELs4113Yxey{1QHK0;|QGLMHekQo7IhjoyS2O?)#ve-YE*Gw<_DiP=HbLGG)n zGR${->Svb4v=nF?qL!`kVmmA9jrq~vm8g5!;mamcf0kNOW~G;@eNC#>F>rfC8&+)e zr=2GRwPg2o=q8knW1&7{JbH+n7b0btOHTXWR5M4iXVw8@nx_{JWQK=dF!a6V$orDq z+IrgzMQvLwwt2=b7aeif$4#y>u`ibELQIZ=wHSUSQzyu*KCMG?=(P1GpYK!%!p6`<01{TfE1+gT%qEx8z?2yV2J zB3wb2X<;$33BwG;!Oce(fR!c=yEd#WhfFm3pN%^b&2#m87m`w2N!|GrFweo-eTxPB z9o1L+oqcd9vJtaZUV{8RH*sBOeGuL{gAGX3|MuD1VR^zKJVV@lssr)%JOhy63t;7$ zIgX?YKfn#64zz?Wj$E6YcpSEIzY2fk1zza^6?;i+y3NbgOo=-*(8Y}3FlKY1<8%Ny zhYKtng^f#7BLVMJ5$RLK6{vo)+w@sGe%%Gp-O&~=MGT7>Wi$O%@}7AmUd#VS9FaFC z2gC$OnmFDQMhV!le<@2E}Y&?brXt$4-1yu%!8W=Bl&(E7QO!?*FR4eR=QbBydUb=mui=e#fQ>BV3+ zIolgNts8Tu0Tv4%)z9Ib4Yv@a#Kt1l;-6E3yWurHM##|xgpVx6tt`s&6_;uxFJfTN z%}wqD(~KQ_2X#q0#UcQ#4A0wsv_50**SkpuiRg6)+u$k4dG>c~B9Es8kI7-zZR2mS z$G`5B51UI9QbL8cyjw!%ZIJC#GVrB)frs5Kug+u`RD5fW0og$F|K(cVf1$p&DhV0T zgEjDV8NAzd4-mHB?5inmZ29#;jNbmx!|15Lm9UUj?A|{=pP^}ZFV;7#Ao)Ycq)zIe zzk5%6%=sI{!8D2LFhT`a|u_YN))05aqM#-!kA9@u-ZafcZq(@)+|q04^zxZPbH4PFo~ubU_B z;JdMJ5%=ul;dL&wi9Qm(v&#n*jgxSt{0|SC1EsOuIj0uzTf2isC(YdZY#dWt_*_T; z@9zEc1#;%~*i3ivA2^YX3#+x+q{7&%JpWShEtt?z=ieGs!+bmHKQ}cQ+6Uy${;#lq z<^!@-b4!EV+XE13JOe~S%rjF$`*F~;WPw&bkhTR+KilPoTeQ%cd*g+U-?X=TSH0Jt z%f_$IDr#$wx}@6bD7#x;_=S~VNnE`15yF;rb?L-11rV|etM0BP9t7PmQj&!e*B{XB zfS!}35TS-pTug1s)1ex3xDxRf#Hb<*XLo=SrdrMsy_=7e3+!Vvd+R0w(E+<|g=|$m zOMo-8QbJO*7u(_Cec^ox1RVwhs!}xAFC4YRvh79)h5qq}^x%5>y1taYZ8*Mj1D3UM zJPvQAMJr#DIUao9Vb=_T5kf{*X*C@)o0C30iN+L6FibD*O6K0BS`ZRQlv{?2z%`dN zQLgar!u2{#XC`~xVIk5|43aFG&;gPz>0n)K{x~R;{8TOGXKW`>nj+HDq1>D zygXXXlG1Nr+pTHN~HBMBLZkK2Lu8{I|FIzF~lCV&78sjYsL8Fx5VG4#{`?2Q~$v9s*q4P_V9U0wKad82gJF@%CFc~ zD3=vD;`o{l3S{rZ;rmqFHO6~2cfS8wMobhi;~9PpcXVS5en@OG_C+5b%BvpY0mV{#Q4Y>g8&P( zaX`;x6mhKmnu-?p8gZT!a2ER-8K`_GS7kphBP zwJ6jvT9tMTx79;T3%k2h6F`-0&a7J#rHm~~xb=W)z_f_#l{5-rx@ljPXRPC^h4 zjpJ~yUeMm_k!zL5u5eHVaC%3NmTYE^07L%LzSLr@kmO&w(+jZ zuMmb*bne(pe0snGigXr-mHk-{ z|Hni%Ys*KE9??cmo0^vB@4J~q_HK*~aA2X6CupoAkf#hxF+e)HLKmtq(UP%)x_$Ko zxL*0xjUO|KUfgE&X?2t1-AzjSy4*P=>9zR81CWo^*Zi*(DY*rxwE97A>o$>G?7MHo ziSC|D111GfWx}JX9>yC>XA5A9FHMgEFPc@ky!3Gx9CZ9Z9l=K(KTzbE(x%uUo|0@m zwQ&9Uoo43qr02k}lP!o+DvVpS*b{IT!G79Q$^B?kCuKQz8EgS5QwXk0Uw&jixm(G2Bv0 zqco&gxF5J?6&-5zq<+-90CRzVy05>0=n?N}mHlXUqu?GiCIUoDBOmRv0B=d|7dGIP zRRt+ZdxPPF_=PM$XzO*0?un>+BOGWbeSqD(T)<|*hL~xL(JuVFeUO9Modo)8s zm@DN#oO3^VF3b{n*d}L$*?UsJUDz_A5>haH)p-gx;bGpEwPBpxy7 z+~V4lew?1Z=Ts+O9i%gVweD;zrYx)(gCDKrBf$8_tnhx~Zj(FR?J=XbFO=k@xwlG^ z|KAji*rJy>nPJSOt|T@?QhXckvHp+?;&z9TKGAsg!@gAc_nqS8r@X?1K>qE5bv%&? zSrp04y+z`gZ_CuG=Nr@~P-;mH>?t}BzSwFJuv-CWklZ@$xhv=N9!bh;e;KP|QU5~y zDA*!kCbp@I2AWoA(M(yXEup2__xgj=Pijj`)8hK$PFBKT_fHR6cz>cx*IzJ0w3A<( zH}gLKJSqL_si0mIJ%5zt$FID+&rY zsn3Vy3Ml&hywA#o<7_7P%@aZfkSO?ZL<}wpVE$2?N(jvNl|zSZS#EA!wOvZu`6$Mb~n2u?g|5{rxPW3@A5T)U~C)@g~H% zFMFZ$#-fF7eqv%_)LM#c&w$2->>7XhHDN3x@TgXskW~ks-zw+1i83J$tJ)(UA=(v3JkB7>V8+{$#q@i|gJ4CIH-W*t(e>kRV z7=R~_?GS)l9q@sR0K~w*F;#j50V0H3o5>NFEW>+{yrCZ%rH+}_l{nZx6pn?S19Jiq zHtJQaH5X<*8lXCk3k6)+b75wteoB}^^u1A}L{IjS$zm%cb(eHKdF4h!p5)u9ElE%} z=AWY)fF z!Q2QRkFi6*y!`YA*hX&sBVaA563{3i$sV?*izH3n`B>iAv8C;|fA9G6*rkON_s*Or zX(;S`&aH&`124pB3sWvy%gkiq<{_6%uj+wFd@h!Ca8@%B>4{`o${%hdmVYH4lgx#H z@+xx7_y;>dgrmNey8=N>Il*YzQ;04wqqC>(ngcSSy?C7zKcJMpneDi8Lkuz@bxXhO zKGWUiB;uj(C1k@o1L?5V+N_C}n4U);tkWGofjEzZL+uc$=<^=!Yxdb=+ZrnJKQ=I6 z3JFV*fGyG;hm|y3KzhX_uQeY#J}_zYwQun|Kbz#$2_LY1^kF-Z7Hz3|IiyMCO?k8t z2u?xZE72haumcjZ%V*2P$FxCcK?e#LKA9kZ{oLiSb?vEHJr~gwK(bOT8>31x#fOts z)W}x<6j-cNp2Yj|jLbmpq@mGa49)hk`v>~t(H?d&#AfoXT@YFuuF(_!Gxj$o+kjBM z6Heb#{@8|SC3(y3eA>$Z;OpnQQ6*vq6K=)?tVz+V$peiRtLzo%qS)ozmvjwce`kzR|<@a;F$NPYunvr(WTS*^zTBB5-@pc_JS3W%nUjcpx#BH zKJo!(zwKe@6z(H8p(7I)VE;>4li^&F{dShkF_0_uh~kPATw1H8VfQB_zZJwmSr2~e z3SIeywu;@mNBWugIhvKVfDggf&9s+V(&r1vcrYy%pCRTw|K;Kom=bbQLpy|Wg@J(4 zpRddx1)`P3X>Fg>=b>#pz*0rHLT4*Um`bBLk}!Nq-w6dZBG>fp@``wotUFqP~Pq_d~yx(Y$X)Q%#SNBp3#wOAZ_oxhd7{4zh9a^k$}Ne?W58ppdoQa?GK{rc0n z|8FTizH9XL-<!T=rSiygy=E&ac?J^ZRWn8YgR1 z<^C~1JktEi{0-opNeIw#+_kB1bUGMYWqwn)e=mg~1GWoU?~(fYLqRpLHOu>qC{UM=hM>e)*;`PB zIX{Xy?gt~F4Ecq!wMs9biE&b0p+8KkJ~;fqzvXp)VL!2Xs8u+@t| zn8z2Z=Y@J`*zbZ`?8W}Gw?S$zyj3y@MFf~sek#IVmJ#m!4Lx|DDrI#nY0%eJ!x{TRZ668p2Igt^zE{r5xjy$Xp z`1(CAtJNA03tT9Xc--B^-p07$<}`PHN7J@Vj(YELvlKKLzrP%cAXB1#VON#5 z(6;wUdb*>5bhJ7!ELO{Lb$%e;(;hHolkoo0aaAc~#&fcG0r_~mp-d|MkDdCsxtdHe z;yO)3jErb9idDaWQHSwpUzjU(amqO>sl(Aa0}1_KS`LNq+>y|6ac5UYI0h77buGD{ zQb>n0G+T*ZYWQz3yS}0O!x!hDQNDQu!~J5?`kSueJ1=&X<*+CPci-tTD0MCuj%-KB zGJQJhf91?Y>Wz~^j(jvzPXxNSef*@v zR34}^!WRA%k@7&}6?wQ*MD!PM+?fN?`;Rx6msqcg8aRNCk_TqANW1Rw0w|;RVd2&4 zYoRQc(e_f5kv^|9m`S{QLJG~a)WU_H5*do|{pkGnLnju+L!y5tljS^v!=))uOd^TO zAgRcp1aKI5pQWP99-|Xzu#MTSFp(1omn4cIB~|S2Y~v#7HWUrQFI#qHQfOF# zwDaW_;%HE}8}bSQ<^hm2wOVF8Isr8!zn}N0Ftw(n4)Jsk{!v$ZGA@!Bz8`At$rD_M zc!qYf#S;9nraF%;GEz)ZAw9Q?Lx&@$beUsWtoc~eJ~=Zl%7RlrVz-1Ga54klN!#JA z0zOe5ix9@*GuHYVDD!foEFtuxN3`eJP@%s-j2IynzfZXvKj8=QGD)CCr5}^|RG}?C zvk!7}ibbJNJwlnJYbl_q(N!e8ayc2re47~;p6Ped|G<-S^~x3-R_ z!h=G3W-nQM9q_+3NdTv20+AFI5e}q*E(|!z0{J!ldF^S;%aLC1!yvydAtYXUK0N)H zH%#HRFib2oq4{wCEh}>xe$hg;OiElkc9Vf5iFa(VBoSw<{1_RmPr*<}4sxl<>O$Me zFFgBC1Irg};D+n98|}>m9-K^Dhv+PQR(y6`41%DaA30DxxYYPX(YX&rqP9R*D<3*~ zAb3VS(6EHP+*pwJ(&-&7#z|Yv!am!yYqwV z5caKuDDU4ezhccBV%1K@d}5;CuMBj>Lz9ALm!n?B+>sy7hbXkBD7^|AY`^cCibHlq0xB3#o?Tq*Ru4jG^ z>cY?@emvo5{&19hP{jm9mRw0y%vy~()1dd{?M45T2<7m$)zZhee8!F^u(n$Nc~)%r zxAp6=v)er@kTaVz?}j;kl&+)Hh~`b7M(C*`5i@n1p3euY=)byAX1&%()p2E072%RIP^nD%g(Xy`5^ zkh}L0$#uU4-bd;pz6HiqmcXj8t`940Y52kIoO#$0_Kf=bvC~zO=T6(})A@FTX>Yn- zknBUAujT^RUHU9YgWcD;)}w-VhN$4MeoWJa+q4R2;St^YC1Qn_c+#h?MNA=4FQLiw ze@xZo#-xPM-^illfa@*t*H|0fI{3TJ2Vo1aZ?~f-Ank%xh{0}3%{LWa*o8q%+r~mj|6gpFl3OuWFLxwW_Hy^6^kX8E47rEHIl(iNZ{Mu7 zHRGUG8AhaUfos`wm;yi!gMc;{qw6Q+gl0d(_In2obNY}n9|Ox||4h&Q>F-Z>a@E@W z8oNEni+?lwiRcc}OI-=(JT#VtFUSHdmu$3Qy{JTJ&~K9Kv;uW(XEKE^8i=?gAw6<# zB{nQ`1{@O>q@e7v-MVqUMmwrEHZ^O{mTRqXLBtL{W9q-DBH|ou59WRwqEKOQY|T6B ziZO2Ue!{ayd&~MR@~7k(Q1>zLt+$h6`#o>?!@XagUcT?(jcaeMnrdA=({$G(vZ;)C zWv))dx0`+nGVXma6cs+tm#BIhe|;slym%|3gzp_e;PC)3TlWtKFNDOn1*@nT7MEGg zLP@S+ErqyMf?XQ_zz3Kzv%Ylq4Vzj;D2k@ zRk9w_jg57fuhg@1^Pd`9L;T$Q8}waNIX^U9QUzSW`~!SJpRVOLqR=XZmVU`gsRU>% z3&i`G4RA9ZE4O*C@)Ro#V`ZHPjKl}}PFVEH!3$gCesxUjTanhXXmqgp#Y1olDDdF; zBy;SjMpSy|^_3R^pd|QF6B~Gr-EPu7`0!c|nEc+m*xIuq?xg+TBrO$AgU+BaA!`)x9_Pz8-d6S71oPB?y)s?1$& zGF^9UKw~vJCQHc)qO>LWfti}yzm_&qa_=mo?_PC=m4yE_z?5%|M#>``YZBIUHJA~Pg^$BfU&5&O zVAA7{(fM)!o!5e-JpO>S5HLp-ng5a(b6c-odO=c@6nQX~A{P6eM6#q7@^S)GG zSSps)YirEvjWp&;-ef;nvb9jN5!!)#0jN$)VxWGkgqkD6J|EY5ayFRkt-h?8K`E4q zKaj*gyJ9iKMCZ=zLPF0U=0maZN$!t>*!cVU^n2{}H>Dixg9G^~(SKv6R8UUB)u$=RJfh_ftrrmTIw&lAO`URdD7bxu&oWtr&XtK|Dq`=ro) zX;P&HS`~!ug?bn08G-r$DI4-;jv4Sx-BV?a#;%%yKxw{+HY8E9j_{Zicnn=+r{JW#>BmO!9B45y`s^VANLz$YD7G9)YqFj&xWy!tdl`bduXGVw05ryXb zUol_y7BTxRudlv&Qx$mRzo%c}u;!1``ar-I^YjlZ5J{>OKX6=N+v!4kb>vRulKtzK zIxUd&5)b{O1eQ2PuteIV;4Bb%QUCZ^sOCjZPMy=UA7;m2gM~BG&n>@#Ycsq>eCEe5 zTt7PS=j1IaDGH!0n6r;T5l?qcN-0(i{3Zc zB)rR=Gi`PE)Kas;wE`c2T@raVlE3+LXcKtkyJVzQp3s>)Nh?`d;gSZTBm_#+({gs+ zg=_K79J<0&i`tW7nnO?DW7}M^0wbP}mp5OWBsNnyJfYQ^h{q%IjV|2fjMCw_j9<)+UTtpc&lvbe*7RPYK2`H@UWC@<0??g`~e2X`X3c!b!! zEn)cSi7zx>r;CS_!PHcaoTuM9d2(k|xVrPmXIM2i2i ztW4IZTbfW`vW-n~Xk?(r`zK+UU|+-DOz(^ER_6GHABR?&x<`r8B$vCswEv9w6fa^Q z3nci)vad-cs2s$$e!1R$V2R+5kNj$@5ZL1_YAVzINvMYzWRE(%V4>(liR~{?m!+X*bE*N=uy|H4;!QH8sv)(xs*EZsC7W^MF##d=97Ck`tiLlG=)xs{Gsh%C6@n z-9X*bbY3i_Z8p|NPiWaEt93Xu0Slo*2i|s6eSzMHgoJUv;=2iB_4+2pxknd|uJ+DY zq2A*ixEP&Q(EVf4B)+mw_l-dBNkhQhhw7oJAEoBMDL zqpB0a2J%X@j`5reql|v>ZJO;PqWE>;T=9kY!Y&mceCd_q!#BX+Ett~tZht{!)&A@L zm-mqjTOwC}KNj!R09;ulrPXcXcDmwP=A)I4Cda=fTFanm<5=1^nmCLS^<>)Ibjxfd z#f16}G{FL*H^B_w%$sk+b~f=5sGk#b-sZJ{|prDd_vT(v$V_2;-x=eO^;2RVVwJ&Kq`SWx0g!s zVdD(RhmlS zu3bMMu}y0@r|Ej4VHkrDzCXmZ#J_oCBzyHO1#ri)ep`d|q^;+9tFm@U?eSx6WRyC= zoJq!7tu{RlXE1~madz_>j=nq#Ds=!6 zACn?Y5mCWJfAKaR(5^ODhrq9G6wcd_=WMmhAz}nvO34ETv3x@8>Mhd1r=ym5A~Q`A z8qe7hLp~!%#6#Mc?a!TeWVx3D-lQ(YorcBjwXbZNnh)4xL+S6+rp>0a9OB~4_Xgnc zWXcRiYIaGRCUGuILJjKIMLK*3X+MJPJhx$j?11XM^FEgsOKTnM-+Yb~v$eBYOdjS$ zEWy*ln+kDmkKu5DtW_3CbdRj5+I96Q?qt8in#=O!CQZxev@a*aL1umAC@#=5aD%VV zG*bUhjk6%<=2)-4i$zR9Rw{ndXXAW|o@k6Ag#uxHH@mH4PttJg%qh{<*#Wb@eisri zi9KfF5R2owH*rsnk zP<#u9A&SKd>Tve$EBpde#?SM6Yis>Z^LKo?Q6Dy&PKEmfw~Kxr9$MFQW60C{C-3!@ zuB8SrC%%x|!eOHpr6D9ydkxxDA0`goujh4l=DG|lIah{$7h0=~Jd{XEdQ6eQ%3PWs z-+3o)T6eyq_RXplrdzY=s_zYqoSuO!5Do>i)2MGM$l~K3C~Z*i;0h>iH~vz7Em>+fBU*E#IRtc2vBPwi)7-OYle z=yfeVyWc7VtkcbPhj#m5rP;kpF%f+2K+7KEs8tb7`^eC~yimijHX^aTo1M20l~uqW ze`ojZn#jg&MiXJ%2NH3=mPujlAZUx>=(g#E#*duxcu}$LCwvqV*|6gCi#&d*omp0W zCD*!e$Im_6*mZdPG=r%=?F)52hdPr2_PO8h zp}^G%^_&#$VSb4}s94(Y{9n%}PIY~$Jx|;(2te;vmuni?$2dWqm@&mi zn*~f;qZi`WnbL1>Xk6e%P9dtI4#SKh3^@O6`ZyM*g!-YXVl)KL;*k_I2qunHdHAtnW5k`6)c3JZqsbN37C7o%2_c3v*A(Z5Xc-35z~Js>KQ< z?t{WTzsDv(RUSZKjqS6BfMfS>p74n)yzAm_X;RX8Nwr1SKzrG75nVTbv#$x_URZ;9 zgTEwxmjbeO6Nu;1@z0CCOK83ebOIY6ng0%xm1lNpe;RTzzm)Ws#%gnO#fABSe#XVr z?O#{8>s5O{KTEKzyY$dns#bU%6(VL-2u}$KNCy`S+XML+K$ zp~)XC2QihhB23yuHr1D#m_$8A0W1W4>wehNsdAoiTr>E_GJteh`fiDb62_kjPz?-v z>qP_RX0wkjtn!Py?pZPzNT>`wa~;3jB)@n1TT*SfTvSvv*|bbh{0^*$ci|WkNB`%& zD#1gBiD&-W>bF<>!LM-?4C}&Htt*9M(t-DNGD_^i165|*}MD&-89a|vsdM_6t|qQ zJQ`fKifE?}KO%=uUX!S-NfC7!=3w}yYX}{i(4s#k)s3>fR7)T9QW&x5ro^bC56^UR zl5@U#O+$r34I3%1X^1hraIp0^w)r5xHiBI#=STd!US4$m-rNaMuH}_y!@flxw*4E> zR}`L|+$q5!A!xbRa=%7BC`{2mu(>#xsreYu;3mX zL}*I)-MXTG?_UU&Mp>GOguWs}Ki2^n_&ZpJpy%y zLu}M0^Qk1qpP0b8EOXZ0T8N(Qm;>e^;N;^}Dd8&3aF(lo4mlC`7Y;{&_gGwM;1Bvr+ zjda(g=0=pF$Pi@zL^ps<4MgGZ6CwZjdF}TR)iOysJ+tK%wqm;IZO=;KcFt%M;2Lu* znyQ@P_YNx_8(8s26Xx|JaWE8X?|L9YF@qM)60uod5jX{h+sQQd!;dt~`F@YZs-aaw zdSV3USJv^M7*&5?&L7iPAz<9vy|%Mx-CvEtkn?X?a{L23F8<^zFN&R>hRFDuXwuaF z(gc(U5bJXv?Irj)M0;1tpl7-%?&muqpWzC%He=2?_bhjVpz z(Obj>SAuSjV#Ht8ai7IPEp}ngN~GDxn(v4m#Ct~}oB@S?67wMHL-1e+u!+;YU#nr` zxC%(d9B`L6l~*Q=k#NRxf#m?Ewjx97@sAEoO2uF*k*3H`Z@`YHt>R1|IZIpgY? zAizKMb5I$B^EyFm8*P*ZTOVHd{RAmjR$rfyMCPrR1W9JNieHuS{m^QvVV55J0p}IK z1+CH(`4h$(U&x5d492tIi+W5jxS5gNN%D-UW(#nphfZjIRcCTBd&t=>VK(Qn#md2XG?S$+x-iXm7|nV9=^0g}P`6)8v3-3= zO-g^9`UtGxnJDT-)!9YLeU8Gi4Bfmd^JXOawVy9k&#V&|1brUP{SuxLz37qosbB0E zfjNB%B1!hAUJjA(&yMjP=*T+pWM$q`4L6pXq#|o5zU8Y%Og=JSO4AQ)_}ZfkADiIl z)(hwfCo)KcS=Ja*RX{BVP$QEw3^?zVevQCCX;Gqd;pa77u@u}0Y2O-7h}i^=jaEX6 zFaxkgFk>nNh8mIsoCYMkU@oqi=MUZnBc5TXhgy}V@V%$eMe`F{h0o3UPo7PX+Gr-s zE8(B%28aT8I^}&4OpMZ~5L~`k`67YPNT)f`;%1?0nD8PlHYPMOFA36$r0K(sELJ?o zENx=T*PfxV!a0LPv&TTH?|AI{d|c`EeFo8@3Ji#VOh^{YSmFSDUzvRQ4(GZk|M z6o@TkR#I_>LL+;;&pSw9;c6_U-~qvhItZHO`2G+?$cyvK4=)yI9TFE3%2kbMiukFlP)jmOzZv>gM*IA1 z`58F6A%8czw!@qa=Wen?@>|LJ?qCGxVPeSZ@@)&yo`y9|76*xaEdeS&Jd$=`A%St=rxD1c!P9O5?Y$OO5C!$yQUPHdJcQaKR_6{OhII!eh@$69#NL)lIqX`=1L8`U4Ij5tK{0s zJZ9|a1O+OoG^icP;1TR#jDT)-Df@>9gama_?VT1KLwo$P znVZ%CV{VH-*P1!48qZCL2EBb43JhaQS;XQgPjElrn$|XvoQXOl1{XCwQF#?<2`@Z& zw>Dh1dnFB|d>9TEKUj*CSO__{aj{#He0pUBY$q>wI@C?Z@TuUH8$NBx?^s#(VYg5d_|B%Xw!*= zx`J=Y0|sSIr$w9~sZC!mq`v|)gVb~@Dq)w&S{aWc!}nQH%mHk|BlGY^aZiRz?;4MZ zlu}RgeQ5en|8Y~t!_AfL$>sf5&B|xesA9(~+(-XaRGz3u5@h|g#?Jtikj9{%{G?0O zV+MlrA7NnK+53ORSL(G#gixZ^lE;79i}}`Gm;_Y1qCq|+#gUEB0BbRe7=pl>%w9f6 zj0XDJEVHb4NT(?2Q4aLR@Vd!XpX_2#!J+~CHf*we*$(UJDv_|GqvoPjrsfJy+8r6N z%3K9fA&OUCY|Q-zYD4y3`U!sy+-6xb!8R0owV@bM#V-QbD6MbDv&{1IJM^29T$t`| z2fqZI!TL{$3FmZ3+WfLru5DX&Cug{6IMD)87y9VPgMIO=6F9PT{( zI7zJ-hZwsEyb3Z-gy!>Tg-<`Cj>v%KSGRrn`n#JcnBmE)Y_)Qpx&7$mrqKku8Z8z! zH**EFYXIpd$hZMd@ETEjCByu2zbdAp+b+Zo%=nWBOU=Qy!N&iIS2jTM#eSkBPOx7uP(eeQF)APi7Z|m)CIEn+$mUjR5fu6}4 z8m;^-k7MzQ5PDPRF-Bc)%fBR9ZFT3UaYVLcin(T^C+wx+15q_viwXsU?ONjxC$_@zk; z6)NF$=Q94W&fBNOVg15|*X8}pZ$AjQv1~Q0`cgJtKB{DkJ5xTqu73PiXtSrFH~#v$ z-?}t83UeSMql|HjOgbg;UZU&^iCHbNQroNjLbP)n29wh2&us zHbn5Vo=PzVg3wl%dxYwlR#~OZ8*@U@H_V$cr~_gy+>=)A4}uo==up4(PKR_sAKDv* z;QyW;pZ6Syw#8;e#McH22sCH=I}5Hj)DNbW1{)q%*TC@KII75>vMSlXBU2f%a)7f| z#@`Jl?uIE95fv-=58J$H3dc#KxZF}sx`T}(S%&geD;#H;i|Hi2Ovl&-Pi2RHZ|?e) zkM}(*ksc%`qqy)(-W5J;T4)8=uhJ5L*1-Bkw{csYosw0I@~M|{th03)g$y7EdtN%nLaJFyak%Z7Cw_3a8S z@_sqS8ue()KVoqs_Fixzy^7kRMU^r2d={f9-tag*O^c3>_Ti_H6gfoosm7_bZP2OL zxn_}%zcWkBtZ>lP+kL2Qr`9LGxJ|vvx*4BP!b5UTp?X!~zMQ6(O<9>~Mvd$9?zd;) z2EOE-uM?NCHnOFuC|UwE>orL|SlWRJ*%;dlQi$U6=5B=;TSbRYxl8`)P>czpk|+1> ziO2{Hkiyh(P>?+V-mUB7D+O%A6sHHtv_MNP=%rrPWw(uB+u6{v9M{X&sb!drDZLTPR`9b9kSz~>B9QX zlJm+TbH8`cBV8dN-nUZZ$NhVB0tAn@J^~dhvcELdoyLn}?nzI6Ch&T?kxM_Z`ZM4` z=deGPO?4>g_^NvuXoepf*=E2z)fdG3D!EG}dWjL@%$;T3pfi;olp`VLZvTAO76=RI zn_L%;^JojA+n?Db^Nv3|db;DQhGJLV6%@IQ>i*OD1csp3{`{Pq7?YhIJHuGA=fT2j zU`=*}I?$jjK-A+9d5L!%B9U@AQgxNIyqx+~y_=MA%hv0F1zNBO?BRbkF08n#>%&?f5Y20fk z{gM8ZJJW5CF53r+NnEvRKr>9_4PIG5_k~Wju0DNFb`$-V8RNsRKu5Q~h4=YpMB@vb zr3(+b2oEO*A5I_9i^CO--YI$NysJTfRC|Pit-Z(hU0x3J2>7*W&3nP6%as7XDiaqk zi?blO$WK(b;FxF8dDhcMHu`j5AA1oyVuA0^+f?9@$rg6s9SwAT{{C9-XBH2C(2E+) zJx>bkY#E#z6XVRnsyA$09!!b*R&PJ#GPYZr`1+CtbS1{bJzpAo-I`nXlc#jy`TRNw zI{*9CsElx?8w&onk?_kkfjj22ugWo|b#XY_3{ut&r@Fu>`Gp!&AbVN%9#W8E6_eql zu*}%ZgpiNa(c^_kSE)i3jE9{5GDuX`zck`Ut$NVJ($#1UbZ&Hw@9FlYB4*C=RI`rB zi2Bb#qX;lL+4GDi6f38>_=!`nLk%Z5p#{S@6?!|h{%FYfBxdO^K2n*9v*IncGAkUWe0mT_t z?BWoc16&~FnI(S$qf{lWe9k4~7CY^Ri44v%f14Fy_zRml3%GL261hZ+m5%%|>@Q4z zI|5X={nNo<;Z(7R2C05prhRSx?EK=(_Db9`RfafKVNWjBuaLZ5E4liwOeK(_bk|le z>48(^J$ot3!3fHR6vH{?=syk2BGKgdzsW?i>)nH}H{4kB27d(T;{IP-UmX_J7qxq4 z0O^)cq$Na38l{DyM?;#~XCcx>mw|P2JA%a=+&hGC|!SRw(c8NTNp&!hFjI6@uc$SyPr)c zqc!$^&Z1woXlbTChj^dw{1aWZUYF%nAQQN#S#GppKG*HD|LEJj3(-gyktlBcuxLqu zc}L^sB~@#bF~gw`TJsrkc2v_YO}5Tgyvq?l=p@fbJ#9VjpIE&qlIn3!d?DU>dz*oG zvKy9_#94_4IWm-yDnRTM75S_eE&AG{n~^RQCO{zr1=Pg^wG!w%DXnpUYAnka-ht;` z4?^-x3o3g@JWWT6j{Y%+!OuT9;-A;GD40XL)LH4wP;b72m)xQ9!ZbJ6nT6fW)Vka% z)r}zfJQoq81%>1*$-du@*xITU?B(|kZ*A4>Z4P?Xeps$#t^IN%8v9Zy>h-%~QAE7W zz>>o7SN-;1J* z_tp6d<5Vp4ME`^%<>5XRI&NaO^dAL-R+_kX0wQ>77h9ej_LlU zf@F&O9%`~@J%P^shOy1H|3q8kt>1G;sq4HAqpPwd9->9JHK%Sc>pxjuAIe2~eSppI znhm{OqrjML$y862wOH`<|r;K>EV2&ddQ zH*nSjwMdsBa)BG=M|8CN{O8$26a5Q~FUg98#ci0KZUXoGU@ybaNJSUEgP9W7s$=v{ z`C;W+N7miW_s4;Au$=Oa^d-HYD3*hk z5BIBx#*wsd{-k~Dt>>2Yf?fM;xu)-X%XPp~U;X!_O0A(ShF5=?mz|H47EF0Y_WZzyr|nRMGxa&xK(U`^m$^WukZs3B zA4|BtsVY<)V)9h|y#SsPc@%U&??*xvBLbj8M|?Y*UNovS3{D?sgb$>nd?~?vk>ZCv zfD3(mwj`3u{?V#|mv@1!p|q*<8$7(uB=JIB30{f z`|@y1y<>khLHM}H%67Q&!%I`Kvj6aF@{apzzqR)gTXnN6drQ_W@)ZSu`*h`@uWFMm z8$i2ij|$O4sD+q6)n{;e-=^!_YU-N>et=9yBfX)Cs*uzUGlt;c91|mg0)A$>Msa2_ z>~aD8cfrNX+uASAv40o5KuCpeevhsqFH=V2X`mr4cU90d7+R@RA(VQvDa}jA z7G5T-cVdrtP2N<${yZ?Jb3WG6&~PNc=N2$=HHvj4uNY;=I%!Lc!;?CWUq&3khIv0bLCw zxLae9)hk2*4 zo<(0Gk~e`iB4+YB2oCbY)SATT6dd^s;YylF&Z>Bn%#eIYnMMwby$4oYLHTwHn}q_( zT=%Vp?2U#w_|Xt&cadI787;4<$nn#=<#ssVSia_TJ{>-nmgZ5M;!3m6(YOo| ztqSRlzqb#>u#p<*F|Q8|&q+htnf> z>w`}5{H6ijKmQ4$1g8ftW2%fMAX0ufRY@gk5qSMotR*{YG%yiSx>v-62W7Wi`<;f) z$whveZ3qe(m3!sp@0WM?0^_3xCbdJfvo883zM=bOb7g6mx10Bmk6ve=x6pQYt_#_w z*LMS4z;2AVQW&2?v7ZwKA_kkhF*6S7hdaXrDu}&Mk5R}pfqQXH#cy^}I%NNbKkut` zOt%&5`VL|=8xBrK+g!*!Kh66x1{x0-$rJsUMS3{U-O&qs8d>y$*OVUZbr7BI_KY0y zo*U`PLV?*RmcBLeJlT^5%el)HrS2USsTTOF1?Mcq*ACOgF7V1`ge6Z{)Y-Zqj@QS= z_5kHVUCm0JfD`Tzk)GdyNE$y|Q8T$Sn5-~%gjaP$W;!3O@=XZUbw;;CbvVR7Vi1aP zT<#y^`2ET)i@Fzbde*F+!keB_(GH(kukQY;9btY{j=-JyRD{2p6pO}+I__<9T5(X~ z3PMHZPlI7T>)i66AX>#A3@T(Uo8(8#p#T>a>=^ywaHWpl^V6gyh}x*gI3QDZpAVUv z#5^C%J@7vAHm&?sJ*{mXfHtsc@XCaufZvvocl*)dQr2%ulq<5IJGz{OFwwUQ!d}() z+EvQhA{@1E5rDa$9!nYqWF#g>$!2bY0&aX21qD;DZIAoE_N^)?o?&xmwsWR*TYd}` z+9ans>BggeR8@9HU8P&EO-TD@Ago5~7d-BMSAuQus$$_CA#l?7e8o$FXRCgs*?+0m zCfHdt>nYrU;{G_7!)etijr=y+C9t)G{l&}Qvh!N?gTxze&V65lJ#z0~db8dcfdOnm z@$b`Uv3xtz%wECx>-tiWh#c}5bc_ygiiO?G+dqx#InS3+dvcbL~F~ zvKB)Qo4XB+djn#T`Y&hE^oh!|Au&vlE#g6b8z1FKj15i_&s5=T=kC2jb6FiD{##ya zyMM5%G|YHa$IQ*FCHFgE5nbd-+y#w`5Z86^YyT0|yF zewgk=-r*HlQHJ^z80LOu?LoBpKrc3<4uit3$UhPghYpHslj?$5o*K!_8BtEAtC=!q z~lPJN{Oj!ieyKi zmz;XBu^Q3^wGQE#2uw{K-wvgX1uOQbjo$fhhlyBiy)PCnqS^kZo2h14#zw*T0w&;O zpAcCjO#(`{QpLj9u<2h?P_UXKoG@g@`O;Hl4gBC@BXBcWwKxpC2~GfDkuMCjZZm8e z_sgX_u|b73AMiW|wxLX(xaoyLj6FkX2rrJypQ=#eeF`$qVkbTKRXb|wZi25}4AGXI zc%N1*JB8jnRZXeAH|>HZMb_<2dh;Of@EA<^>%4y7<8f37eSW87#CP|;*70cGQC^cW z-8kUc+tPZ#ry;BI0w~BbF=QjC_R2A(?A7ph18txBR@Xo>!{Y++`z=#1)8O$pD^)B5 zBV>UieVXrrC?FdGk`L6YfnJ}Ej&WraEvOp?uc(&3KtCOa}sI||j(Ng>iCDZaB9ii>xJpJYsZyA*4a#R5f(Pq8v<1MRdHiV_ z4mvX}+2M9^(R(s9F349CV-TLyjn(ZTUu&kF2fu49U1EJ#r1hxOM=531B-Kgi)Udkt_TeBJ z@HYj1SVYZkG8uj0kZM$2AN+1NZrQ%Zvdw?fvuQBXKOHL7D-V(A^6p=4}j`#1lYs9<7u(Ja*KsAIW&Gwn*t*Fm1 z(}aV1qIHvpw|i=le)Jp|odp(AuAlHzIzt$P-05b!hwt_3agU(iF3CM@|KZC^FvOg_ z{B)wHA<9RD^eHVsd6j~T5J=F5fGG>Mlb>o{6)YP-1?R$cooZEIogQe0iWw+wFWfL7 z+UU07;gQLW`=O-kcAkc5wj+`7OIhT=dh9(C3Obv>hN2z(B)3#xaSNhZkAO;iFGxH9zH9`a`Cz zDAWo$h8%bPQ4&p9Zi!M4T*f;u-<%UN`OvthHWIt3-`M|pOhLLM-qxSG0#_jvAwsh7 zB;3NzY7hH{s8<4k;-OVe8n>|{5oL+|tblwR)6wwGGiZImoP9q#3!$rh$xjFIA-mj; zd-OW1H#IFyC`(v`(;-ncgFS(MzAQH&-1Hmq3r*8~r!~UNxiv-`uxUWNT``g0WKS_} z<~tjq!UR;)4e>~T64FQyxw%X280eXKn#)ARRqaC0LU?R$?)-F({KOp+Sp+QWNFCPi z>i;A3S&VUEu8zuSy!xE`+BP(EY4qYI;{0JeYHXX$C)C3G72<{u5x@Sk<}VhQ#Y41< zep^EqGWWpOp|^%x;0IL^=#(we2SDyOe?@=@P_pHP!d#+G({@;Wkmw*ptoK^|py;%}2=s^GSSvEt{egcY1oTl4J z@IG2_onZsUTskN1)=dzxrPo(J9Ch358| zv4A=Lhj5-pSh3npH@}9Xn6u9U`CtbH7Xy$`#ROdp(qIVu#@3EoWiC%m$u4k;_VCr3 zB|T!yY+-=`TpAr!!*$?z`B+8vCH^@VJJX=|<)WJxFJ**MzkE1bi9aUoKc?=7FzSfS zZ52l|<^A$lwR47k?G;_8_NEvr9%=8n&3qh+I{+fvPHd$()u=`@QAF z^PAp&q-?xI5+l)^*8+aW!?dxzjRuIl#ch0Jtj0dfV2@{JkrlrW4yI15K=9QWgl zd_cXA*7fCmjug^UJN~)#xLrVsX++X1q*KYdZjWsJQvTAOjQO9ML`%kS&^@863TBRy z3k=0%HZeTLTJ%u)e`>BI~O9 zx#Wlo!IgaD*<~8!>vZizqyScK{ogr^hmn`a_^7D<+=Nc5lOcc3eg57)r|_CbDD+-8 z;Sia{jwX9tJ;EQ9QeIPT3cnrGG1Mc;aNy~#Iq{aSVKrh!Ifs{REnsDLi;IlEd>Bt`w=aEw^w zg1Nh~TE+yQKX8+Khmb2#55_WD&*)QRB)zZEGQ{9%3~swyzs1R`zdbrKnLC5>@_9L= zS?NAyO0m?Z;U<(_EtVH)PbHw-E{gAAH*$3J>a03vsZv^CJ~P`S6OIdoYOE+?k>_p} zsr$y?T?nBVS3Y=b;NNUQU;wJ%YK$JYZ12;cb=Z(5L3C)xZJV}u*>SuijZy{r#(y)8 zD#ZVllg;_C&ri?Gl$ocz8mcZ$Erjs;bn?vJ!_+jZ@+%JDPKv73fEr=Wk8$%C?6JYo zvU`nS^!JY4o}=UEvAE2PjkNMN9!c^sSxR+*tbh2EWRZ|(LVvS`_UGhyb-eP1%(^RF z(~HTL{3mPfeZdx&cWr2sR(+G=<+_DTRpPK-t`W|MJi_t0Bkn6jFAvu~*AGkL^T#() z#8u<~%0v)b0m>$BuXioow26EjI9lp=K{vbWvooyam0aw$=5RwZWX_(*jYX9E;y1m6 zvvz4kqUKQbVTuct^O5Z5wnnENY>SRkI>Py-efvwgsh#cPd^}kLrY6mfqc!qscf0r} zlokE7jAbp#Kgk&x0#9`1CP)Ab$Z!wGK9Ss=)TET37Bkl)yw%pb=??V+<26)hCM!I) zw`Af+w$H`WJ`(ehA7QpCRtyi)pR7&zWdPh z&H6S*=Nju-;hB(u3&2@Lm&m3FTIlI*Dl8ZM&D*hN@LfBg#BfIsB^J5+KuSgn$C+ld z^6S+*3p23s`grk~a+Z+<3?7_0%uCyBruMlYw1$!Do%FpARePqg^dlmgK5F6SdmyO^ z0zn#D&A)!*C;-Yy;07DoiKIm{?Sd~wH$w~Tfv?X6H=?(BVOLaNr8h_z4l8MMF5+t0eLSw&LJ(R$$H7ij(!NY5Dgp%=hyfP6(Il-&ios&QM zioVLuo+iO2oy4JsG(N1akX$ph>E4kS|Aw=l9_C;_N8wHW#S2AlO8t@dkoL5ERXOL{ zxq|?}i=vdaydObaPaXXb+Ge#&Vy#ntW@He5xlifB3IW+9coNb*V_2iHy@^H`;bo}b zd1T)xv?GHm+<|fbqCV!2{#VkXwXWzvd6Y@S*SA}9E|cVw9r@{nVCXlm8#mAUD^4CY z1OU=5_h!O=Bn*qB`N)H%38i3bY9n1_q+P9S6Y=AI~B@3!}@c(;G6~6L&Dn2n5sj6^o=+NUZ%b za-^=-{=#dN%HF`nkpPq`-U(aiviPbr7s{rqK*v^_lInma!?}KR(pLva$@ktonJ$lq zpz1-dM@3wXy_Q9ah7V%n_bEJK-7t>&2J0Is}*>HCf_PoAS$439`Mq;)>$Ye2IVL=Z~77M;R-Chsy z^%#n=>ipwI?)E`ij_$)STVvF&ffUc@g@N<&H&4p}Au<4tq3UUUJG!Ga)ST-JPV$VW zHYFlKLe5Oa+~|u|@N4{~OXj&^#P|cv6l+4?m5Q|7&ZmA4SpZ8b)*6fir!NP%pD^5Oh$V%hZk}V_KU4Xzk|MbZTFNhu2+Q8F z^)?%v@Wa#FjuL7!-7~%HdfWUd@we0?kz|Yj!ONb<&QH2EX%C3nq1($P^aPBh2g{|055lU4ltt}EO7mv~&L`0Pon#FP70H7Yp#X{lI2O|bKN&d z1Nej|H++LwbB8+;(SKx^C6rXQ|GG4?apN?1Z*wH0t|T2 z3ChX)ht`Ub=j3mFVv<$Q3uQTmFBN`rz~WSkGA&t1Fu6~-K;~E~hxwS_BXX5dO97?a z@Y6^lO{bQw&7bjiF030JsVIWaAvo3gG0A0$-oD79>KZS_&A9G#=9AK1VSGGs`uca? zJgL6T&BouGv;y)XJ%7$|C?Sv%PIY__l6NBm@Pr6N{VsgsBx72NBUtu?6dYH$SsH7I zb*;2{2*iY#cN&+b-7I+VtL3f1j90yP@SAma&s6MMp0!HMv~mY{QOc zfxE_}2>YXg04Cn9hZJHzyV#Ob=Wji+F|L*&*m)9H;zNA@C7gJtd zk`lCRiD{y@#}%{*wttI4h?s;Xei z+$K-9cqq98f0>&2%3KEpGqI(F)vIv&mt());d#8R*=sklW7tbgVrUZ*xIAt%)>$5y z?@kB;xwqugBl>0&qjC5ne~LUJ1FdX`#EXHg;;V3?p|2`!NL72P*Ylog0|b>J@_!lT zy%9AlK8UKx#zr9hA`DR*z2s86K1|`ew6S>`SFJ0#!7!)>z~(XmdHHN(ydRaKR<`cy z3JxU1?oH93dOL)bL0j6-3(f1V@q4|s>s-dc&q2(dy05h^u&y#aT@U^YeiQf68M!}2 zy?I20U$x9*jG$mtCu#Cl=o_Yo$XuKB__uF%Xy9;~(e&n(d7d!G+N*ZR5K*BNSOwK3r zBPH`nhH&e-BgE|aszcptXG-bNb9>gRQ(Z0hVCo&}*bRAOilNY@{80yw;j7m@l`1+1Y$G~J_X)L%hbLZZh{C=}oJ0O!5yQbkWg`jWEVO3klrBHI=kcYRn zvgvv`+U-~{`RKw*uZ6o=E$2NF1@KpT2`BF(dq6H*gXk0Mc70{pePZ3p+$HjUXzcjj z@Z%&Vx6biMg3qE+WNZ9Xk5)Zugvm8&k+Aq zi3aDxq=TE!Ci%|h(O~UQD^K}}$m9LNJl|u9+&-G6-OGQ+2q>LPpcT=8cLytBl55B~uxDLw>-5sX22s43 z&n!MM!OAoIJw*2{p-gM!5|c&-B?r^u;j$|=m52On%PAd7wO*C=6;)&CI52a{cGkBa zXscF|Nu$2MCO({B0gq~3{_zC2PExvhe5}q#rxe;WNRIFae=k;hUHpL$Fq@@)yXS$Yuo#qt5T%IO~sfSv?sRhvimM{cN6hQ88Jbo0`ow*FZe*U(ik&#kA2C3Ji}(wYMo`{bF) z0G;U-T?K3X=(5bGotKwJ7gwoj6r%)3$SY3tp(vfv6awTq_~eHPg{>UUAIkN|E;~zq zd<_WSC9EU2KVkk)VuxY|XS&ji`+95tQ1vC9bsG1Nw}(jvCs_aec#!m?RD9o@CVTs8 zzg*+jf$HxlW)_MtgtkhaN%&OkbQd&M+J6N(D#)T`9md*AHU%f@=VRvXOLXRpvxq2w z@q|Vi2R8DY;(fCtNquo!S3aY(hL}v^-N+yJFwsA*sbgt@sGSR6mvA-|qH26nz${JQ z-5HzxRkXG-VdVoGZUWN|RtT}lv{YP$9N*SMNyIW%x%F-7q)?~V3wk9atug=uZx77P z$izAS)vvwp6U3R@2A>q7zD);*do@g7J3Y_c8H{7Ygp&Vyhraf=rO{Q)T9BP4Y;#)%O27El#)o-L;;#Z*=JRXxiCgk$XUJVCc3x{&WVJ zf*FQe!y`WRYw%+S(U1~a1+wX(I_nM{jPT8Vael01IB)?F4gH{1D*rg6u#p??v~@|> z*_=~91JEjWh*oK@-lUx*+2#~0qe2~Af#ds58B>~#l{|-t5yIz70F4Yb9h59~^`YgZ zur$ea+^ z;O$?4^GmpvEi7U9ry2}y7=!Tt4h0~>jI>tJ+Fn9#JWj?6Q95UK`vwpxV9=JWA2|Y& zuS%o+?W6nw{xAbI0=TJ;=amKD`lI0B)GRa@oj2-%aA$5F&=DNu04PWweIF;ee1fYL zL+*#b4fhraj`j$ldPw|195VxzIg^47#& z_iwD8I~%O)f44*$ROSJ~i_14T%K>?~itv9fcK34uLQk7n+RrlZEC{@eJdwV+m0vf7 oN6!*&^#9Ek*#Ao%`q*cH#kwjIBcBKteu@XA#TCRVL=FA_2kI7zX#fBK delta 46842 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

    4N63kxMM*Q8(G(OkEK|%pb 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

    GUY0Y@|BIQTI*Uia5pid=~qzR_fC} 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

    $2fj536Rqlm1)X)u~$r2OytN`6a5<#HU4<2c6) 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 delta 301417 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

  • I|EfL`L&YiU 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