Conawk
:
awk '!first[$3, $4]{ first[$3, $4]= $0 } { last[$3, $4]= $0 }
END{ for (x in last) print first[x] (last[x] != first[x]? ORS last[x]:"") }' infile
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
la matriz asociada first
mantiene la primera línea ocurrida con la combinación de teclas de columna #3 y columna #4, pero la matriz last
mantiene la última línea con esas mismas claves cada vez.
Después de leer todas las líneas, los valores en la matriz first
son las líneas que ocurrieron al principio (con una columna diferente #3, #4 )y los valores en last
son las líneas que ocurrieron al final.
Luego, en END
, imprima los valores guardados en la matriz first
y luego en last
. Este (last[x] != first[x]? ORS last[x]:"")
se usa para evitar la duplicación de la línea cuando esa es la única línea única sin una combinación repetida de columnas 3 y 4.
SHELL — это переменная среды, которая передается из bash в zsh при вызове zsh. SHELL не является одним из параметров , устанавливаемых оболочкой в zsh, поэтому его значение остается неизменным.
bash$ SHELL=turtle zsh
zsh$ echo $SHELL
turtle
Чтобы узнать, что вы находитесь в оболочке zsh, попробуйте:
echo $ZSH_NAME
echo $0
Переменная SHELL
традиционно устанавливается программой login
«как указано в базе данных паролей». (Скопировано из Что устанавливает переменную окружения $SHELL?)
Многие оболочки устанавливают переменную версии при запуске.
bash
используйте BASH _ВЕРСИЯ и zsh
используйте ZSH _ВЕРСИЯ.
Присвоение обеим переменным известного значения надежно определит, какая оболочка была запущена:
BASH_VERSION=notbash ZSH_VERSION=notzsh sh -c 'echo "$BASH_VERSION $ZSH_VERSION"'
напечатает notbash 5.3.1
, если sh — это zsh, или 5.0.2(2)-release notzsh
, если sh — это bash.
К сожалению, ksh segfaults при использовании KSH _VERSION со строковым значением.