Если Вы всегда хотите к названиям полного списка только ls
, можно вставить это Ваш .zshrc
:
compdef _dirs ls
Можно сделать более необычный материал с “новой” системой завершения (инициализированный compinit
) путем проигрывания со стилями. В зависимости от Ваших опций Вы, возможно, должны unalias ls
. Затем только к когда-либо полным спискам на ls
командная строка:
zstyle ':completion:*:ls:*' file-patterns '*(/):directories'
Можно завершить только каталоги по умолчанию, но завершить любое имя файла, если никакой каталог не соответствует:
zstyle ':completion:*:ls:*' file-patterns '%p:globbed-files' '*(/):directories'
Можно также определить привязку клавиш для завершения только каталогов, которые можно затем использовать где угодно.
zle -C complete_dirs .complete-word _dirs
bindkey '^X/' complete_dirs
Можно назвать удар от awk и использовать его вывод. Это очевидно опасно с точки зрения производительности, если это происходит слишком часто. Заключение в кавычки страницы справочника:
command | getline [var]
Команда выполнения, передающая вывод по каналу или в 0$ или в var,
команда была бы сценарием удара, который содержит функциональное определение и выполняет функцию.
Попытайтесь делать это:
awk '{print $1 ; printf "%x\n", $2}' file
AFAIK, Вы не можете использовать функцию удара в awk, но только сценарии. Можно использовать функцию awk в случае необходимости.
Попробуйте использовать функцию system()
:
awk '{printf("%s ",$1); system("d2h " $2)}' file
В вашем случае система
вызовет d2h 247808
и затем добавит вывод этой команды к выводу printf
:
Mike 3C800
EDIT:
Так как система
использует sh
вместо bash
я не могу найти способа доступа к . bashrc
. Но вы все еще можете использовать функции из вашего текущего скрипта bash:
#!/bin/bash
d2h() {
# do some cool conversion here
echo "$1" # or just output the first parameter
}
export -f d2h
awk '{printf("%s ",$1); system("bash -c '\''d2h "$2"'\''")}' file
EDIT 2:
Я не знаю почему, но это не работает на моем Ubuntu 16.04. Это странно, потому что он работал на Ubuntu 14.04.
Заявление об ограничении ответственности: Я понимаю, что OP не пытается этого сделать, но Google приведет других, подобных мне, к этому ответу.
У вас есть сценарий bash
, который организован с помощью функций (потому что вы не ненавидите себя и [большинство] коллег), и по крайней мере одна из этих функций должна вызывать другую изнутри awk
.
Сценарий
#!/bin/env bash
# The main function - it's a sound pattern even in BASH
main(){
# In the awk command I do some tricky things with single quotes. Count carefully...
# The first $0 is outside the single quotes so it is the name of the current bash script.
# The second $0 is inside the single quotes so it is awk's current line of input.
awk '{printf("%s. ", ++c); system("'$0' --do"); print $0}'<<-PRETEND_THIS_IS_AN_INPUT_STREAM
and
and
well
PRETEND_THIS_IS_AN_INPUT_STREAM
}
# functionized to keep things DRY
doit(){
echo -n "doin' it "
}
# check for a command switch and call different functionality if it is found
if [[ $# -eq 1 && $1 == "--do" ]];
then
doit
else
main
fi
Выход
$ ./example.sh
1. doin' it and
2. doin' it and
3. doin' it well
Это даст вам хорошие шансы.
cat../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system("date"); print $1}'
системная функция позволяет анализировать команду bash в потоке awk.
Этот ответ предназначен для GNU awk, но другие версии могут реализовать тот же трюк. Идея состоит в том, что пока правая -сторона канала точно такая же и не выходит, awk не закрывает канал. Но если он другой, он откроет новую трубу. Например, если вы наберете:
awk 'BEGIN{ shell= "/bin/bash" } { print $0 | "/bin/bash" } END { print "echo $a" | " /bin/bash" }'
вы можете ввести:
a=5
echo $a
и получить ожидаемое (? )ответ 5 :новая оболочка не создавалась. Но в разделе END я набрал лишний пробел, поэтому правая сторона канала отличается, и новая оболочка создается без значения для переменной a (, поэтому при выходе будет напечатана пустая строка. Я не могу найти его в документации, но рекомендуемый способ использования долгосрочных каналов таков: я :поместил команду в раздел BEGIN в переменной и повторно использовал эту переменную.
Предоставление определенной пользователем -функции сеансу bash, а затем ее повторное использование — это упражнение, оставленное читателю:)