Объединение нескольких функций awk

Согласно ArchLinux wiki , вы можете получить список совместимых терминальных шрифтов (для TTY )с помощью команды:

ls -l /usr/share/kbd/consolefonts/ | grep -i ".psfu.gz"

Чтобы вывести список всех доступных шрифтов, выполните:

fc-list

И поиск шрифта с помощью:

fc-list | grep -i "font name"

Надеюсь, это поможет.

0
29.04.2021, 16:55
3 ответа

Ваш код с новыми строками для удобства чтения

env | awk '
    match($0, /PREFIX_.*/) {
        substr($0, RSTART+8, RLENGTH) 
        split($0, parts, "=") 
        printf "--set service.%s=%s ", parts[1], parts[2]
    }
'

substrработает нормально. Вы ничего не делаете с возвращаемым значением. substr сама по себе не изменяет $0.

Во-первых, я бы рекомендовал сделать регулярное выражение более конкретным, чтобы оно находило PREFIX_VAR=something, а неsome_other_var=$PREFIX_VAR

Затем, поскольку вы знаете, что такое PREFIX, я бы посоветовал вам не использовать RSTART и т. д.

Наконец, используйте =в качестве разделителя полей, чтобы упростить работу с именем переменной.

env | awk -F= '$1 ~ /^PREFIX_/ {printf "--set service.%s=%s ", substr($1,8), $2}'

Этот код, как и ваш, не будет правильно обрабатывать значение переменной, содержащее знак равенства. Соединение полей 2..NF в awk немного затруднительно:

env | awk '
    function join (fstart, fend, separator,      i, result) {
        for (i = fstart; i <= fend; i++) 
            result = result $i (i == fend ? "" : separator)
        return result
    }
    $1 ~ /^PREFIX_/ {
        var = substr($1, 8)
        value = join(2, NF, "=")
        printf "--set service.%s=%s ", var value
    }
'
4
28.07.2021, 11:36

Использование cat fileвместо вашей команды env:

$ cat file | awk 'sub(/^PREFIX_/,"--set service."){out=out sep $0; sep=OFS} END{print out}'

--set service.VARIABLE_1=100 --set service.VARIABLE_2=500
2
28.07.2021, 11:36

Также можно сделать это без использования awk. Просто демонстрирую другой способ

 while read -r env
   do 
     [[ $env == *PREFIX_* ]] && envs+=("--set service.${env#*_}")
   done < <(env)       
 printf '%s ' "${envs[@]}"

Итак, здесь вы читаете каждую строку, содержащую PREFIX_, и добавляете ее к переменной массива, используя +=. ${env#*_}гарантирует, что т.е.:

PREFIX_VARIABLE_1=100

становится

VARIABLE_1=100

Подробнее см. Манипуляции со строками .

0
28.07.2021, 11:36

Теги

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