Исключение переменных gawk для команд оболочки

Я пытаюсь запустить небольшой скрипт gawk, который будет запускать некоторые команды оболочки с помощью system() . Я хочу получить список файлов с помощью find и запустить скрипт следующим образом:

 find <arguments> -printf "%f\n" | script.awk 

Проблема в том, что в этих файлах есть специальные символы, такие как пробелы, кавычки и круглые скобки. Например:

 $ ls 'Aujourd'\''hui C'\''est Toi (Orchestral).flac' 

Я пробовал всевозможные цитаты:

 system("<command> \""$0"\"") 

И это:

 system("<command> \'"$0"\'") 

Я получаю всевозможные ошибки, некоторые из этих ошибок относятся к sh -c а некоторые из gawk

Есть ли способ передать запись $0 или любые другие переменные из скрипта gawk в команду оболочки, не сталкиваясь с проблемами всех этих тезисов?

Примечание. Я знаю, что было бы проще просто переименовать файлы временно, но я считаю более сложным избежать этого.

РЕДАКТИРОВАТЬ:

Ни один из предложенных ответов не решил мою проблему, поэтому вот более конкретное описание проблемы: я пытаюсь запустить команду, которая использует 2 awk-переменные. Примеры:

Если я запустил:

 system("metaflac --show-tag=ARTIST \""FILE"\"") 

Я не получаю ошибку, потому что я цитирую FILE и потому что он не содержит двойных кавычек, он идет ОК.

Но если я убегу:

 system("metaflac --set-tag=ARTIST="AWK_VAR_WITH_ARTIST_VALUE" "\"FILE\") 

Даже когда я цитирую его, я получаю сообщение об ошибке metaflac что файл flac не найден. При чтении сообщения об ошибке я вижу, что имя файла было разделено на отдельные слова.

  • Извлечение информации о трассировке с помощью gawk
  • Как изменить только последнюю строку (или любые конкретные номера строк) с помощью команды awk?
  • Есть ли какой-либо другой способ раскола в awk?
  • awk для разделения входного файла на 2 файла (один для дублированных значений и один для уникальных значений)
  • Объединить две операции в одну команду - awk
  • Как исключить строки, которые не содержат строку из вывода скрипта awk?
  • awk, если регулярное выражение не совпало
  • текстовая обработка (чтение и вычисление из двух файлов)
  • 2 Solutions collect form web for “Исключение переменных gawk для команд оболочки”

    Вы можете заменить system("<command> \"$0\"") на способность awk писать в процесс, т. print $0 | "pre;<command> \"$v\"" print $0 | "pre;<command> \"$v\"" , где pre- часть будет читать stdin в переменной оболочки v. В bash это будет read -rv . Вы в конечном итоге с этим, например:

     awk 'BEGIN{ cmd="read -rv; ls -ld \"$v\"" } { print $0 | cmd; close(cmd); }' 

    Если вы хотите обрабатывать ужасные вещи, такие как новые строки в именах файлов, вы можете пойти в print0 в своей находке, и если ваш awk принимает RS='\0' , у вас есть для bash:

     find . -print0 | awk -v RS='\0' ' BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" } { print $0 "\x00" | cmd; close(cmd); }' 

    Для конкретного случая пробелов и одинарных кавычек должно быть достаточно, чтобы обернуть строку в двойные кавычки:

     $ find -name 'Aujour*' -printf "%f\n" | awk '{system("ls -l \""$0"\"")}' -rw-rw-r-- 1 user user 0 May 26 11:27 Aujourd'hui C'est Toi (Orchestral).flac 

    В качестве альтернативы, если ваша оболочка предоставляет спецификатор формата оболочки, вы можете рассмотреть возможность использования этого вместо внутренней -printf :

     $ find -name 'Aujour*' -exec printf '%q\n' {} \; | awk '{system("ls -l "$0)}' -rw-rw-r-- 1 user user 0 May 26 11:27 ./Aujourd'hui C'est Toi (Orchestral).flac 

    Из help printf в bash например:

     %q quote the argument in a way that can be reused as shell input 
    Interesting Posts

    Не удалось подключить накопитель RAID 0

    Нужно ли шифровать файл swap *, если он будет находиться в зашифрованном корневом файле?

    shell: объединение точек с запятой и амперсанда в bash / sh

    Проверка IP-адресов (IPv4 и IPv6)

    Этот пользователь в настоящее время недоступен – но разрешить запуск скрипта этим пользователем

    Измените запрос Korn, чтобы показать более короткий путь для рабочего каталога

    Как именно создать сценарий sed и использовать его для редактирования файла?

    FTP: удаление всего каталога

    Как получить / dev / ttyUSB * для отображения?

    Ubuntu 16.04 su может требовать USB-устройства, но другие пользователи не могут

    SELinux «обучение» (журналы разрешительных режимов)

    yum-builddep создает зависимости от источника

    Как удалить определенную строку символов в имени файла?

    VM «забывают» MAC-адрес шлюза на хосте Ubuntu 14.04, настроенном как шлюз, используя 1 сетевой адаптер с двумя IP-адресами в разных подсетях

    (Ab) использует Apache в качестве прокси

    Linux и Unix - лучшая ОС в мире.