Shell Commands
Aug 8, 2021
This is a note on some of the commands I have found useful and want to remember.
Setting the default shell
List all available shells, then set the default shell with chsh
cat /etc/shells
# Example output:
# /bin/bash
# /bin/csh
# /bin/dash
# /bin/ksh
# /bin/sh
# /bin/tcsh
# /bin/zsh
chsh -s /bin/zsh
popd and pushd
- can use to create a directory ‘stack’
pushdpushes the new directory to the stack, e.g.,pushd ~/directory/another/andanother/and moves into that directory- then
popdtakes you back to the previous directory in the stack. popd +0prints the stack (current directory first)popd +1takes you to second directory in stack.
Exclamation mark !
A very useful command! I mainly just use the first two points below a lot.
- double exclamation
!!: re-run previous command - exclamation plus number
!500run the ‘500th’ command from history - exclamation plus a few characters
!paruns the recent command matching thatpacman -Syor whatever - any of the above followed by colon ‘p’
!!:pprints the command instead of running it. - exclamation with dollar sign
!$use argument of previous command.- E.g., say you create a file
touch filenamethen, if you runvim !$it will open that file in vim. Useful for very long filenames/arguments. - The
$represents the last argument of previous command. For example:ping google.com -c 4echo !$will print4echo !^will print the first argument instead (google.com)echo !*will print all the arguments (google.com -c 4)
- to get a specific number argument, you first ‘select’ the command, then use colon+number. E.g.:
ping google.com -c 4echo !!:2returns-cif it was the previously run command. Alternatively, use!pi,!389(the history number), etc.- Also, you can use ranges:
echo !!:2-4
- Also, you can ‘find and replace’ text in a command using
^e.g.,- Say you run
ping googl.com -c 4 - You can correct the error in ‘googl’ with
^googl^googlethis automatically re-runs the command.
- Say you run
- E.g., say you create a file
tail
Useful for long log files, etc.
# Show last 8 lines in file:
tail -n 8 path/to/file
# Print a file from a specific line number:
tail -n +8 path/to/file
# Show last `count` lines in a file and refresh every =seconds" seconds:
tail -n count -s seconds -f path/to/file
Find & Replace across multiple files
grep -rl "target_string" . | xargs sed -i 's/target_string/new_string/g'
What is happening:
grep -rl: search recursively, and only print the files that contain “old_string”
xargs: take the output of the grep command and make it the input of the next command (ie, the sed command)
sed -i ‘s/old_string/new_string/g’: search and replace, within each file, old_string by new_string
Alternative: I used this to replace all the footer email links in my blog directory. Seemed to work perfectly. The section included with find makes sure to skip the git directory.
find . \( -type d -name .git -prune \) -o -type f -print0 | \
xargs -0 sed -i 's/target_string/new_string/g'
less - Exclude Lines from View
Once your file is open in less (or journalctl) press the following keys:
&!- “your-exclude-keyword”
Ampersand opens the pattern matching mode, exclamation mark tells less to exclude the
following part, and then you enter your search term.
shuf
Shuffle lines
shuf /path/file
shuf --input-range=1-100
# Random number between 1 and 100
shuf --input-range=1-100 | head -1
sort
sorts alphabetically, use -n flag for numeric sorting.
-rfor reverse order-fignore case-tto designate field separator-uunique sorting - only sort unique lines.-ooutput (to file, for example)-Rrandom sorting, but groups identical keys
For example:
sort /path/file
# Sort using only unique lines
sort -u /path/file
# Sort a file in place (overwrite)
sort -o /path/file /path/file
uniq
Print unique lines.
-uonly return unique lines-donly return duplicated lines-cprovide ‘count’ for how many times lines occur
Processes
Some of my most used commands
kill(process id)pgrep(search term) find process by search termkillall(search term) kill processes by search termpstreesetsid- spawn a detached child process
Disk Usage
df -h: filesystem disk usage (in human readable format)du -h /path/dir/: usage for file/directory