Используя удар окружают функцию в AWK

Если Вы всегда хотите к названиям полного списка только 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

24
15.01.2018, 17:03
6 ответов

Можно назвать удар от awk и использовать его вывод. Это очевидно опасно с точки зрения производительности, если это происходит слишком часто. Заключение в кавычки страницы справочника:

command | getline [var]

Команда выполнения, передающая вывод по каналу или в 0$ или в var,

команда была бы сценарием удара, который содержит функциональное определение и выполняет функцию.

8
27.01.2020, 19:40
  • 1
    Hauke, Отстающий, очень прохладный! –  JJoao 15.01.2018, 16:28

Попытайтесь делать это:

awk '{print $1 ; printf "%x\n", $2}' file

AFAIK, Вы не можете использовать функцию удара в awk, но только сценарии. Можно использовать функцию awk в случае необходимости.

4
27.01.2020, 19:40

Попробуйте использовать функцию 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.

28
27.01.2020, 19:40

Использование определяемой пользователем функции bash внутри awk

Заявление об ограничении ответственности: Я понимаю, что 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
3
27.01.2020, 19:40

Это даст вам хорошие шансы.

cat../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system("date"); print $1}'

системная функция позволяет анализировать команду bash в потоке awk.

1
27.01.2020, 19:40

Этот ответ предназначен для 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, а затем ее повторное использование — это упражнение, оставленное читателю:)

1
18.01.2021, 09:44

Теги

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