У меня нет osx awk
, чтобы попробовать это, но он работает на моем linux gnu awk:
awk '
{ n = match($0, /[0-9]+ *$/);
if(n){
word = substr($0, 1, n - 1); num = 0 + substr($0, n);
if(!(word in max) || max[word] < num) max[word] = num
}
}
END{ for(word in max)print word max[word] } '
В каждой строке мы ищем начальный индекс в строке шаблона регулярного выражения, который представляет собой число с необязательным завершающим пробелом. Мы разделяем строку с этим индексом на часть слова и часть числа. Числовая строка преобразуется в число путем добавления к нему 0. В ассоциативном массиве, индексируемом по слову, сохраняется наибольшее число.
Мне нравится подсказка из 3 строк, поэтому я делаю так:
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 10:56:52
jackman@jackmanVM:~/tmp
+$ cat ~/.bash_prompt
#... some other stuff...
__bash_prompt() {
local last_status=$1
local cwd=$( sed "s,^$HOME,~," <<<"$PWD" )
local user_host_path="${debian_chroot:+($debian_chroot) }$(id -un)@$(hostname -s):$cwd"
# terminal title
echo -ne "\e]0;$user_host_path\a"
# separator and date
local char="۰"
printf "%s bash %s " "$(jot -s "" -b "$char" $(( $(tput cols) - 18 )) )" "$char$char"
date '+%T'
if ((last_status != 0)); then
local color_bold='\e[0;1m'
local color_reset='\e[0m'
printf "$color_bold[%d]$color_reset " $last_status
fi
# user@host, directory, git branch
printf "%s%s\n" "${user_host_path}$(git_current_branch " (%s)")"
}
# ref: https://stackoverflow.com/questions/1039713/different-bash-prompt-for-different-vi-editing-mode
# a single-line PS1 allows the show-mode-in-prompt inputrc setting to be useful
PROMPT_COMMAND='__bash_prompt $?'
PS1='\$ '
Я получаю этот файл в моем ~/.bashrc
Статус выхода выглядит следующим образом
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 11:05:10
jackman@jackmanVM:~/tmp
+$ sh -c 'exit 42'
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 11:05:14
[42] jackman@jackmanVM:~/tmp
+$ false
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 11:05:16
[1] jackman@jackmanVM:~/tmp
+$ true
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 11:05:17
jackman@jackmanVM:~/tmp
+$
Обратите внимание, что первое, что я делаю в функции, — это сохраняю последний статус выхода, прежде чем выполнять какие-либо другие команды
Я использую КОМАНДУ PROMPT _для вывода всех причудливых вещей и имею только простую PS1, потому что я использую режим vi и мне нравится видеть индикатор режима vi. У меня тоже есть:
۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰ bash ۰۰ 10:57:21
jackman@jackmanVM:~/tmp
+$ cat ~/.inputrc
set editing-mode vi
set show-mode-in-prompt on
$if Bash
# not until bash 4.4, I believe
# escape sequences: https://stackoverflow.com/a/42107711/7552
#set vi-ins-mode-string "+\1\e[5 q\2"
#set vi-cmd-mode-string ":\1\e[1 q\2"
set vi-ins-mode-string +
set vi-cmd-mode-string :
$endif
Я использую fish в качестве оболочки входа в систему и иногда захожу в ksh, поэтому я поставил имя оболочки в разделителе подсказок, чтобы я мог отслеживать, что я печатаю.