{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Unix Essentials — Bash Practice Notebook\n", "\n", "This notebook contains 50 short exercises grouped in 5 series.\n", "Each exercise has a hidden solution for self-assessment." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 1 – Path Manipulation\n", "\n", "Focus: `pwd`, `cd`, `mkdir`, `.`, `..`, relative and absolute paths." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.1 – Show current directory" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "pwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.2 – Create a directory named `work`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir work" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.3 – Change to the `work` directory" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cd work" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.4 – Create two subdirectories `data` and `logs`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir data logs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.5 – Move back to the parent directory" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cd .." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.6 – Create nested directories `project/src` in one command" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir -p project/src" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.7 – Display the absolute path" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "pwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.8 – List all including hidden ones" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ls -a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.9 – Create directory using absolute path `/tmp/test1`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir /tmp/test1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1.10 – Remove directory `/tmp/test1`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "rmdir /tmp/test1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 2 – File Manipulation\n", "\n", "Focus: `rm`, `rm -rf`, `rmdir`, `cp`, `mv`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.1 – Create an empty file `a.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "touch a.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.2 – Copy `a.txt` to `b.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cp a.txt b.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.3 – Rename `b.txt` to `c.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mv b.txt c.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.4 – Move `c.txt` to `/tmp/`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mv c.txt /tmp/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.5 – Create a folder `tempdir`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir tempdir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.6 – Create files `x.txt`, `y.txt` in it" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "touch tempdir/x.txt tempdir/y.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.7 – Remove `y.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "rm tempdir/y.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.8 – Remove non-empty folder `tempdir` recursively" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "rm -rf tempdir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.9 – Create and remove empty folder `delete_me`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "mkdir delete_me && rmdir delete_me" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2.10 – Create file with text using echo" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "echo 'hello world' > greeting.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 3 – Redirections and Pipes\n", "\n", "Focus: Redirect input/output, combine with pipes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.1 – Save `ls` output to file" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ls > list.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.2 – Append date to `list.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "date >> list.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.3 – View first 5 lines of `list.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "head -5 list.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.4 – Count lines using pipe" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat list.txt | wc -l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.5 – Redirect errors to `errors.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ls /fake 2> errors.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.6 – Redirect both output and errors" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ls /fake > all.txt 2>&1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.7 – Use pipe to sort `list.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat list.txt | sort" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.8 – Combine commands with `| grep`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ls /etc | grep conf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.9 – Use input redirection `<` to count words" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "wc -w < list.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 3.10 – Chain three commands" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat list.txt | sort | uniq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 4 – Viewing Results\n", "\n", "Focus: `head`, `tail`, `cat`, `grep`, `less`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.1 – Display first 10 lines of `/etc/passwd`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "head /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.2 – Show last 5 lines of `/etc/passwd`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "tail -5 /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.3 – View complete file `/etc/hostname`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat /etc/hostname" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.4 – Search for 'root' in `/etc/passwd`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "grep root /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.5 – Count matches of 'bash' in `/etc/passwd`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "grep -c bash /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.6 – Show line numbers with `grep`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "grep -n bash /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.7 – Invert match to exclude 'bash'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "grep -v bash /etc/passwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.8 – Use `tail` to see the 5 last lines of `/etc/services`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "tail -5 /etc/services" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.9 – Concatenate multiple small files" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat a.txt greeting.txt > merged.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 4.10 – Show sorted unique words from `list.txt`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "cat list.txt | tr ' ' '\\n' | sort | uniq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 5 – Process Management\n", "\n", "Focus: `ps`, `kill`, `ctrl-c`, `ctrl-z`, `top`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.1 – List processes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.2 – Show detailed process tree" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "ps aux" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.3 – Find your shell PID" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "echo $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.4 – Launch sleep in background" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "sleep 60 &" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.5 – List background jobs" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "jobs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.6 – Bring job to foreground" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "fg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.7 – Stop a process by PID" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "kill " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 5.8 – Force kill a process" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# your work here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true, "source_hidden": true } }, "outputs": [], "source": [ "# Solution\n", "kill -9 " ] } ], "metadata": { "kernelspec": { "display_name": "Bash", "language": "bash", "name": "bash" }, "language_info": { "name": "bash" } }, "nbformat": 4, "nbformat_minor": 5 }