tmp=`mktemp` _trap="rm $(printf "%q" "$tmp"); ${_trap:-}" && trap "$_trap" EXIT
execute command periodically
#!/usr/bin/env bash set -eu step=$(echo '5 * 60' | bc) IFS=: read -r today now <<< $(date +%F:%s) midnight=$(date -d "$today 0" +%s) t=$(( midnight + (now - midnight) / step * step )) while true; do (( t += step )) sleep $(( t - $(date +%s) )) echo $(date '+[%F %T]') $(ip a show tun0 | grep 'inet ' | awk '{print $2}') $(curl -sS ipinfo.io/ip) done
monitor page response time
#!/usr/bin/env bash set -eu DIR=$(dirname -- "$0") name=$1 url=$2 step=300 IFS=: read -r today now <<< $(date +%F:%s) midnight=$(date -d "$today 0" +%s) prev=$(( midnight + (now - midnight) / step * step )) start=$(( prev + step )) rrdtool create "$DIR/$name.rrd" \ --start "$start" \ --step "$step" \ DS:time_namelookup:GAUGE:$(( 2 * step )):U:U \ DS:time_connect:GAUGE:$(( 2 * step )):U:U \ DS:time_appconnect:GAUGE:$(( 2 * step )):U:U \ DS:time_pretransfer:GAUGE:$(( 2 * step )):U:U \ DS:time_starttransfer:GAUGE:$(( 2 * step )):U:U \ DS:time_total:GAUGE:$(( 2 * step )):U:U \ RRA:AVERAGE:0.5:1:$(( 24 * 60 * 60 / step )) sleep $(( start - $(date +%s) )) t=$start date +%s while true; do echo -en '\033[0K\r'; echo -n $(date +%s) IFS=: read -r time_namelookup time_connect time_appconnect time_pretransfer time_starttransfer time_total \ <<< "$(curl -sS "$url" -w \ '%{time_namelookup}:%{time_connect}:%{time_appconnect}:%{time_pretransfer}:%{time_starttransfer}:%{time_total}' \ -o /dev/null)" rrdtool update "$DIR/$name.rrd" "N:$time_namelookup:$time_connect:$time_appconnect:$time_pretransfer:$time_starttransfer:$time_total" (( t += step )) sleep $(( t - $(date +%s) )) done
#!/usr/bin/env bash set -eu DIR=$(dirname -- "$0") name=$1 end=$(rrdtool info "$DIR"/"$name".rrd | grep ^last_update | sed -E 's/[^0-9]+//g') start=$(( end - 24 * 60 * 60 )) rrdtool graph "$DIR/$name.png" \ --start "$start" --end "$end" \ --height 350 \ --no-gridfit \ "DEF:time_namelookup=$DIR/$name.rrd:time_namelookup:AVERAGE" \ "DEF:time_connect=$DIR/$name.rrd:time_connect:AVERAGE" \ "DEF:time_appconnect=$DIR/$name.rrd:time_appconnect:AVERAGE" \ "DEF:time_pretransfer=$DIR/$name.rrd:time_pretransfer:AVERAGE" \ "DEF:time_starttransfer=$DIR/$name.rrd:time_starttransfer:AVERAGE" \ "DEF:time_total=$DIR/$name.rrd:time_total:AVERAGE" \ "CDEF:namelookup=time_namelookup,1000,*" \ "CDEF:connect=time_connect,1000,*" \ "CDEF:appconnect=time_appconnect,1000,*" \ "CDEF:pretransfer=time_pretransfer,1000,*" \ "CDEF:starttransfer=time_starttransfer,1000,*" \ "CDEF:total=time_total,1000,*" \ LINE1:namelookup#00cc00 \ LINE1:connect#0066b3 \ LINE1:appconnect#ff8000 \ LINE1:pretransfer#ffcc00 \ LINE1:starttransfer#330099 \ LINE1:total#990099
#!/usr/bin/env bash set -eu cd "$(dirname -- "$0")" files=($(ls *.html)) for (( i = 0; i < ${#files[@]} - 1; i++ )); do diff -u "${files[$i]}" "${files[$i + 1]}" done
for el in ${arr[@]+"${arr[@]}"}; do ... done
#!/usr/bin/env bash set -eu bold=$(tput bold) # reset=$(tput sgr0) # produces extra symbols in less (^O), TERM=xterm-256color reset=$(echo -e '\033[m') underline=$(tput smul) echo 'line 1 line 2 line 3 line 4 line 5' | awk -v bold="$bold" -v reset="$reset" -v underline="$underline" ' NR == 3 {print underline $0 reset} NR != 3 {print $0} '
#!/usr/bin/env bash set -eu my_pid=$$ subtree_pids() { local pid=$1 level=${2:-0} if [ "$pid" = "$my_pid" ]; then return fi echo "$pid" ps --ppid "$pid" -o pid= | while read -r pid; do subtree_pids "$pid" $((level + 1)) done } server_pid=$(tmux display-message -pF '#{pid}') ps -p "$(subtree_pids "$server_pid" | paste -sd,)" -Ho pid,ppid,comm,args
quote_ere() { local s=$1 delimiter=${2:-} local re='\.|\*|\[|\^|\$|\\|\+|\?|\{|\||\(' # .*[^$\+?{|( if (( ${#delimiter} )); then re=$re'|\'$delimiter fi r=$(printf "%s\n" "$s" | sed -E 's/('"$re"')/\\\1/g') printf "%s" "${r//$'\n'/\\n}" }
last_n=`find -name "$f.prv-*" \ | sed -E 's/.*-//' \ | sort -nk1 \ | tail -n 1`
$ hexdump FILE $ xxd FILE $ seq 0 255 | LANG= awk '{printf("%c",$0)}' | od -t cz $ seq 0 255 | LANG= awk '{printf("%c",$0)}' | cat -A
#!/usr/bin/env bash set -eu echo '1 2 3 4 5\ \ 6 '"'7 8'"' "9 10"' | xargs ./2.sh # ./2.sh: '1' '2' '3' '4' '5 6' '7 8' '9 10' printf '1 2\0003 4\0005\ \ 6\0'"'7 8'"'\0"9 10"' | xargs -0 ./2.sh # ./2.sh: '1 2' '3 4' '5\ \ 6' ''7 8'' '"9 10"' printf '1 2\n3 4\n5\ \ 6\n'"'7 8'"'\n"9 10"' | xargs -d'\n' ./2.sh # ./2.sh: '1 2' '3 4' '5\ \ 6' ''7 8'' '"9 10"' printf '1 2\n3 4\n5\ \ 6\n'"'7 8'"'\n"9 10"' | xargs -I{} ./2.sh {} # ./2.sh: '1 2' # ./2.sh: '3 4' # ./2.sh: '5 6' # ./2.sh: '7 8' # ./2.sh: '9 10' echo | xargs ./2.sh # ./2.sh: echo | xargs -r ./2.sh echo 1 2 3 | xargs -t ./2.sh # ./2.sh 1 2 3 # ./2.sh: '1' '2' '3' echo '1 2 3 4' | xargs -L1 -d'\n' ./2.sh # ./2.sh: '1 2' # ./2.sh: '3 4'
#!/usr/bin/env bash set -eu r=("${@/#/\'}") r=("${r[@]/%/\'}") echo $0: "${r[@]}"
So, either use xargs -r0, or xargs -rd'\n'. To execute one command per argument add -n1, or -L1 (in the latter case only).
$ tac /var/log/apt/history.log; find /var/log/apt -mindepth 1 -name 'history*.gz' \ | sort -t . -rnk3 | xargs -rd '\n' zcat | tac