Quantcast
Channel: Is there a paging version of `watch`? - Server Fault
Viewing all articles
Browse latest Browse all 14

Answer by Khalid M. Kahloot for Is there a paging version of `watch`?

$
0
0

I edited the script here to work with command line

#!/bin/bash## watch a file and scroll## keys => arrow-up/down, page-up/down, pos1, end## usages:#           swatch -n <timeout_watch> <file>#           swatch <file>## version:          1.1# dependencies:     awk , tput , clear, read# published:        https://unix.stackexchange.com/questions/3842/how-can-i-scroll-within-the-output-of-my-watch-command# gif recording:    peek , https://github.com/phw/peek## =============================================# KEYCODES# =============================================# https://unix.stackexchange.com/questions/294908/read-special-keys-in-bash# showkey -a# =============================================# DEFAULTS# =============================================command=""TMPFILE=$(mktemp)line_show_begin=1line_show_begin_last=-1console_lines_correction=4timeout_watch=5timeout_read=.1# =============================================# DEFINE Escape-Sequences# =============================================# http://ascii-table.com/ansi-escape-sequences-vt-100.phpESC_clr_line='\033[K'ESC_reset_screen='\033c'ESC_clr_screen='\033[2J'ESC_cursor_pos='\033[0;0f'ESC_cursor_home='\033[H'# =============================================# FUNCTIONS# =============================================function fn_help() {cat << EOFUsage: ./$0 [-n <timeout>] [<command>]  ,  timeout >0.1s , default 5sEOF}function get_options() {    [[ "$1" == "" ]] && { fn_help ; exit 1 ; }    while [ -n "$1" ]; do        case "$1" in            -h|--help)                fn_help            ;;            -n)                [[ "$2" == "" ]] && { echo "Error: option -n required <timeout>" ; exit 1 ; }                if [[ "$(echo "$2<0.1"|bc)" == "0" ]] ; then                    timeout_watch="$2"                    shift                else                    echo "Error: timeout <0.1 not allowed"                    exit 1                fi            ;;            -*)                echo "Error: unknown option »$1«"                exit 1            ;;            *)                #if [[ -f "$1" ]] ; then                command=$1                #else                #    echo "Error: file not found »$1«"                #    exit 1                #fi            ;;        esac        shift    done    [[ "$command" == "" ]] && { echo "Error: command required" ; exit 1 ; }}function fn_print_headline() {    hdl_txt_right="${HOSTNAME}: $(date "+%Y-%m-%d %H:%M:%S")"    hdl_txt_left="$command , ${timeout_watch}s , $line_show_begin"    hdl_txt_left_length=${#hdl_txt_left}    printf '%s%*s\n\n'"$hdl_txt_left" "$(($console_columns-$hdl_txt_left_length))" "$hdl_txt_right"}function fn_print_file() {    # ---------------------------------------------------    # file lenght can change while watch    # ---------------------------------------------------    eval $command > $TMPFILE    lines_command=$(awk 'END {print NR}' $TMPFILE)    line_last=$(($lines_command-$console_lines))    (( "$line_last" < "1" )) && { line_last=1; clear; }    (( "$line_show_begin" > "$line_last" )) && { line_show_begin=$line_last; clear; }    # ---------------------------------------------------    # print postion changed    # ---------------------------------------------------    if (( "$line_show_begin" != "$line_show_begin_last" )) ; then        line_show_begin_last=$line_show_begin;        clear    else        printf $ESC_cursor_home    fi    # ---------------------------------------------------    # print file section    # ---------------------------------------------------    fn_print_headline    eval $command > $TMPFILE    awk -v var1="$line_show_begin" -v var2="$console_lines" 'NR>=var1 {if (NR>var1+var2) {exit 0} else {printf "%s\n",$0 } }' $TMPFILE}function fn_console_size_change() {    console_columns=$(tput cols)    console_lines=$(($(tput lines)-$console_lines_correction))    line_show_begin_last=-1}function fn_quit() {    echo "quit" $0 , $?    setterm -cursor on ; exit 0}# =============================================# GET OPTIONS# =============================================get_options "$@"    # pass all arguments with double-quotes# =============================================# INIT TRAP# =============================================trap "fn_console_size_change" SIGWINCH # https://en.wikipedia.org/wiki/Signal_(IPC)#SIGWINCHtrap "fn_quit" INT TERM EXIT# =============================================# MAIN# =============================================fn_console_size_changesetterm -cursor offwhile true ; do    fn_print_file    read -rsn1 -t $timeout_watch k # char 1    case "$k" in        [[:graph:]])            # Normal input handling        ;;        $'\x09') # TAB            # Routine for selecting current item        ;;        $'\x7f') # Back-Space            # Routine for back-space        ;;        $'\x01') # Ctrl+A            # Routine for ctrl+a        ;;        $'\x1b') # ESC            read -rsn1 k # char 2            [[ "$k" == ""  ]] && return  Esc-Key            [[ "$k" == "[" ]] && read -rsn1 -t $timeout_read k # char 3            [[ "$k" == "O" ]] && read -rsn1 -t $timeout_read k # char 3            case "$k" in                A)  # Arrow-Up-Key                    (( "$line_show_begin" > "1" )) && line_show_begin=$(($line_show_begin-1))                ;;                B)  # Arrow-Down-Key                    (( "$line_show_begin" < "$line_last" )) && line_show_begin=$(($line_show_begin+1))                ;;                H)  # Pos1-Key                    line_show_begin=1                ;;                F)  # End-Key                    line_show_begin=$line_last                ;;                5)  # PgUp-Key                    read -rsn1 -t $timeout_read k # char 4                    if [[ "$k" == "~" ]] && (( "$line_show_begin" > "$(($console_lines/2))" )) ; then                        line_show_begin=$(($line_show_begin-$console_lines/2))                    else                        line_show_begin=1                    fi                ;;                6)  # PgDown-Key                    read -rsn1 -t $timeout_read k # char 4                    if [[ "$k" == "~" ]] && (( "$line_show_begin" < "$(($line_last-$console_lines/2))" )) ; then                        line_show_begin=$(($line_show_begin+$console_lines/2))                    else                        line_show_begin=$line_last                    fi                ;;            esac            read -rsn4 -t $timeout_read    # Try to flush out other sequences ...        ;;    esacdone
  • create a file in ~/bin/cwatch.sh
nano ~/bin/cwatch.sh
  • change files properties to make it runnable:
chmod +x ~/bin/cwatch.sh
  • edit ~/.bashrc and add alias
alias cwatch="~/bin/cwatch.sh"

now you can try it:

cwatch 'ps aux | grep -v grep'

Viewing all articles
Browse latest Browse all 14

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>