Linux Shell
Unscored tasks with hints and instant feedback. Practice results never become credentials.
Short lesson
Combine small tools: grep filters lines, awk/cut pick fields, sort | uniq -c counts, xargs turns lines into arguments. Read logs with journalctl -u UNIT.
Find which port the billing service is configured to use. The config lives somewhere under ~/services. Enter the port number as your answer.
Sign up to practiseCreate ~/work/clients/acme/{contracts,invoices,notes} (three folders) and copy ~/templates/invoice.md into the invoices folder.
Sign up to practiseFrom ~/logs/app.log, write the number of ERROR lines per day into ~/errors-by-day.txt as lines like “2026-10-17 2”, sorted by date.
Sign up to practiseEvery *.sh file under ~/bin (including subfolders) must be executable by you. Do not change other files.
Sign up to practiseAdd an environment variable API_URL=https://api.acme.example to ~/.zshrc so new shells get it, and export it in the current shell too.
Sign up to practiseCreate an alias gs for “git status” that works now and in future shells (~/.zshrc).
Sign up to practiseUsing ~/data/sales.csv, write total amount per region to ~/report.txt as “REGION TOTAL” lines, highest total first.
Sign up to practise~/users.json lists accounts. Write the emails of active users on the pro plan, one per line, into ~/active-pro.txt.
Sign up to practise~/cleanup.txt lists files (one per line, relative to ~/media) that must be deleted. Delete exactly those files.
Sign up to practiseCreate an executable script ~/bin/logcount.sh that prints, for every *.log file in the directory given as its first argument, a line “NAME COUNT” where COUNT is the number of lines containing ERROR.
Sign up to practiseSchedule ~/bin/backup.sh to run every day at 02:30 for your user.
Sign up to practiseStart a detached tmux session named work with two side-by-side panes titled editor and server. In the server pane, run: ls ~/app
Sign up to practiseRe-run the long deploy command from your history (it is already there) without retyping it, then save its output to ~/deploy.out. Use Ctrl-R or history expansion.
Sign up to practiseSomething is already listening on port 8080, so the new API cannot start. Find the process, stop it, and enter its name as your answer.
Sign up to practiseFrom ~/auth.log write every distinct IPv4 address with a failed password attempt to ~/blocklist.txt, one per line, sorted.
Sign up to practiseFrom ~/access.log write the top 3 client IPs by number of 5xx responses to ~/top-5xx.txt as “COUNT IP” lines, highest first (ties: lower IP first).
Sign up to practiseWrite ~/bin/safe-archive.sh: it takes a directory argument, exits with status 2 and prints a usage message to stderr if the argument is missing or not a directory, and otherwise creates DIR.tar.gz next to the directory. Use set -euo pipefail.
Sign up to practise