mirror of
https://github.com/denisidoro/navi
synced 2024-11-21 19:13:07 +00:00
First commit
This commit is contained in:
commit
3fd0e3f5cb
16 changed files with 351 additions and 0 deletions
4
sheets/awk.cheat
Normal file
4
sheets/awk.cheat
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
% awk, text processing, string
|
||||||
|
|
||||||
|
# Print nth column
|
||||||
|
awk '{print $<n>}
|
7
sheets/crontab.cheat
Normal file
7
sheets/crontab.cheat
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
% crontab, scheduling
|
||||||
|
|
||||||
|
# List cron jobs
|
||||||
|
crontab -l
|
||||||
|
|
||||||
|
# Edit cron job
|
||||||
|
crontab -e
|
40
sheets/docker.cheat
Normal file
40
sheets/docker.cheat
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
% docker, container
|
||||||
|
|
||||||
|
# Remove an image
|
||||||
|
docker image rm <image_id>
|
||||||
|
|
||||||
|
# Delete an image from the local image store
|
||||||
|
docker rmi <image_id>
|
||||||
|
|
||||||
|
# List all images that are locally stored with the Docker engine
|
||||||
|
docker images
|
||||||
|
|
||||||
|
# Build an image from the Dockerfile in the current directory and tag the image
|
||||||
|
docker build -t <image>:<version> .
|
||||||
|
|
||||||
|
# Pull an image from a registry
|
||||||
|
docker pull <image>:<version>
|
||||||
|
|
||||||
|
# Stop a running container through SIGTERM
|
||||||
|
docker stop <container_id>
|
||||||
|
|
||||||
|
# Stop a running container through SIGKILL
|
||||||
|
docker kill <container_id>
|
||||||
|
|
||||||
|
# List the networks
|
||||||
|
docker network ls
|
||||||
|
|
||||||
|
# List the running containers
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Delete all running and stopped containers
|
||||||
|
docker rm -f $(docker ps -aq)
|
||||||
|
|
||||||
|
# Create a new bash process inside the container and connect it to the terminal
|
||||||
|
docker exec -it <container_id> bash
|
||||||
|
|
||||||
|
# Print the last lines of a container’s logs
|
||||||
|
docker logs --tail 100 <container_id> | less
|
||||||
|
|
||||||
|
$ image_id: docker images --- --headers 1 --column 3
|
||||||
|
$ container_id: docker ps --- --headers 1 --column 1
|
13
sheets/git.cheat
Normal file
13
sheets/git.cheat
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
% git
|
||||||
|
|
||||||
|
# Clear everything
|
||||||
|
git clean -dxf
|
||||||
|
|
||||||
|
# Sign all commits in a branch based on master
|
||||||
|
git rebase master -S -f
|
||||||
|
|
||||||
|
# Checkout to branch
|
||||||
|
# Change branch
|
||||||
|
git checkout <branch>
|
||||||
|
|
||||||
|
$ branch: git branch --format='%(refname:short)'
|
7
sheets/kubernetes.cheat
Normal file
7
sheets/kubernetes.cheat
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
% kubernetes, k8s
|
||||||
|
|
||||||
|
# Edit deployment
|
||||||
|
kubectl edit deployment <deployment>
|
||||||
|
|
||||||
|
# Get pods
|
||||||
|
kubectl get pods
|
10
sheets/mysql.cheat
Normal file
10
sheets/mysql.cheat
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
% mysql, database, db
|
||||||
|
|
||||||
|
# Create database
|
||||||
|
mysql -u <user> -p -e "create database $database character set UTF8mb4 collate utf8mb4_bin"
|
||||||
|
|
||||||
|
# Export databse
|
||||||
|
mysqldump -u <user> -p <database> > <path>
|
||||||
|
|
||||||
|
# Import database
|
||||||
|
mysql -u <user> -p <database> <path>
|
13
sheets/network.cheat
Normal file
13
sheets/network.cheat
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
% network
|
||||||
|
|
||||||
|
# Kill a process running on a given port
|
||||||
|
lsof -i :<port> | awk '{l=$2} END {print l}' | xargs kill
|
||||||
|
|
||||||
|
# List IP addresses connected on a given port
|
||||||
|
netstat -tn 2>/dev/null | grep :<port> | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
|
||||||
|
|
||||||
|
# Find external, public IP address
|
||||||
|
dig +short myip.opendns.com @resolver1.opendns.com
|
||||||
|
|
||||||
|
# Find primary, local IP address
|
||||||
|
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
|
24
sheets/tar.cheat
Normal file
24
sheets/tar.cheat
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
% tar, zip, gzip, compression
|
||||||
|
|
||||||
|
# Create a tar containing files
|
||||||
|
tar cf <name>.tar <files>
|
||||||
|
|
||||||
|
# Extract the files from a tar
|
||||||
|
tar xf <tar_file>
|
||||||
|
|
||||||
|
# Create a tar with Gzip compression
|
||||||
|
tar czf <name>.tar.gz <files>
|
||||||
|
|
||||||
|
# Extract a tar using Gzip
|
||||||
|
tar xzf <targz_file>
|
||||||
|
|
||||||
|
# Compress file and appends .gz to its name
|
||||||
|
gzip <path>
|
||||||
|
|
||||||
|
# Decompress compressed file
|
||||||
|
gzip -d <gz_file>
|
||||||
|
|
||||||
|
$ path: ls
|
||||||
|
$ tar_file: ls *.tar
|
||||||
|
$ targz_file: ls *.tar.gz
|
||||||
|
$ gz_file: ls *.gz
|
54
src/arg.sh
Normal file
54
src/arg.sh
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
arg::fn() {
|
||||||
|
awk -F'---' '{print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
arg::opts() {
|
||||||
|
awk -F'---' '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
|
arg::interpolate() {
|
||||||
|
local readonly arg="$1"
|
||||||
|
local readonly value="$2"
|
||||||
|
|
||||||
|
sed "s|<${arg}>|\"${value}\"|g"
|
||||||
|
}
|
||||||
|
|
||||||
|
arg::next() {
|
||||||
|
grep -Eo '<[0-9a-zA-Z\-_]+>' \
|
||||||
|
| head -n1 \
|
||||||
|
| tr -d '<' \
|
||||||
|
| tr -d '>'
|
||||||
|
}
|
||||||
|
|
||||||
|
arg::pick() {
|
||||||
|
local readonly arg="$1"
|
||||||
|
local readonly cheat="$2"
|
||||||
|
|
||||||
|
local readonly prefix="$ ${arg}:"
|
||||||
|
local readonly length="$(echo "$prefix" | str::length)"
|
||||||
|
local readonly arg_description="$(grep "$prefix" "$cheat" | str::sub $((length + 1)))"
|
||||||
|
|
||||||
|
local readonly fn="$(echo "$arg_description" | arg::fn)"
|
||||||
|
local readonly args_str="$(echo "$arg_description" | arg::opts | tr ' ' '\n' || echo "")"
|
||||||
|
local arg_name=""
|
||||||
|
|
||||||
|
for arg_str in $args_str; do
|
||||||
|
if [ -z $arg_name ]; then
|
||||||
|
arg_name="$(echo "$arg_str" | str::sub 2)"
|
||||||
|
else
|
||||||
|
eval "local $arg_name"='$arg_str'
|
||||||
|
arg_name=""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$fn" ]; then
|
||||||
|
eval "$fn" | ui::pick --prompt "$arg: " --header-lines "${headers:-0}" | str::column "${column:-}"
|
||||||
|
else
|
||||||
|
printf "\033[0;36m${arg}:\033[0;0m " > /dev/tty
|
||||||
|
read value
|
||||||
|
ui::clear_previous_line > /dev/tty
|
||||||
|
printf "$value"
|
||||||
|
fi
|
||||||
|
}
|
33
src/cheat.sh
Normal file
33
src/cheat.sh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
cheat::find() {
|
||||||
|
find "${cheat_folder:-"${DIR}/../sheets"}" -iname '*.cheat'
|
||||||
|
}
|
||||||
|
|
||||||
|
cheat::read_many() {
|
||||||
|
for cheat in $(cat); do
|
||||||
|
awk '
|
||||||
|
function color(c,s) {
|
||||||
|
printf("\033[%dm%s\033[0m",30+c,s)
|
||||||
|
}
|
||||||
|
|
||||||
|
/^%/ { tags=substr($0, 3); next }
|
||||||
|
/^#/ { print color(3, tags"^") color(4, $0); next }
|
||||||
|
/^\$/ { next }
|
||||||
|
NF { print color(3, tags"^") color(7, $0); next }' "$cheat"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
cheat::from_selection() {
|
||||||
|
local readonly cheats="$1"
|
||||||
|
local readonly selection="$2"
|
||||||
|
|
||||||
|
local readonly tags="$(echo "$selection" | selection::tags)"
|
||||||
|
|
||||||
|
for cheat in $cheats; do
|
||||||
|
if grep -q "% $tags" "$cheat"; then
|
||||||
|
echo "$cheat"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
61
src/cheats
Executable file
61
src/cheats
Executable file
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
export DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||||
|
|
||||||
|
source "${DIR}/arg.sh"
|
||||||
|
source "${DIR}/cheat.sh"
|
||||||
|
source "${DIR}/docs.sh"
|
||||||
|
source "${DIR}/misc.sh"
|
||||||
|
source "${DIR}/selection.sh"
|
||||||
|
source "${DIR}/str.sh"
|
||||||
|
source "${DIR}/ui.sh"
|
||||||
|
|
||||||
|
##? Command cheatsheet tool
|
||||||
|
##?
|
||||||
|
##? Usage:
|
||||||
|
##? cheats [options]
|
||||||
|
##?
|
||||||
|
##? Options:
|
||||||
|
##? --print Prevent script execution [default: false]
|
||||||
|
##? --no-interpolation Prevent argument interpolation [default: false]
|
||||||
|
##? -c --cheat-folder <cheat-folder> Folder with cheatsheets
|
||||||
|
|
||||||
|
docs::eval "$@"
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local readonly cheats="$(cheat::find)"
|
||||||
|
local readonly selection="$(ui::select "$cheats")"
|
||||||
|
local readonly cheat="$(cheat::from_selection "$cheats" "$selection")"
|
||||||
|
local cmd="$(selection::command "$selection" "$cheat")"
|
||||||
|
local arg value
|
||||||
|
|
||||||
|
if $no_interpolation; then
|
||||||
|
echo "$cmd"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
arg="$(echo "$cmd" | arg::next || echo "")"
|
||||||
|
if [ -z "$arg" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
value="$(arg::pick "$arg" "$cheat" || echo "")"
|
||||||
|
if [ -z "$value" ]; then
|
||||||
|
echo "$cmd"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval "local $arg"='$value'
|
||||||
|
cmd="$(echo "$cmd" | arg::interpolate "$arg" "$value")"
|
||||||
|
done
|
||||||
|
|
||||||
|
if $print; then
|
||||||
|
echo "$cmd"
|
||||||
|
else
|
||||||
|
eval "$cmd"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
8
src/docs.sh
Normal file
8
src/docs.sh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
docs::eval() {
|
||||||
|
print=false
|
||||||
|
no_interpolation=false
|
||||||
|
cheat_folder=""
|
||||||
|
}
|
6
src/misc.sh
Normal file
6
src/misc.sh
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# no-op hack to set dependency order resolution
|
||||||
|
dep() {
|
||||||
|
:
|
||||||
|
}
|
27
src/selection.sh
Normal file
27
src/selection.sh
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
selection::core() {
|
||||||
|
cut -d'^' -f2
|
||||||
|
}
|
||||||
|
|
||||||
|
selection::tags() {
|
||||||
|
cut -d'^' -f1
|
||||||
|
}
|
||||||
|
|
||||||
|
selection::core_is_comment() {
|
||||||
|
grep -qE '^#'
|
||||||
|
}
|
||||||
|
|
||||||
|
selection::command() {
|
||||||
|
local readonly selection="$1"
|
||||||
|
local readonly cheat="$2"
|
||||||
|
|
||||||
|
local readonly core="$(echo $selection | selection::core)"
|
||||||
|
|
||||||
|
if echo "$core" | selection::core_is_comment; then
|
||||||
|
grep "$core" "$cheat" -A999 \
|
||||||
|
| str::last_paragraph_line
|
||||||
|
else
|
||||||
|
echo "$core"
|
||||||
|
fi
|
||||||
|
}
|
27
src/str.sh
Normal file
27
src/str.sh
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
str::length() {
|
||||||
|
awk '{print length}'
|
||||||
|
}
|
||||||
|
|
||||||
|
str::sub() {
|
||||||
|
local readonly start="${1:-0}"
|
||||||
|
local readonly finish="${2:-99999}"
|
||||||
|
|
||||||
|
cut -c "$((start + 1))-$((finish - 1))"
|
||||||
|
}
|
||||||
|
|
||||||
|
str::column() {
|
||||||
|
local readonly n="${1:-}"
|
||||||
|
|
||||||
|
if [ -n "$n" ]; then
|
||||||
|
awk "{print \$$n}"
|
||||||
|
else
|
||||||
|
cat
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
str::last_paragraph_line() {
|
||||||
|
awk '(!NF) { exit } { print $0 }' \
|
||||||
|
| tail -n1
|
||||||
|
}
|
17
src/ui.sh
Normal file
17
src/ui.sh
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
ui::pick() {
|
||||||
|
fzf --inline-info "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
ui::select() {
|
||||||
|
local readonly cheats="$1"
|
||||||
|
|
||||||
|
echo "$cheats" \
|
||||||
|
| cheat::read_many \
|
||||||
|
| ui::pick -i --ansi --delimiter '\^' --with-nth 2
|
||||||
|
}
|
||||||
|
|
||||||
|
ui::clear_previous_line() {
|
||||||
|
tput cuu1 && tput el || true
|
||||||
|
}
|
Loading…
Reference in a new issue