awk: Пустая строка с датой

Ошибка, скорее всего, происходит перед этим блоком кода. Например, если я поместил этот блок кода в свой собственный сценарий и echo псевдонимы намечают:

#!/bin/bash

# example.bash
if [ -x /usr/bin/dircolors ]; then

    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    echo "alias ls='ls --color=auto'"
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    echo "alias grep='grep --color=auto'"
    echo "alias fgrep='fgrep --color=auto'"
    echo "alias egrep='egrep --color=auto'"

fi

Я получаю это:

$ ./example.bash 
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'

Который указывает, что это прекрасно.

Завершение блока случая

Этот блок не имеет соответствия esac.

case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)

....
3
27.06.2014, 03:26
2 ответа

I может быть неправильно понял замысел вашего скрипта, но не проще ли было бы построить массив, содержащий счетчики для каждого пользователя? что-то вроде

w | awk '
BEGIN{"date +%H:%M:%S" | getline tim}; 
NR > 2 {num[$1]++}; 
END {for (usr in num) print usr, num[usr], tim}
'

или

w | awk -v tim="$(date +%H:%M:%S)" '
NR > 2 {num[$1]++}; 
END {for (usr in num) print usr, num[usr], tim}
'
1
27.01.2020, 21:19

Ваша проблема в том, что usr является унифицированным, и при первом проходе по циклу usr не равен $1, поэтому вы печатаете линию.

Можно добавить блок BEGIN к коду awk:

BEGIN { usr = blank }

, а затем, внутри внутреннего if, проверить это условие перед печатью:

...
{ if (usr != $1)  {                                                                                     
    if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); }                              
    usr = $1;                                                                               
    num = 1 }    
...
3
27.01.2020, 21:19

Теги

Похожие вопросы