Можете ли вы использовать heredocuments для встраивания AWK в скрипт bash? - PullRequest
10 голосов
/ 27 июня 2011

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

Или это лучший способ разработкиawk в отдельном файле и использовать awk -f в скрипте bash, пока скрипт не будет готов?Я бы хотел все время держать в одном файле!

#!/bin/bash
awkscript='
BEGIN{
    print "test"
}
{print $3}'
df | awk "$awkscript"

Это способ цитаты, и довольно уродливый, если вы спросите меня.Есть ли здесь шанс на наследственность?

Ответы [ 6 ]

23 голосов
/ 25 октября 2011

Да, в Bash это возможно чуть менее уродливо:

#!/bin/bash
df | awk -f <(cat - <<-'EOD'
        BEGIN{
            print "test"
        }
        {print $3}
EOD
)

Блок кода <() заменяется путем (что-то вроде /dev/fd/63), который указывает на дескриптор файла, связанный с выводом кода. Убедитесь, что в скрипте awk используются отступы, а не пробелы (<<- убирает начальные вкладки).

Другой способ сделать это - скрыть скрипт awk в конце скрипта bash, как это (не забудьте exit):

#!/bin/bash
df | awk -f <(sed -e '0,/^#!.*awk/d' $0)
exit $PIPESTATUS

#!/usr/bin/awk -f
BEGIN {
    print "test"
}
{print $3}
6 голосов
/ 27 июня 2011

тоже некрасиво:

read -r -d '' awkscript <<'EOF'
BEGIN{ print "test"}
{print $3}
EOF
df | awk "$awkscript"
4 голосов
/ 21 мая 2016

Если вы не хотите использовать stdin для данных, сделайте это - это переносимо, быстро и не использует никаких ошибок.

awk -f- inputfile.txt <<'EOF'
BEGIN {
  print "hello world"
}
EOF

Указывает awk использовать имя входного файлаиз - заставляет его читать скрипт из стандартного ввода.

Конечно, теперь вы должны хранить свои данные в файле.Если вы действительно не можете этого сделать, используйте именованный канал.

f=/tmp/$$.data
trap "rm -f $f" EXIT
mknod $f p
(df > $f) &
awk -f- $f <<EOF
{ print }
EOF
3 голосов
/ 27 июня 2011

Не уверен, что вы имеете в виду, но вы ищете что-то подобное?

#!/bin/bash

awk 'BEGIN {
    print "hello world"
}
{ 
    print $3
}' <<< "$(df)"

Взгляните на 3.6.7 Здесь строки в руководстве по bash

0 голосов
/ 18 апреля 2018

Один из способов - позволить awk читать правила из stdin с использованием (heredoc или здесь строка), но обрабатывать реальные файлы или файлы, созданные путем подстановки, например,

awk -f- <(df) <<'EOF'
BEGIN{
    print "test"
}
{print $3}
EOF

-f- должно появиться до <(df).Разделитель для heredoc следует заключать в кавычки, чтобы знаки $ передавались в awk, а не расширялись.

0 голосов
/ 04 июля 2017

Иногда это может быть полезно:

awkscript=$(cat << EOT
BEGIN{
    print "test"
}
{print $3}
EOT
)

df | awk "$awkscript"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...