2015-03-24 2 views

ответ

2

Вы должны трубы выхода к gzip, затем редирект затем выводится в файл:

awk '...' $FILES | gzip > "$RESULTING_OUTPUT" 

Обратите внимание, что заглавные буквы для имен переменных не рекомендуется, так как они могут противоречить друг другу с внутренними переменными оболочки. Кроме того, $FILES выглядит подозрительно, так как может содержать список из нескольких имен файлов. Вы действительно должны использовать массив, который можно передать как "${files[@]}"

2

Вы можете ЯВНО трубы вашего выхода в GZIP вне AWK (как предположил Том), или вы можете отправить вывод через трубу из внутри AWK. Например:

awk ' 
    { 
    print | "gzip > /path/to/output.gz"; 
    } 
' inputfile 

Это имеет огромное преимущество в определенных ситуациях. Например, если вы хотите разделить очень длинный файл журнала на часовые куски, вы можете построить свою команду вывода в качестве переменной, а затем передать ее переменной.

awk ' 

    # given: 
    # Mar 20 13:29:12 servername some message 

    BEGIN { 
    m["jan"]="01"; m["feb"]="02"; m["mar"]="03"; m["apr"]="04"; 
    m["may"]="05"; m["jun"]="06"; m["jul"]="07"; m["aug"]="08"; 
    m["sep"]="09"; m["oct"]="10"; m["nov"]="11"; m["dec"]="12"; 
    } 

    { 
    output=sprintf("gzip -9 > /var/log/split/%s-%s-%s.log.gz", m[tolower($1)], $2, substr($3,1,2)); 
    print | output 
    }' input.log 

С помощью этого использования, ваш вывод команды GZIP линия повторно оценивается для каждой строки ввода, и AWK не закрывает трубу, если это не сказал вручную, или AWK исчерпывает входа и выходов ,

Мой собственный прецедент для этого заключался в том, что мы собирали журналы веб-сервера из CDN, которые не были в хронологическом порядке. Журналы были слишком большими для sort, но их можно было обрабатывать, когда они разделены на часовые куски.

YMMV. Лучшее решение зависит от того, чего вы на самом деле пытаетесь достичь, чего вы нам не сказали.

0

Это работало

awk -v someVariable="$VAR1" ' 
      BEGIN { 
      . . . 
      } 

      { 
       SOME CODES HERE 
      } 
      END {} 
     ' $FILES> $RESULTING_OUTPUT 
    gzip $RESULTING_OUTPUT