Как кошке файл от awk?

Лучший метод был бы strace для обнаружения. Используя двоичный файл, почему для некоторого неверного представления о производительности, как немой по нескольким причинам! KDE делает его правильно, но это не столь легко как xfce с наутилусом!

4
12.11.2012, 17:35
3 ответа

Проблема состоит в том, что система () передает командную строку оболочке, таким образом, в общем случае, необходимо выйти из всех специальных символов оболочки от имени файла.

awk имеет ОКРУЖАТЬ ассоциативный массив, который отображается на среде, которую он получил, но к сожалению, присваивание ему не влияет на среду команд, выполняемых через system или getline

awk -v q="'" '
   function escape(str) {
     gsub(q, q "\\" q q, str)
     return q str q
   }
   BEGIN {
     file = "a.txt"
     system("cat " escape(file))
   }'

Конечно, если файл является "a.txt", или можно удостовериться, что его путь никогда не будет содержать специальных символов оболочки, можно сойти с рук:

system("cat " file)

Если можно удостовериться, что это не содержит символы одинарной кавычки, Вы могли бы сделать:

system("cat '\''" file "'\''")
4
27.01.2020, 20:47
  • 1
    Гм, что предназначено специальными символами Shell? И что точно делает escape функция делает? –  learner 13.11.2012, 12:32
  • 2
    , особенные для оболочки, части ее синтаксиса как; и,>, пространство, кавычки... Функция Escape, как ее имя предполагает, выходит из тех путем обертывания всего между одинарными кавычками и затем выхода из каждой кавычки там. –  Stéphane Chazelas 13.11.2012, 12:42

getline является Вашим другом:

awk 'BEGIN{file="a.txt";while ((getline<file) > 0) {print}}'
6
27.01.2020, 20:47

Если то, что Вы намереваетесь сделать, должно определить файл, который должен быть обработан в самом awk сценарии, Вы могли изменить массив ARGV и переменную ARGC accorgingly:

awk 'BEGIN{ ARGV[ARGC] = "your_file.txt" ; ARGC++} {print}'
1
27.01.2020, 20:47
  • 1
    Нет, это не то, что я хотел. Файл должен просто быть распечатан не, обработан. символы –  learner 13.11.2012, 12:36
  • 2
    я довольно плохо знаком с местом, я удалю свой ответ или оставлю его в случае, если кто-то прибывает в этот вопрос, готовый сделать то, что я предложил? –  Vincent Nivoliers 13.11.2012, 12:52
  • 3
    я думаю, что полезно иметь этот ответ, даже при том, что это не соответствует потребностям исходного корреспондента. Это может соответствовать чужим потребностям, кто приходит к этому вопросу позже. Обратите внимание, что искажение ARGV/ARGC не будет иметь никакого эффекта, на котором обрабатываются файлы, если Вы делаете это в блоке КОНЦА, как в исходном вопросе. Это должно быть в НАЧАТЬ блоке, как в этом ответе, или в основном цикле обработки. –  dubiousjim 13.11.2012, 14:02

Теги

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